SQL SERVER中的SUBSTRING与LEFT

Dhw*_*ani 13 sql sql-server sql-server-2008 sql-server-2008-r2

我在这里发了一个问题,但是没有人回答,所以我试着把注意力集中在让我的查询变得缓慢的问题上.哪一个更快更有效?左或后点?

Mik*_*son 17

没有差异可言之间leftsubstring因为left被转换为substring执行计划.

例如:

select substring(col, 1, 2),
       left(col, 3)
from YourTable
Run Code Online (Sandbox Code Playgroud)

在执行计划中看起来像这样

<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>
Run Code Online (Sandbox Code Playgroud)


Rem*_*anu 16

SQL Server是一个数据库.你不问问哪个字符串处理功能"更快".你问问题'哪些可以使用索引?' 并且'我有所需的索引吗?'.所有关于数据访问,因为磁盘是sloooooow,而不是关于转移CPU寄存器.

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

设计您的数据模型以利用sargable表达式,相应地编制索引.这就是它的全部,没有灵丹妙药.避免扫描.

  • LEFT 和 SUBSTRING(FROM 1 FOR n) 都应该能够使用类似于 LIKE 'xxxx%' 的索引访问。当然,前提是它是一种按排序顺序携带实际数据的索引。并且优化器必须足够聪明才能使用它:-) (2认同)
  • 我同意,如果您想搜索文本的完整或未定义部分,请使用全文搜索。如果您始终想要搜索前 n 个(其中 n 已知且为常数),请创建一个单独的列(可能是经过计算的列)。对单独的列建立索引,并且不要使用 FTS、LEFT 或 SUBSTRING。 (2认同)

小智 9

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

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