2017-03-07 3 views
-2

私はクエリを行うSQL Server 2016でテーブル(Aと呼ぶ)を持っています。私は決定的なステータスを持つ行だけを選択する必要があるので、いくつかの行を除外する必要があります。テーブルAのレコードidとcol1とcol2の2つのカラムを含む別のテーブル(B)があります。これらの列が空でない場合、対応するレコードは最終とみなされます。テーブルAとテーブルBの間には1対1の関係があります。これらのテーブルはかなり大きいので、最も効率的なクエリを使用したいと考えています。私はどちらを選ぶべきですか?このSQLクエリを実行する最も速い方法はどれですか?

SELECT * 
FROM TableA 
WHERE record_id IN 
    (SELECT record_id FROM TableB WHERE col1 IS NOT NULL AND col2 IS NOT NULL) 

SELECT a.* 
FROM TableA a 
INNER JOIN TableB b ON a.record_id = b.record_id 
WHERE b.col1 IS NOT NULL AND b.col2 IS NOT NULL 

SELECT a.* 
FROM TableA a 
INNER JOIN TableB b 
ON a.record_id = b.record_id 
    AND b.col1 IS NOT NULL 
    AND b.col2 IS NOT NULL 

私が考えていなかったより速い方法があれば、もちろん共有してください。また、なぜ1つのクエリが他のクエリより速いのかを知りたいのは非常に興味があります。

+2

Eric Lippertの優れた[どちらが速いのですか?](https://ericlippert.com/2012/12/17/performance-rant/)を読んでください: "...あなたは2頭の馬がいて、馬の短い説明を書いたり、インターネット上に投稿したり、ランダムな見知らぬ人にもっと速いかどうかを尋ねたりしないでください... " –

+2

あなたはそれを試してみてどうですか?でる? –

+0

私はしましたが、結果は異なります。差はかなり重要です(〜20%)が、より速いクエリは常に同じではありません。 –

答えて

0
WITH cte AS 
(SELECT b.record_id, b.col1, b.col2 
FROM TableB b 
WHERE col1 IS NULL 
AND col2 IS NULL --if the field isn't NULL, it might be quicker to do <> '') 

SELECT a.record_id, a.identifyColumnsNeededExplicitely 
FROM cte 
JOIN TableA a ON a.record_id = cte.record_id 
ORDER BY a.record_id 
+0

なぜCTEがここでパフォーマンスを向上させるのでしょうか? –

+0

実際には、FROM cteの代わりにFROM tableAというクエリを実行することを検討してください。それは速くなるはずです。 CTEはテーブル(すでにフィルタリングされた)をmemに格納することができます(最も重要なのは、一度だけ読み込むことです)。次のステップでは、実行計画を使用して、非効率的な表を索引付け/再索引付けします。 – WickedFan

0

実際に実行計画は、それが(行の別名数/あなたの行の一般的なcontaint/...)あなたの現在のインデックス/クラスタ化インデックス/外部キー/制約/テーブルstasticsに応じて好きなものは何でもします。どの分析もケースごとに行う必要があり、2つのテーブルが真であるのは2つの他のテーブルではない可能性があります。

Theorically、任意のインデックスなし

は、最初のものは、それが2あらわす定数は、TableBの上を走査し、1台は、表1にスキャンし、テーブルBに1つのテーブルスキャンと操作の最適化を行いますので、最高でなければなりません。

TableB.record_idを参照するTableA.record_idの外部キーまたは両方の列のインデックスを使用すると、スキャンインデックスと2つの定常スキャンを行うため、2番目の方が高速になります。

まれに、TableBの統計情報に応じて3番目のものになることがあります。しかし、数字3はすべてのTableBをスキャンするので、数字2から遠くない。さらに稀場合

、私が言うことをtryngてる何3.

のでもない:「私たちはあなたのテーブルや行もないを持っていないので、あなたのSQLの管理を開いて、ON統計情報を入れて、自分で試してみてください。

関連する問題