22

一連のアイテムがあるとしましょう:

  • アイテム1
  • アイテム2
  • アイテム3
  • アイテム4
  • アイテム5

クエリは 2 つの方法で作成できます。まず:

SELECT * 
FROM TABLE 
WHERE ITEM NOT IN ('item1', 'item2', 'item3', 'item4','item5')

または、次のように記述できます。

SELECT * 
FROM TABLE 
WHERE ITEM != 'item1' 
  AND ITEM != 'item2' 
  AND ITEM != 'item3' 
  AND ITEM != 'item4' 
  AND ITEM != 'item5'
  1. どちらがより効率的で、その理由は何ですか?
  2. 一方が他方よりも効率的になるのはどの時点でしょうか? つまり、500 個のアイテムがあった場合はどうなるでしょうか。

私の質問は特に PostgreSQL に関するものです。

4

2 に答える 2

12

@Jayramが受け入れた元の回答には多少同意しません。

特に、リンクは SQL Server 用であり、他の多くの記事や回答と矛盾しています。また、サンプル テーブルにはインデックスがありません。

通常、サブクエリの SQL 構造の場合

  • <>(または!=) はスカラー比較です
  • NOT IN左半結合関係演算子です

もっと簡単に言えば

  • NOT INインデックスを使用できる JOIN の形式になります (PostgreSQL を除く!)
  • !=多くの場合、SARGable ではなく、インデックスが使用されない場合があります

これについては、dba.se: 「索引に関する NOT ロジックの使用」で説明されています。PostgreSQL については、このExplainextended の記事で内部の詳細が説明されています (残念ながら、NOT IN を含む定数のリストについては説明されていません)。

いずれにせよ、定数のリストについては、読みやすく、@CraigRinger が説明したことから、一般的にNOT INbeforeを使用します。<>

サブクエリの場合NOT EXISTSは、行く方法です

于 2013-06-11T07:25:09.550 に答える