SQL-SERVER中的USP和CTE性能问题

时间:2016-10-04 09:45:30

标签: sql sql-server performance stored-procedures

请有人帮我写出更好的存储过程。

以下代码需要 3小时才能运行5000万条记录。

下面的USP会做一些计算,我试图只保留那些同一SKU的NEWPRICE最低的记录。

2 个答案:

答案 0 :(得分:1)

这是存储过程中的查询:

SELECT *
FROM table1 CMS INNER JOIN
     table2 CRT
     ON ID = ID CROSS APPLY
--------^
     (SELECT NEWS = (SPW - ((SPW * 15)/100))) AS C

如果此查询运行,则它正在执行cross join。为什么?如果两个表中都有id列,那么您将收到错误(有关模糊列引用的内容)。

我建议你总是使用完全限定的列名 - 也就是说,使用列来自的表的别名。

答案 1 :(得分:0)

您可以更改程序,仅返回每个NEWPRICE

的最低SKU
CREATE PROCEDURE Usp_conditioncheck @mydate VARCHAR(50) 
AS 
    SELECT * INTO   mytable 
    FROM   (SELECT *, 
                   NEWPRICE =( spw - ( ( spw * 15 ) / 100 ) ), 
                   rn = Row_number()OVER (partition BY sku ORDER BY ( spw - ( ( spw * 15 ) / 100 ) ) ASC) 
            FROM   table1 CMS 
                   INNER JOIN table2 CRT 
                           ON id = id) A 
    WHERE  rn = 1 

现在只需Select每个NEWPRICE

SKU SELECT * FROM mytable
Increment