web-dev-qa-db-ja.com

SQLサーバーのSUBSTRINGとLEFT

私は質問を投稿しました ここ ですが、誰も回答しなかったので、クエリを遅くしている原因に焦点を合わせようとしたところ、質問が頭に浮かびました。 どちらがより速く、より効率的ですか? LEFTまたはSUBSTRING?

15
Dhwani

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

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

検索可能な式を利用するようにデータモデルを設計し、それに応じてインデックスを作成します。これですべてです。魔法の弾丸はありません。スキャンを避けます。

16
Remus Rusanu

実行プランではleftsubstringに変換されるため、leftsubstringにはまったく違いがありません。

例えば:

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>
17
Mikael Eriksson

これは良い記事です 誰かが興味を持っている場合、SUBSTRING、LIKE、CHARINDEX、およびLEFT/RIGHT間のパフォーマンスのベンチマークになります。

結果によると、インデックス付けされていない列では、LEFT/RIGHTはSUBSTRINGよりも一貫して高速です。

4
user3810900

述語で関数を使用すると、エンジンは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
0
Vinoth_S