2012-04-25 6 views
0

私はプロシージャでSQLクエリを取得していますが、これは最適な結果を得るために最適化できますか?このSQLクエリを最適化することができます

SELECT DISTINCT 
     [PUBLICATION_ID] as n 
    ,[URL] as u 
    FROM [LINK_INFO] 
    WHERE Component_Template_Priority > 0 
    AND PUBLICATION_ID NOT IN (232,481) 
ORDER BY URL 

いいえ、これを使用することをお勧めします。

ありがとうございました

+1

スキーマ?インデックス? RDBMS ...? –

+0

RDBMSのみがうまくいきます...スキーマと索引付けはありません。最良の実装を探してください。 –

+1

@MS:RBDMSを記述する必要があります。私はそれの状態を調べていませんでした! –

答えて

0

NOT EXISTSを使用することは可能です。上のコードからちょうど行くべきではないでしょうが、それは技術的に可能です。原則として、非常に小さく、迅速に解決されたセット(2つのリテラルが確実に適用されます)は、NOT INISISよりNOT INとして優れたパフォーマンスを発揮します。 NOT EXISTSは、NOT INIS(最初の一致で停止する)の相関サブクエリがより迅速に解決する各行に対して、NOT INが十分な比較を行う必要がある場合に勝ちます。

これは、比較セットにNULLを含めることができないことを前提としています。そうでなければ、NOT INとNOT EXISTSは同じ結果を返しません。NOT IN(NULL、...)は常にNULLを返します。したがって、NOT EXISTSは一致する行を除外し、NULLは一致を生成しません。行を除外しません。

ミスマッチの2つのセットを比較する第3の方法は、OUTER JOINです。私たちがこれまでに得たものからそれに入る理由は見当たらないので、今はそのものを手放すつもりです。

決定的な答えは、多くの変数に依存するであろう(あなたの質問に、したがってコメント)...

  1. publication_id列のカーディナリティ(異なる値の数)は何ですか?
  2. 列にインデックスがありますか?
  3. テーブルには何行ありますか?
  4. NOT IN句の値はどこから取得しましたか?
  5. これらは常にリテラルであるか、パラメータやサブクエリから来るのでしょうか?

...などです。もちろん、最適な方法は、クエリをさまざまな方法で記述し、実行時間とクエリ計画を調べることです。

EDITもう1つは、EXCEPTのようなセット演算子です。もう一度、おそらくそれに行き過ぎるだろう。

+0

ありがとう、以下の私のコメントを参照してください:1)publication_id列の基数(異なる値の数)は何ですか? MS >> 250以上になる可能性があります 2)列にインデックスがありますか? MS >> PUBLICATION_IDのインデックスは です。3)テーブルには何行ありますか? MS >> 50000以上のレコード 4)NOT IN句のどこで値を取得しましたか? MS >>私はこれらの2つのpublication_idからの値を望んでいません。 5)それらは常にリテラルであるか、パラメータやサブクエリから来るのだろうか? MS >>常に修正してください。 お勧めします! –

+0

これらの2つだけを常に除外したい場合は、リテラルでNOT INを使用してください。これらの2つの値がテーブルの大半をフィルタリングしない限り、ほとんどすべてのテーブルを返すテーブルスキャンに対する2つの比較が得られる可能性が高いです。これらの2つの値を除外すると、ほとんどのテーブルがフィルタリングされ、別の手法を試してみるとよいでしょう。 publication_idはやや均等に分布していますか? – JAQFrost

関連する問題