2017-06-22 18 views
1

これは動作するMySQLクエリです。これをパフォーマンスを向上させるために単一のフラット・ジョイン・クエリに変換できますか?以下のサブクエリを使用するのではなく。おかげクエリをサブクエリに変換する

SELECT * from catAtt ca LEFT JOIN att a ON ca.attId = a.attId 
WHERE ca.catId = 53 AND a.attCatId = 
(
SELECT DISTINCT eav.catId FROM ent LEFT JOIN eav ON ent.entId = eav.entId 
WHERE ent.key = 'somekey' 
) 

答えて

2

まず、クエリを簡略化することから始めます。あなたのleft joinは、where句のために本当に内部結合です。また、サブクエリではselect distinctは不要です。 catAtt(catId, attId)att(attId, attCatId)ent(key, entId)、およびeav(entId, catId)

select ca.*, att.* 
from catAtt ca join 
    att a 
    on ca.attId = a.attId 
where ca.catId = 53 and 
     a.attCatId = (select eav.catId 
        from ent join 
         eav 
         on ent.entId = eav.entId 
        where ent.key = 'somekey' 
        ); 

これは、インデックスの使用を示唆しています。

whereのサブクエリをfromに移動することもできます。それがパフォーマンスに大きな影響を与えるとは思いません。相関関係はないため、一度実行され、単一の値が返されます。

+0

OK、内部結合と左結合を指摘してくれてありがとう、私は不必要にそれの目的を忘れる左結合を使用しています。だから私はそこに1つのクエリにクエリを行う方法はないと思う。ありがとう。私は、これを瑕疵を修正するための答えとしてマークします。 – William

0
SELECT * from catAtt ca 
LEFT JOIN att a ON ca.attId = a.attId 
INNER JOIN 
(
    SELECT DISTINCT eav.catId FROM ent 
    LEFT JOIN eav ON ent.entId = eav.entId 
    WHERE ent.key = 'somekey' 
)Z ON a.attCatId = Z.catId 
WHERE ca.catId = 53 

コードの上お試しください。

希望すると、これが役立ちます。

+0

これはパフォーマンスを改善しますか? – Pasetchnik

+1

インデックスを確認しましたか?索引の存在は、ジョインまたはサブクエリの順序よりもパフォーマンスに大きな影響を与えます。データベースエンジンは、パフォーマンスを最適化するためにジョインとサブクエリを並べ替えることがよくありますが、必要なインデックスがない場合は、何も最適化できません。 –

0

SQL Serverで3種類のクエリを試しました。

SELECT * from catAtt ca JOIN att a ON ca.attId = a.attId 
WHERE ca.catId = 53 AND a.attCatId = 
(
SELECT DISTINCT eav.catId FROM ent LEFT JOIN eav ON ent.entId = eav.entId 
WHERE ent.key = 'somekey' 
) 

SELECT * from catAtt ca 
JOIN att a ON ca.attId = a.attId 
JOIN 
(
    SELECT DISTINCT eav.catId FROM ent 
    LEFT JOIN eav ON ent.entId = eav.entId 
    WHERE ent.key = 'somekey' 
)Z ON a.attCatId = Z.catId 
WHERE ca.catId = 53 

SELECT * from catAtt ca JOIN att a ON ca.attId = a.attId 
WHERE ca.catId = 53 AND 
EXISTS 
    (
    SELECT 1 FROM ent LEFT JOIN eav ON ent.entId = eav.entId 
    WHERE ent.key = 'somekey' AND a.attCatId = eav.catId 
    ) 

そして、すべてのクエリのクエリコストは同じ33%です。

私たちよりもスマートなデータベースだと思います。

+0

興味深いことに、3番目のクエリでも、EXECプランに「Distinct Sort」があります。 – Pasetchnik

関連する問題