18

ここに質問を投稿しましたが、誰も答えなかったので、クエリを遅くしている原因に焦点を当てようとしたところ、質問が頭に浮かびました。どちらがより高速で効率的ですか? 左または部分文字列?

4

5 に答える 5

20

実行計画では と に変換されるため、leftとの間にはまったく違いはありません。substringleftsubstring

例えば:

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

SQL Server はデータベースです。どの文字列処理関数が「より速い」かについては質問しません。「インデックスを使用できるのはどれですか?」という質問をします。そして「私は必要なインデックスを持っていますか?」。CPUレジスタのシフトではなく、ディスクが遅いため、データアクセスがすべてです。

では、どれがインデックスを使用できますか? (どれがsargableですか?)。理論的LEFTにはインデックスを使用できますが、実際には通常は使用しません。SUBSTRINGできません。Full TextSUBSTRINGを使用する代わりに。

sargable 式を利用するようにデータ モデルを設計し、それに応じてインデックスを作成します。それだけです、魔法の弾丸はありません。スキャンは避けてください。

于 2013-09-19T10:33:45.550 に答える