ここに質問を投稿しましたが、誰も答えなかったので、クエリを遅くしている原因に焦点を当てようとしたところ、質問が頭に浮かびました。どちらがより高速で効率的ですか? 左または部分文字列?
54107 次
5 に答える
20
実行計画では と に変換されるため、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>
于 2013-09-19T11:51:21.433 に答える
17
SQL Server はデータベースです。どの文字列処理関数が「より速い」かについては質問しません。「インデックスを使用できるのはどれですか?」という質問をします。そして「私は必要なインデックスを持っていますか?」。CPUレジスタのシフトではなく、ディスクが遅いため、データアクセスがすべてです。
では、どれがインデックスを使用できますか? (どれがsargableですか?)。理論的LEFT
にはインデックスを使用できますが、実際には通常は使用しません。SUBSTRING
できません。Full TextSUBSTRING
を使用する代わりに。
sargable 式を利用するようにデータ モデルを設計し、それに応じてインデックスを作成します。それだけです、魔法の弾丸はありません。スキャンは避けてください。
于 2013-09-19T10:33:45.550 に答える