我很好奇是什么让我的查询变慢,我想到了一个问题。
哪一种更快更高效?
LEFT()
还是SUBSTRING()
?
left
和substring
之间没有任何区别,因为left
在执行计划中被翻译为substring
。
例如:
select substring(col, 1, 2),
left(col, 3)
from YourTable
在执行计划中看起来像这样
<DefinedValue>
<ColumnReference Column="Expr1004" />
<ScalarOperator ScalarString="substring([col],(1),(2))">
<Intrinsic FunctionName="substring">
<ScalarOperator>
<Identifier>
<ColumnReference Column="col" />
</Identifier>
</ScalarOperator>
<ScalarOperator>
<Const ConstValue="(1)" />
</ScalarOperator>
<ScalarOperator>
<Const ConstValue="(2)" />
</ScalarOperator>
</Intrinsic>
</ScalarOperator>
</DefinedValue>
<DefinedValue>
<ColumnReference Column="Expr1005" />
<ScalarOperator ScalarString="substring([col],(1),(3))">
<Intrinsic FunctionName="substring">
<ScalarOperator>
<Identifier>
<ColumnReference Column="col" />
</Identifier>
</ScalarOperator>
<ScalarOperator>
<Const ConstValue="(1)" />
</ScalarOperator>
<ScalarOperator>
<Const ConstValue="(3)" />
</ScalarOperator>
</Intrinsic>
</ScalarOperator>
</DefinedValue>
这是一篇好文章,如果有人感兴趣的话,它对 SUBSTRING、LIKE、CHARINDEX 和 LEFT/RIGHT 之间的性能进行了基准测试。
根据结果,在非索引列上,LEFT/RIGHT 始终比 SUBSTRING 快。
当您在谓词上使用函数时,您的引擎将被迫使用 Scan 操作而不是 Seek 操作。理论上,左派倾向于巧妙地使用索引。但是,您的引擎在执行之前仍然不知道 Left() 函数的输出。所以,Substring() 也是一样的。
如果您确实想调整查询的性能,可以将 Left() 表达式替换为 LIKE 表达式。确保末尾有 % 通配符。该表达式将使用 Index Seek(如果列上有适当的索引)。
例如,
Left(MyColumn, 2) = 'AB' >> MyColumn LIKE 'AB%'
实际上,LIKE 运算符(末尾带有 % 通配符)最终被引擎转换为逻辑查找谓词。因此,上面的 LIKE 表达式将被引擎重写如下,
MyColumn LIKE 'AB%' >> MyColumn >= 'AB' 和 MyColumn < 'AC'
对于 Substring(),你没有更好的替代方案,你必须考虑其他替代方案,例如全文。
这样的桌子
Id_num Fname Minit Lname ids
1 Karin F Josephs 3
2 Pirkko O Koskitalo 56
3 Karin F Josephs 16
4 Pirkko O Koskitalo 96
1 Karin F Josephs 3
2 Pirkko O Koskitalo 56
子串:
使用
SUBSTRING
,提供初始位置值和结束位置值。
例如:
select SUBSTRING(Fname,2,5) from new_employees
(No column name)
arin
irkko
arin
irkko
arin
irkko
左:
使用
left
仅给出您想要从左侧获得的字符数。
例如:
select left(Fname,2) from new_employees
(No column name)
Ka
Pi
Ka
Pi
Ka
Pi