私は非常にslooowwwwwクエリを持っています。SQL Serverサブクエリを使用するクエリが遅い
それはちょっと、このように、複合基準で、顧客レコードを選択:
表はCustomers
を持って、別のテーブルには、別のテーブルにはCustomerMotorcycles
を持って、CustomerCars
を持っています。
お客様は1台以上の車を所有できます。顧客が商用ビジネスであり、顧客の車のいずれかがフォードである場合、その顧客を選択から除外したい。
顧客は1つ以上のオートバイを所有することもできます。お客様が小売業で、オートバイのいずれかがハーレーの場合、その顧客を除外します。
だから私はのような文があります。
SELECT *
FROM CUST
WHERE
(CUST.CUSTTYPE = 'COMM'
AND CUST.CUSTID NOT IN (SELECT CUSTCARS.CUSTID
FROM CUSTCARS
WHERE CUSTCARS.CAR = 'FORD'))
OR
(CUST.CUSTTYPE = 'RETAIL'
AND CUST.CUSTID NOT IN (SELECT CUSTCYCLES.CUSTID
FROM CUSTCYCLES
WHERE CUSTCYCLES.CYCLE = 'HARLEY'))
をこれが遅いクレイジー実行されます。
これは現在、一時テーブルにデータをダンプし、不要なレコードを削除するためにいくつかの他のクエリが実行される一連の個別のクエリとして実行されていますが、非常に面倒です。
提案がありますか?助けてくれてありがとう!
を我々は、nよテーブルとインデックスの詳細、および低速クエリのクエリプランを使用して、正確なアドバイスを提供することができます。 –
exは簡略化され、すべてを書き出すには多くの時間がかかります...フィールドはnvarcharsでインデックスされています。 より良い構文があるのでしょうか。 JOINはWHERE節より優れていますか?そして、私はcase文を試しました。 TYPE = 'COMM'、CAR = 'FORD' N 'THERM'TYPE = 'RETAIL'そしてCYCLE = 'HARLEY' 'THEN' N 'の場合 ELSE' Y ' END AS KEEP それからKEEP = 'Y' しかし、これは正しいレコードを除外していませんでした。顧客がフォードとシェビーを抱えていた場合、彼は1つのレコードがフォードではなかったので選択されました...しかし、他のどの車種であっても、フォードを持っている人はいません。 –