0

次のようなクエリがあります。

SELECT Distinct(ContKey)
FROM Point
WHERE Created > 1245750191000
  AND Created < 1345753791000
  AND ContainerId='abcd'

クエリの目的は、範囲を含むいくつかの基準に基づいて、テーブル "Container" のフィールド "Key" にマップされるすべての個別の ContKey 値を取得することです。

動作が非常に遅いです。関連するフィールドとフィールドの組み合わせに関するインデックスがあるため、インデックス作成の問題ではないと確信しています。何百万もの行がある私のデータベースでは、このクエリは 69,338 の結果を返すのに 300 秒かかります。遅すぎる!

DISTINCT句を削除するためにクエリを書き直そうとしています。私はこれを思いつきました:

SELECT Key
FROM Container t
WHERE t.ContainerId = 'abcd'
  AND EXISTS( SELECT 1
              FROM Point
              WHERE Created > 1245750191000
                AND Created < 1345753791000
                AND ContainerId = t.ContainerId )

はるかに高速に実行されます (1 秒未満)。しかし、それ以上の結果を生み出します。正確には72,330です。この書き直しは何か間違っていますか?私がやろうとしていることに基づいて、クエリを改善できることを願っています。

ありがとう。

4

1 に答える 1

1

関連するフィールドとフィールドの組み合わせに関するインデックスがあるため、インデックス作成の問題ではないと確信しています。

つまり、必要なインデックスがわからないので、考えられるすべてのものにインデックスを追加しただけですか? さまざまな複数列のインデックスと列の順列をすべて考慮すると、多くの組み合わせが考えられます。何をしているのかを理解していなければ、正しいインデックスを追加していない可能性が非常に高いです。

最も選択的な列をインデックスの最初に配置する必要があります。ContainerIdこの場合、おそらく最も選択的であるように見えます。この複数列のインデックスを追加してみてください:

(ContainerId, CreatedId, ContKey)

繰り返しますが、インデックス内の列の順序は重要です。同じ列のインデックスを異なる順序で作成すると、異なるパフォーマンス特性が得られる可能性があります。

于 2012-08-24T21:26:44.773 に答える