0

プロシージャーで以下の 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

NOT Exists を使用する方が良い方法です。

ありがとう

4

1 に答える 1

0

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

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

2 つのセットの不一致を比較する 3 つ目の方法は、OUTER JOIN を使用することです。これまでに得た情報からは、そのことに踏み込む理由がわかりません。

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

  1. publication_id 列のカーディナリティ (異なる値の数) は?
  2. 列に索引はありますか?
  3. テーブルには何行ありますか?
  4. NOT IN 句の値はどこで取得しましたか?
  5. それらは常にリテラルですか、それともパラメーターまたはサブクエリから取得されますか?

...ほんの数例を挙げると。もちろん、これを見つける最善の方法は、さまざまな方法でクエリを記述し、実行時間とクエリ プランを確認することです。

EDIT もう 1 つは、EXCEPT などの集合演算子を使用するものです。繰り返しますが、これに入るにはおそらくやり過ぎです。

于 2012-04-25T19:11:26.320 に答える