我发布了一个问题here,但是没有人回答,所以我试着关注什么使得我的查询变得缓慢而且我想到了一个问题。 哪一个更快更有效? LEFT还是SUBSTRING?
答案 0 :(得分:16)
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>
答案 1 :(得分:15)
SQL Server是一个数据库。你不问问哪个字符串处理功能“更快”。你问问题'哪些可以使用索引?'并且'我有所需的索引吗?'。所有关于数据访问,因为磁盘是懒惰的,而不是关于转移CPU寄存器。
那么,哪个可以使用索引?(哪一个是sargable?)。理论上LEFT
可以使用索引,但实际上它通常不会。 SUBSTRING
不能。而不是SUBSTRING
使用Full Text。
设计数据模型以利用sargable表达式,相应地编制索引。这就是它的全部,没有灵丹妙药。避免扫描。
答案 2 :(得分:5)
This is a good article如果有兴趣的话,它会对SUBSTRING,LIKE,CHARINDEX和LEFT / RIGHT之间的表现进行基准测试。
根据结果,在非索引列上,LEFT / RIGHT始终比SUBSTRING快。
答案 3 :(得分:2)
当您在谓词上使用函数时,您的引擎将被强制使用扫描操作而非Seek操作。理论上左派看起来很喜欢巧妙地使用索引。但是,在执行之前,您的引擎仍然不知道Left()函数的输出。因此,对于Substring()也是如此。
如果您确实希望调整查询的性能,可以使用 LIKE 表达式替换Left()表达式。确保最后的%通配符。此表达式将使用Index Seek(如果列上有适当的索引)。
实施例,
左(MyColumn,2)='AB'&gt;&gt; MyColumn LIKE'AB%'
实际上,LIKE运算符(末尾带有%通配符)最终会被引擎转换为逻辑搜索谓词。因此,上面的LIKE表达式将由引擎重写,如下所示,
MyColumn LIKE'AB%'&gt;&gt; MyColumn&gt; ='AB'和MyColumn&lt; 'AC'
对于Substring(),您没有更好的替代品,您必须考虑其他替代品,如全文。
答案 4 :(得分:0)
这样的表
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