如何提高性能?

时间:2018-05-23 09:10:57

标签: sql

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

3 个答案:

答案 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。