INSERT INTO TableTemp (......)
SELECT .....
FROM ViewTable cs
WHERE NOT EXISTS (
SELECT *
FROM TableA s
WHERE s.location_locCode = cs.store
AND s.stockUnit_country = cs.country
AND s.stockUnit_upcCode = cs.upc
)
and EXISTS (
SELECT *
FROM TableB l
WHERE cs.store = l.locCode
AND cs.country=l.country
);
上面的sql语句太慢了。
如何改善表现?
TableView是一个视图,一个从另一个服务器远程传输数据的视图。
指数: [表A] 国家,skuItem 国家,skuCode country,upcCode [表B] locCode,国家 locCode
答案 0 :(得分:0)
我不确定这是否有帮助,
但我认为使用连接比使用子查询更快,我们可以将您的查询更改为此
SELECT .....
FROM ViewTable cs left join tableA s on (s.location_locCode = cs.store AND s.stockUnit_country = cs.country AND s.stockUnit_upcCode = cs.upc)
left join TableB l on (cs.store = l.locCode AND cs.country=l.country)
where s.id is null and l.id is not null
并且不要忘记使用适当的索引来加速这个过程...
希望这可以帮助......答案 1 :(得分:0)
有多种方法可以改善查询的性能(通用解决方案)
以优化方式重写您的查询
在所需列
检查查询计划以及是否需要执行分区
我正在为您分享查询选项,通过该选项您可以在一定程度上提高性能,但要了解交叉检查每种方法所需的性能
Apporach 1:-
INSERT INTO TableTemp (......)
SELECT .....
FROM ViewTable cs
WHERE NOT EXISTS ( SELECT TOP (1) 'x'
FROM TableA s
WHERE s.location_locCode = cs.store
AND s.stockUnit_country = cs.country
AND s.stockUnit_upcCode = cs.upc )
and EXISTS (SELECT TOP 1 'x'
FROM TableB l
WHERE cs.store = l.locCode
AND cs.country=l.country);
------------------------------------------------------------
Approach #2
--------------------------------------------------------------
SELECT .....
FROM ViewTable cs
LEFT OUTER JOIN TableA s ON s.location_locCode = cs.store
AND s.stockUnit_country = cs.country
AND s.stockUnit_upcCode = cs.upc
CROSS APPLY ( SELECT TOP 1 l.id
FROM TableB l
WHERE cs.store = l.locCode
AND cs.country=l.country) tmp
WHERE s.Id IS NULL
Approach #3
--------------------------------------------------------------
SELECT .....
FROM ViewTable cs
OUTER APPLY ( SELECT TOP 1 Id
FROM tableA s
WHERE s.location_locCode = cs.store
AND s.stockUnit_country = cs.country
AND s.stockUnit_upcCode = cs.upc) tmp2
CROSS APPLY ( SELECT TOP 1 l.id
FROM TableB l
WHERE cs.store = l.locCode
AND cs.country=l.country) tmp
WHERE tmp2.ID IS NOT NULL
答案 2 :(得分:0)
如果您无法分享该计划,那么您的主要问题就在这里。
SQL可能会执行嵌套循环来访问[ViewTable],这可能并不理想,因为它实际上最终可能会对嵌入式远程表执行多次完整扫描(如果它没有远程统计信息的可见性)。
如果您无法访问远程统计信息,则临时导入远程表中所需列的完整副本的成本可能更低。然后编写一个本地查询来处理临时表。
之后它通常是Indexing和LEFT JOIN,其中NOT NULL。