SQL INSERT从服务器,以增加物理读取... SELECT

SQL INSERT从服务器,以增加物理读取... SELECT

问题描述:

版本1SQL INSERT从服务器,以增加物理读取... 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

表-A:聚集在主键顺序id,col_1上的非聚簇唯一性包括col_2,col_2上的非聚簇唯一性包括col_1

版本1 I/O

Table'table_b'。扫描计数34,逻辑读取118,物理读取0,预读读取0,lob逻辑读取0,lob物理读取0,lob预读读取0. 表'table_a'。扫描计数0,逻辑读取109404,物理读取8761,预读读取7761,lob逻辑读取0,lob物理读取0,lob预读取读取0. 表'工作台'。扫描计数0,逻辑读取0,物理读取0,预读0,lob逻辑读取0,lob物理读取0次,lob预读0

(受影响4997行(S))

版本2 I/O

Table'table_b'。扫描计数34,逻辑读取118,物理读取0,预读读取0,lob逻辑读取0,lob物理读取0,lob预读读取0. 表'table_a'。扫描计数0,逻辑读取35454,物理读取0,预读读取5435,lob逻辑读取0,lob物理读取0,lob预读读取0. 表'#temp _______________________________________________________________________________________________________ 00000044D848'。扫描计数0,逻辑读取5045,物理读取0,预读读取0,lob逻辑读取0,lob物理读取0,lob预读读取0. 表格'工作台'。扫描计数0,逻辑读取0,物理读取0,预读0,lob逻辑读取0,lob物理读取0次,lob预读0

(受影响4994行(S))

(1 row(s)affected) Table'table_a'。扫描计数0,逻辑读取105486,物理读取331,预读读取5940,lob逻辑读取0,lob物理读取0,lob预读取读取0. 表'工作表'。扫描计数2,逻辑读取10412,物理读取0,预读读取0,lob逻辑读取0,lob物理读取0,lob预读取读取0. 表'#temp _______________________________________________________________________________________________________ 00000044D848'。扫描计数1,逻辑读取52,物理读取0,预读0,lob逻辑读取0,lob物理读取0次,lob预读0

(受影响4994行(S))

版本1显着缓慢版本2,我假设由于更高的物理读取计数。

有没有什么明显的原因,为什么物理读取计数会如此不同,表面上看起来好像两个版本应该做同样的工作。

我已经跑了这些无数次的热和冷和缓存,并看到两个版本的一致行为。

+0

查询计划http://imgur.com/a/lBpS0 –

嘿,你可以尝试备用查询,

--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结合运行时发生物理读取爆炸的情况。 –