SQL SERVER中的SUBSTRING与LEFT

时间:2013-09-19 10:27:58

标签: sql sql-server sql-server-2008 sql-server-2008-r2

我发布了一个问题here,但是没有人回答,所以我试着关注什么使得我的查询变得缓慢而且我想到了一个问题。 哪一个更快更有效? LEFT还是SUBSTRING?

5 个答案:

答案 0 :(得分:16)

leftsubstring之间没有任何区别,因为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