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,我假设由于更高的物理读取计数。
有没有什么明显的原因,为什么物理读取计数会如此不同,表面上看起来好像两个版本应该做同样的工作。
我已经跑了这些无数次的热和冷和缓存,并看到两个版本的一致行为。
嘿,你可以尝试备用查询,
--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;
table_b.id和table_a.id是独立的,没有相关的有效连接。 –
@MichaelCompton,现在检查并让我知道 – KumarHarsh
该计划确实发生了变化,但是对版本1没有任何改进。我认为SELECT本身没有问题。如果我单独运行它,则没有问题,这是在与INSERT结合运行时发生物理读取爆炸的情况。 –
查询计划http://imgur.com/a/lBpS0 –