TA
2 つの列C1
&を持つテーブルがありますC2
。TA には 1 億以上の行があります。DISTINCT
で行をフェッチするクエリを実行しますC1 WHERE LEFT(C2, 5) = 'XXXXX'
。パフォーマンスの問題に直面しています。個別のデータを取得するのに数秒かかります。
このクエリのパフォーマンスを向上させるにはどうすればよいですか?
TA
2 つの列C1
&を持つテーブルがありますC2
。TA には 1 億以上の行があります。DISTINCT
で行をフェッチするクエリを実行しますC1 WHERE LEFT(C2, 5) = 'XXXXX'
。パフォーマンスの問題に直面しています。個別のデータを取得するのに数秒かかります。
このクエリのパフォーマンスを向上させるにはどうすればよいですか?
テーブルに新しいテキスト列を追加しUPDATE
、結果をその列に入れるクエリを実行しLEFT(C2, 5)
ます。列にインデックスを付け、新しいクエリを実行しますWHERE new_column = 'XXXXX'
。
一般に、WHERE 句で文字列関数を使用することは望ましくありません。
C2 がインデックス化されているかどうかは言及しません。少なくともインデックスが作成されている場合は、条件に一致するかどうかを確認するために、テーブル内のすべての行を読み取る (スキャン) 必要なく、インデックスに対して関数を適用できます。
持っている列にインデックスを付けて、次のようなことを試みることもできます。
where c2 >= 'XXXXX' and
c2 < 'XXXXY'
または:
where c2 >= 'XXXXX' and
c2 <= 'XXXXXZ'
アイデアは、クエリを列の関数から範囲に切り替えることです。インデックスがある場合、範囲フィルターは列のインデックスを使用できます。