0

次のような1つの列を照会しています

select * 
  from X1, X2, X3
 where X1.a = X2.a 
   and X2.b = X3.b 
   and X3.c IN ('c1a','c1b','c1c') 

このような c1% の値は約 10 個あります。

別のクエリは次のとおりです。

select * 
  from X1, X2, X3
 where X1.a = X2.a 
   and X2.b = X3.b 
   and X3.c like 'c1%'

ここでは、テーブル X3 にインデックスが付けられていますc

2 つのクエリの意味が異なることは理解していますが、私のユースケースでは同じ結果が返されます。どのクエリがより高速になるかを知りたいです (たとえば、インデックスが使用されない場合など、それは重要ですか)?

4

1 に答える 1

4

"どちらのクエリが高速になりますか"

... 答えられる質問ではありません。有益な情報を提供していないからです。クエリのパフォーマンスは、主にボリュームとスキューの 2 つの要因に左右されます。

ボリュームの意味:

  • X1 の行数は?
  • X2 には何行ありますか?
  • X3 には何行ありますか?

スキューとは:

  • X1 の何行が X2 の行と一致しますか?
  • X2 の何行が X3 の行と一致しますか?
  • 'c1%' に一致する C の値を持つ X3 の行はいくつありますか?

そのため、データベースがデータの分布を理解し、適切な実行計画を考案できるように、統計を収集することが重要です。

たとえば、X1 が小さなテーブルで、X2 の行とほとんど一致せず、X2 が X3 の行とほとんど一致しない場合、アクセス パスは「X1 -> X2 -> X3」となり、C の値は単にフィルタリングされるだけなので、どのように指定しても構いません。

一方、X1 と X2 と大きなテーブルがあり、多くの行に一致する場合、X3.C が最適なアクセス パスである可能性が高いため、クエリをどのように構成するかが非常に重要です。オプティマイザーがインデックスを使用する可能性が最も高いオプション(それがより良い計画である場合) またはインデックスを使用しない (それがより良い計画である場合)?

INオプティマイザーが操作のためにインデックスを使用することを選択する可能性が高いと思いますLIKEしかし、私が今知っている以上にあなたのデータベースについて知らなければ、私はそれに多額のお金を投資することはできません.

「たとえば、ある場合にはインデックスが使用されない可能性があることは重要ですか」

もちろん。インデックス付きの読み取りは、必要なデータを取得するためのより高速な方法です。ただし、フル テーブル スキャンよりも遅くなる可能性もあります。ここでもデータ分散についてです。テーブルの行の何パーセントが返されるのでしょうか? 1 ~ 2% を超える場合は、インデックスよりも高速なアクセス パスが存在する可能性があります。この場合、インデックスをオンX3(c, b)にすると優れたパフォーマンスが得られますが (残念ながら、個々のクエリに合わせて常にインデックスを作成できるとは限りません)。

于 2012-12-18T13:44:36.560 に答える