1

私はこのクエリを持っています:

select distinct somecolumn from sometable
          where something = somethingelse and
          someid not in (select anotherid from another tabele where ...);

サブセレクトが原因で、クエリの実行が非常に遅くなると思います。not in と subselect を削除できるように書き直す方法はありますか?

4

5 に答える 5

3

理論的には、はよりもNOT EXISTSわずかに最適化する必要があり、がNULLNOT IN可能である場合はより信頼性が高いはずです( SQL Serverの観点からの詳細)。私はMySQLについて十分に知らないので、このクエリがより良いかどうかを知ることができないと告白します。anotherid

SELECT somecolumn 
  FROM dbo.sometable AS s
  WHERE something = somethingelse 
  AND NOT EXISTS 
  (
    SELECT 1 FROM dbo.[another table]
    WHERE anotherid = s.someid
  );

しかし、ここでの実際のパフォーマンスの問題は、サブクエリの存在ではなく、インデックスの欠如であると思われます。sometable.somethingインデックスが付けられていますか?どうsometable.somiedですか?そして[another table].anotherid?また、DISTINCT追加の並べ替えが必要になる場合がありますが、本当に必要ですか?重複している場合は、設計上の問題を示唆している可能性があります...

于 2013-02-01T16:36:21.757 に答える
3

使用するLEFT JOIN

SELECT  someClumn
FROM    sometable a
        LEFT JOIN anotherTable b
            ON a.someID = b.anotherID 
               -- AND condition for anotherTable
WHERE   a.something = somethingelse AND
        b.anotherID IS NULL

パフォーマンスを向上させるには、列にインデックスを定義します:someIDおよびanotherID.

于 2013-02-01T16:13:42.470 に答える
3

試す

select
  distinct somecolumn

from
  sometable t1
  left join anothertable t2 on (t1.someid=t2.otherid and t2.othercondition='else')

where
  t1.something='something else'
  and t2.pk is null
;

そして t2.otherid にインデックスを付ける必要があります。

注: サブクエリの WHERE 句は JOIN 条件にあります。

于 2013-02-01T16:14:18.413 に答える
1
select somecolumn
from sometable
     LEFT JOIN another tabele
        ON someid  = anotherid
          AND (where clause from subquery)
WHERE anotherid IS NULL
    AND something = somethingelse

一対多の関係がある場合、 DISTINCT は冗長であると思います。

于 2013-02-01T16:14:09.770 に答える
0

これを試して

   select  somecolumn from sometable
      where something = somethingelse and
      someid not in (select anotherid from another tabele where ...)
      GROUP BY somecolumn;
于 2013-02-01T16:14:50.120 に答える