1

このクエリのパフォーマンスを改善する必要があります。

Select 
   t1.column1, t1.column2 
From
   table1 t1, table2 t2
Where 
   t1.id = t2.id and
   t1.some_column = t2.some_column
--------
minus
--------
Select 
   t1.column1, t1.column2 
From
   table1 t1, table2 t2, table3 t3
Where 
   t1.id = t2.id and
   t1.some_column = t2.some_column and
   t1.id = t3.id

「マイナス」の代わりに「存在しない」を使用してこのクエリを書き直そうとしています。誰かが私にアドバイスをくれますか?

4

2 に答える 2

5

これはどう?

Select 
   t1.column1, t1.column2 
From
   table1 t1, table2 t2
Where 
   t1.id = t2.id
   and t1.some_column = t2.some_column
   and not exists (select 1 from table3 t3 where t1.id = t3.id)
于 2012-10-03T10:07:40.723 に答える
5

これは、最初のクエリと table3 の間の比例サイズ/行数によって異なります。

  • table3 に多くの行がある場合は、おそらく @bpgergo ソリューションを使用します。これは、exceptクエリを回実行するだけでよく、高速であるためです (id にインデックスがあると仮定します)。
  • table3 の行数が少ない場合は、次の解決策を使用します。これは、サブクエリを一度にすべて実行して、メモリ キャッシュで照合を行うことができるためです。
SELECT t1.column1, t1.column2
FROM table1 t1, table2 t2
WHERE t1.id = t2.id
AND t1.some_column = t2.some_column
AND t1.id NOT IN (SELECT t3.id FROM table3 t3);

どちらのソリューションも、各テーブル列のインデックスを利用できます。その場合は、最初のクエリをフィルター処理するために使用される列idの追加のインデックス (または を含む複合インデックス) を利用できます。id

于 2012-10-03T10:36:00.653 に答える