私は質問を投稿しました ここ ですが、誰も回答しなかったので、クエリを遅くしている原因に焦点を合わせようとしたところ、質問が頭に浮かびました。 どちらがより速く、より効率的ですか? LEFTまたはSUBSTRING?
SQL Serverはデータベースです。どの文字列処理関数が「高速」であるかについては質問しません。 「インデックスを使用できるのはどれですか」という質問をします。および「必要なインデックスはありますか?」ディスクは非常に遅いので、CPUレジスタをシフトするのではなく、データアクセスがすべてです。
したがって、どちらがインデックスを使用できますか?(どれが sargable ?)です。理論的にはLEFT
はインデックスを使用できますが、実際には通常は使用しません。 SUBSTRING
はできません。 SUBSTRING
の代わりに Full Text を使用します。
検索可能な式を利用するようにデータモデルを設計し、それに応じてインデックスを作成します。これですべてです。魔法の弾丸はありません。スキャンを避けます。
実行プランでは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>
これは良い記事です 誰かが興味を持っている場合、SUBSTRING、LIKE、CHARINDEX、およびLEFT/RIGHT間のパフォーマンスのベンチマークになります。
結果によると、インデックス付けされていない列では、LEFT/RIGHTはSUBSTRINGよりも一貫して高速です。
述語で関数を使用すると、エンジンはSeek操作よりもScan操作を強制的に使用します。理論的には、Leftはインデックスをスマートに使用することを支持しています。ただし、エンジンは、実行されるまでLeft()関数の出力を認識しません。したがって、Substring()についても同じです。
クエリのパフォーマンスを本当に調整したい場合は、Left()式を[〜#〜] like [〜#〜]式。末尾に%ワイルドカード文字があることを確認してください。この式は、インデックスシークを使用します(列に適切なインデックスがある場合)。
例、
Left(MyColumn、2)= 'AB' >> MyColumn LIKE 'AB%'
実際、LIKE演算子(末尾に%ワイルドカード文字を含む)は、最終的にエンジンによって論理シーク述語に変換されます。したがって、上記のLIKE式は、エンジンによって次のように書き換えられます。
MyColumn LIKE 'AB%' >> MyColumn> = 'AB'およびMyColumn <'AC'
Substring()の場合、これに代わる方法はなく、フルテキストのような他の代替案を考える必要があります。
このようなテーブル
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