Sql 如何提高性能?

Sql 如何提高性能?,sql,Sql,上面的sql语句太慢 如何提高性能 TableView是一个视图,它包含来自另一台服务器的远程数据 索引: [附表a] 国家,商品 国家,SKU代码 国家 [附表b] 地区代码,国家 locCode我不确定这是否有帮助, 但我认为使用join比使用子查询更快,我们可以将您的查询更改为这样 INSERT INTO TableTemp (......) SELECT ..... FROM ViewTable cs WHERE NOT EXISTS ( SELECT * FROM

上面的sql语句太慢

如何提高性能

TableView是一个视图,它包含来自另一台服务器的远程数据

索引: [附表a] 国家,商品 国家,SKU代码 国家 [附表b] 地区代码,国家
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