1
SELECT 
    T2.Entity1Id, T1.Entity1Id  
FROM 
    T1  
FULL OUTER JOIN 
    T2 ON T1.c2 = T2.c2 AND T1.c1 = T2.c1 AND T1.c3 = 1
WHERE 
    ((T1.c1 = 123 ) OR (T2.c1 = 123))  
    AND (T1.c3 = 1 OR T1.c3 IS NULL)

上記のクエリは SQL Server 2014 で 12 秒かかります。クエリを調整するアイデアはありますか? C1、C2、C3 列にインデックスがあります。

観察: 上記のクエリで、OR から条件を削除すると (つまり、

SELECT  
    T2.Entity1Id, T1.Entity1Id  
FROM 
    T1  
FULL OUTER JOIN 
    T2 ON T1.c2 = T2.c2 AND T1.c1 = T2.c1  AND T1.c3 = 1
WHERE 
    (T1.c1 = 123) AND (T1.c3 = 1 OR T1.c3 IS NULL)

次に、0秒で結果を返します。

各テーブルには約 500,000 のレコードがあります。

4

1 に答える 1

1

まず、最終条件(T1.c3 = 1 OR T1.c3 IS NULL)は冗長です。条件を考えるとjoin、これらは唯一の可能な値です。したがって、クエリは次のとおりです。

SELECT T2.Entity1Id, T1.Entity1Id  
FROM T1 FULL OUTER JOIN
     T2
     ON T1.c2 = T2.c2 AND T1.c1 = T2.c1  AND T1.c3 = 1
WHERE (T1.c1 = 123 ) OR (T2.c1 = 123)

これでパフォーマンスが良くない場合は、これを 2 つのクエリに分割することを検討してください。

SELECT T2.Entity1Id, T1.Entity1Id  
FROM T1 LEFT JOIN
     T2
     ON T1.c2 = T2.c2 AND T1.c1 = T2.c1  AND T1.c3 = 1
WHERE T1.c1 = 123
UNION 
SELECT T2.Entity1Id, T1.Entity1Id  
FROM T2 LEFT JOIN
     T1
     ON T1.c2 = T2.c2 AND T1.c1 = T2.c1  AND T1.c3 = 1
WHERE T2.c1 = 123

個別のサブクエリの最適化は、full outer join.

于 2015-08-05T11:20:37.160 に答える