Sql 如何提高性能?
上面的sql语句太慢 如何提高性能 TableView是一个视图,它包含来自另一台服务器的远程数据 索引: [附表a] 国家,商品 国家,SKU代码 国家 [附表b] 地区代码,国家Sql 如何提高性能?,sql,Sql,上面的sql语句太慢 如何提高性能 TableView是一个视图,它包含来自另一台服务器的远程数据 索引: [附表a] 国家,商品 国家,SKU代码 国家 [附表b] 地区代码,国家 locCode我不确定这是否有帮助, 但我认为使用join比使用子查询更快,我们可以将您的查询更改为这样 INSERT INTO TableTemp (......) SELECT ..... FROM ViewTable cs WHERE NOT EXISTS ( SELECT * FROM
locCode我不确定这是否有帮助,
但我认为使用join比使用子查询更快,我们可以将您的查询更改为这样
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
);
别忘了使用适当的索引来加快进程
希望这能帮助 有多种方法可以提高查询的性能(通用解决方案)
- 以优化的方式重新编写查询
- 在所需列上创建索引
- 检查查询计划,如果需要,进行分区
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
如果你无法分享计划,那么这里就是你的关键问题所在 SQL可能会执行嵌套循环来访问[ViewTable],这可能并不理想,因为它实际上可能会对嵌入的远程表执行多个完整扫描(如果它没有远程统计信息的可见性) 如果无法访问远程统计信息,则临时导入远程表中所需列的完整副本的成本可能会更低。然后编写一个本地查询来处理临时表
之后是通常的索引和左连接,其中不为NULL。我们确实需要更多的信息,例如包括索引的模式、实际查询以及查询计划。从运行EXPLAIN plan开始并查找表扫描。确保WHERE子句中的列上有索引。您可能不能,因为这至少是O(n)和O(n^2)。请尝试将查询分为两部分,将第一部分数据插入临时表,然后在第二部分中使用临时数据。点击并重试…您正在使用哪个版本的SQL Server,以及用于访问远程表的凭据是什么?这将影响本地会话是否可以访问远程统计信息。在SQL2012SP1之前,要查看远程统计信息,您需要的不仅仅是读取权限。您还需要知道每个表中涉及多少条记录。执行计划可以帮助您选择在何处使用索引:国家/地区列上的索引可能是第一个猜测
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