18

我在这里发布了一个问题,但没有人回答,所以我试图集中注意力是什么让我的查询变慢并且一个问题出现在我的脑海中。哪一个更快更高效?LEFT 还是 SUBSTRING?

4

5 回答 5

20

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>
于 2013-09-19T11:51:21.433 回答
17

SQL Server 是一个数据库。您不会问哪个字符串处理功能“更快”的问题。您会问“哪个可以使用索引?” 和“我有所需的索引吗?”。都是关于数据访问的,因为磁盘很慢,而不是移动 CPU 寄存器。

那么,哪个可以使用索引呢?(哪一个是sargable?)。理论上LEFT可以使用索引,但实际上通常不会。SUBSTRING不能。而不是SUBSTRING使用全文

设计您的数据模型以利用可搜索表达式,并相应地索引。仅此而已,没有灵丹妙药。避免扫描。

于 2013-09-19T10:33:45.550 回答
10

如果有人感兴趣,这是一篇很好的文章,它对 SUBSTRING、LIKE、CHARINDEX 和 LEFT/RIGHT 之间的性能进行了基准测试。

根据结果​​,在非索引列上,LEFT/RIGHT 始终比 SUBSTRING 快。

于 2015-10-08T06:24:12.857 回答
2

当您在谓词上使用函数时,您的引擎将被迫使用 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() 你没有更好的替代品,你必须考虑其他替代品,比如全文。

于 2013-09-19T11:01:12.833 回答
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
于 2014-03-28T06:25:27.830 回答