0

400 万レコードのテーブルに自己結合クエリがあります...クエリを最適化するにはどうすればよいですか...クエリは最大日付で行をフェッチする必要があります

  SELECT DISTINCT d1.C1 AS c1, d1.C2 AS c2, d1.C3 AS c3,
         d1.datedm_id AS c4 FROM TABLEA d1 LEFT OUTER JOIN TABLEA d2 
         ON (d1.C1 = d2.C1 AND d1.C2 = d2.C2 AND d1.datedm_id < d2.datedm_id ) 
         WHERE d2.C1 IS NULL AND d2.C2 IS NULL

現在、このクエリの実行には非常に時間がかかります

EXPLAINは以下を示します

d1 4051368  Using index; Using temporary
d2 1    Using where; Using index; Not exists; Distinct
4

2 に答える 2

0

このクエリを最適化するには、 にインデックスを作成しtableA(C1, C2, datedm_id)ます。

次のように書き換えることができます。

SELECT d1.C1 AS c1, d1.C2 AS c2, d1.C3 AS c3, d1.datedm_id AS c4
FROM TABLEA d1
WHERE not exists (select 1
                  from TABLEA d2 
                  where d1.C1 = d2.C1 AND d1.C2 = d2.C2 AND d1.datedm_id < d2.datedm_id
                 );

このバージョンでは必ずインデックスを使用する必要があります。最初のバージョンを使用する必要がありますが、すべての状況でそうであるとは限りません。

于 2013-08-20T15:17:05.853 に答える