如果在连接列上使用 SQL 转换,为什么会很昂贵?

Срб*_*рба 5 performance

我看到 sql join 内部函数总是在三个基本操作中的一些操作上运行:嵌套循环 join、merge joinhash join

从互联网上的多篇文章中,我看到 SQL 转换据说能够严重影响性能,而且几乎总是因为它禁用了索引使用。

但对我来说,它看起来总是可以避免的:铸造可以禁用合并连接的使用(并从索引使用中获得合并的好处)但是散列连接,据说通常比合并更快,仍然可以以相同的方式使用(看起来我)。无论在散列连接(构建探针)转换的哪个阶段应用,所有必须额外完成的工作是在散列之前对所转换的列进行转换。

无论如何,散列连接通过第一个表的每一行一次,与第二个表相同。因此,从我的角度来看,应用于散列连接的连接列的转换对性能没有影响,但对转换操作本身没有影响。互联网上的人说因为不能使用索引,所以选角会严重影响性能?

我上面的想法有问题吗?谢谢你的时间

JNK*_*JNK 3

CAST或任何其他函数在JOIN条件中使用时都很昂贵,因为它使转换后的列不可SARGable。

在运行该函数之前,数据库无法知道该函数的输出是什么。CAST对于您编写的执行一些奇特的字符串操作逻辑的 UDF 来说也是如此。

不可SARGable 的条件意味着数据库无法使用搜索参数来查找值 - 它必须在与查询中其他条件匹配的每一行上运行它。

因此,应尽可能避免在任何过滤逻辑 - 子句等中使用函数JOINWHERE因为它本质上会强制执行表/索引扫描。

  • 但这在某种程度上取决于“CAST”和优化器的实现。例如,原则上将“datetime”列转换为“date”或将“int”转换为“bigint”不一定会阻止查找。理论上它也不会阻止索引在没有排序的情况下用于合并连接。 (3认同)