我在这里发布了一个问题,但没有人回答,所以我试图集中注意力是什么让我的查询变慢并且一个问题出现在我的脑海中。哪一个更快更高效?LEFT 还是 SUBSTRING?
5 回答
There is no difference at all between left
and substring
because left
is translated to substring
in the execution plan.
For example:
select substring(col, 1, 2),
left(col, 3)
from YourTable
will look like this in the execution plan
<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 看起来更喜欢巧妙地使用索引。但是,在执行之前,您的引擎仍然不知道 Left() 函数的输出。所以,对于 Substring() 也是一样的。
如果您真的想调整查询的性能,可以将 Left() 表达式替换为LIKE表达式。确保末尾有 % 通配符。此表达式将使用 Index Seek(如果您在列上有适当的索引)。
例子,
Left(MyColumn, 2) = 'AB' >> MyColumn LIKE 'AB%'
实际上,LIKE 运算符(末尾带有 % 通配符)最终被引擎转换为逻辑搜索谓词。因此,上面的 LIKE 表达式将被引擎重写如下,
MyColumn LIKE 'AB%' >> MyColumn >= 'AB' and 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
子串:
Using Substring give the initial position values and End position values.
例如:
select SUBSTRING(Fname,2,5) from new_employees
(No column name)
arin
irkko
arin
irkko
arin
irkko
剩下:
using Substring give only how many char you want from LEFT Side.
例如:
select left(Fname,2) from new_employees
(No column name)
Ka
Pi
Ka
Pi
Ka
Pi