2017-02-09 6 views
0

バージョン1SQL SELECT ...

INSERT INTO table_a (col_1, col_2) 
SELECT DISTINCT col_1, col_2 
FROM table_b b 
WHERE b.col_1 IS NOT NULL 
AND b.col_2 IS NOT NULL 
AND b.id NOT IN 
(
SELECT b.id 
FROM table_b b 
JOIN table_a a WITH(NOLOCK) 
ON b.col_1 = a.col_1 
AND b.col_2 = a.col_2. 
) 

バージョン2

SELECT * INTO #temp FROM 
(
SELECT DISTINCT col_1, col_2 
FROM table_b 

WHERE b.col_1 IS NOT NULL 
AND b.col_2 IS NOT NULL 
AND b.id NOT IN 
(
SELECT b.id 
FROM table_b b 
JOIN table_a a WITH(NOLOCK) 
ON b.col_1 = a.col_1 
AND b.col_2 = a.col_2 
)) t 

INSERT INTO table_a (col_1, col_2) SELECT col_1, col_2 FROM #temp 

COL_1:varchar型 col_2:varchar型

table_a:主キーシーケンシャルにクラスタ化col_1で一意のクラスタ化されていないIDはcol_2を含み、col_2では一意にクラスタ化されていません。col_1

バージョン1 I/O

テーブル 'table_b'。スキャンカウント34、論理読取り118、物理読取り0、読取り先読み0、論理読取り0、論理読取り0、論理読取りLOB先読み0を含む。 表 'table_a'。スキャンカウント0、論理読取り109404、物理読取り8761、先読み読取り7761、論理読取り0、論理読取り0、論理読取りLOB先読み0を含む。 表「ワークテーブル」。走査カウント0、論理的、物理0を読み出し、0を読み取り、先読み0を読み取り、ロブ論理は、ロブの物理0を読み出し、0を読み取る先読みは0

(4997行(s)は影響を受けた)

を読み出しロブ

バージョン2 I/O

テーブル 'table_b'。スキャンカウント34、論理読取り118、物理読取り0、読取り先読み0、論理読取り0、論理読取り0、論理読取りLOB先読み0を含む。 表 'table_a'。スキャンカウント0、論理読み取り35454、物理読み取り0、先読み読み取り5435、先読み読み取り5435、論理読み取り0、論理読み取り0、読み取り先読みLOB 0を読み取る。 テーブル '#temp _______________________________________________________________________________________________________________ 00000044D848'。スキャンカウント0、論理読取り5045、物理読取り0、読取り先読み0、論理読取り0、論理読取り0、論理読取りLOB先読み0を含む。 表「ワークテーブル」。走査カウント0、論理的、物理0を読み出し、0を読み取り、先読み0を読み取り、ロブ論理は、ロブの物理0を読み出し、0を読み取る先読みは0

(4994行(s)は影響を受けた)

を読み出しロブ

(1行が該当) テーブル 'table_a'。スキャンカウント0、論理読取り105486、物理読取り331、先読み読取り5940、論理読取り0、論理読取り0、論理読取りLOB先読み0を含む。 表「ワークテーブル」。スキャンカウント2、論理読取り10412、物理読取り0、読取り先読み0、論理読取り0、論理読取り0、論理読取り0、読込み先読み0である。 テーブル '#temp _______________________________________________________________________________________________________________ 00000044D848'。スキャンカウント1、論理的、物理的には0を読み取り、52を読み取り、先読み0を読み取り、ロブ論理は、ロブの物理0を読み出し、0を読み取る先読みは0

(4994行(s)は影響を受けた)

を読み出しロブ

バージョン1はバージョン2よりもかなり遅いです。物理的な読み込み回数が多いためです。

物理的な読み取り回数が非常に異なる理由は明らかですが、表面的には両方のバージョンが同じ作業をしているように見えます。

私はホットとコールドとキャッシュでこれらの多くの時間を実行し、両方のバージョンで一貫した動作が見られました。

+0

クエリ計画http://imgur.com/a/lBpS0 –

答えて

0

あなたが別のクエリを試すことができますねえ、

--remove distinceそれが出力を必要とする与えているなかでも

SELECT DISTINCT col_1, col_2 
FROM table_b b 
WHERE b.col_1 IS NOT NULL 
AND b.col_2 IS NOT NULL 
AND not exists 
(
SELECT a.id 
FROM table_a a WITH(NOLOCK) 
where b.col_1 = a.col_1 
AND b.col_2 = a.col_2. 

) 
--2nd query 
SELECT DISTINCT b.col_1, .col_2 
FROM table_b b 
JOIN table_a a WITH(NOLOCK) 
ON b.col_1 = a.col_1 
AND b.col_2 = a.col_2 

を必要としていない場合は?

ALTER INDEX ALL ON [table_a] 
DISABLE; 

INSERT INTO table_a (col_1, col_2) 

SELECT DISTINCT b.col_1, .col_2 
FROM table_b b WITH(NOLOCK) 
JOIN table_a a WITH(NOLOCK) 
ON b.col_1 = a.col_1 
AND b.col_2 = a.col_2 

ALTER INDEX ALL ON [TableName] 
REBUILD; 
+0

table_b.idとtable_a.idが独立している、この方法を試してみてくださいは、有効な参加がありません。 –

+0

@MichaelCompton、今すぐチェックして教えてください – KumarHarsh

+0

プランは変わりますが、それ以外のバージョン1では改善はありません。SELECT自体に問題はないと思います。孤立して実行しても問題はありません。INSERTと組み合わせて実行すると、物理的な爆発が発生します。 –