Sql 提高插入选择查询的性能?

Sql 提高插入选择查询的性能?,sql,sql-server,performance,tsql,Sql,Sql Server,Performance,Tsql,我正在尝试改进旧的while循环查询。到目前为止,我们已经尝试过了,但仍然很慢。不确定可能会执行缓慢 旧查询(10分钟以上) 伟大的工作删除循环 我将指出一个可能的性能问题,特别是year(date\u month)=year(@tdate) 因为列被包装在函数中,所以它是。这意味着不能直接评估date\u month值,因此不能使用此列的索引和统计信息 为解决此问题,我建议进行以下更改: 在SP的顶部定义另外两个变量: DECLARE @YearStart AS DATETIME, @Next

我正在尝试改进旧的while循环查询。到目前为止,我们已经尝试过了,但仍然很慢。不确定可能会执行缓慢

旧查询(10分钟以上)


伟大的工作删除循环

我将指出一个可能的性能问题,特别是
year(date\u month)=year(@tdate)

因为列被包装在函数中,所以它是。这意味着不能直接评估
date\u month
值,因此不能使用此列的索引和统计信息

为解决此问题,我建议进行以下更改:

在SP的顶部定义另外两个变量:

DECLARE @YearStart AS DATETIME, @NextYearStart DATETIME
SET @YearStart = DATEADD(yy, DATEDIFF(yy, 0, @tdate ), 0 )
SET @NextYearStart = DATEADD( yy, @YearStart, 1 )
然后将
year(date\u month)=year(@tdate)
的所有实例替换为

@YearStart <= date_month AND date_month < @NextYearStart
在主要查询中,按如下方式连接到此表:

SELECT hlid,
    ISNULL( SUM( CASE WHEN itemID NOT IN (8, 6) THEN netvalue END ), 0 ) AS Bill,
    ISNULL( SUM( CASE WHEN itemID = 6 THEN asset * rate / 100 END ), 0 ) AS Sr
INTO #Bills
FROM tx_bill 
WHERE @YearStart <= date_month AND date_month < @NextYearStart
    AND NOT hlid IS NULL
GROUP BY hlid
LEFT JOIN #SumBills AS SumBills ON SumBills.hlid = cl.hlid
并在
中选择
更改分配,如下例所示:

pay_bill= ISNULL( SumBills.Bill, 0 ) / 4,
注意:我相信您在
bill
列中有一个错误,因为该值被4除,而不是在原始光标中

最后一点:
正如@GarethD在给您的文档中所说的,正确格式化代码可以显著减少理解和更改代码所需的时间。我想更进一步地说,代码格式代表了您对当前问题的态度和理解。

消除循环做得很好

我将指出一个可能的性能问题,特别是
year(date\u month)=year(@tdate)

因为列被包装在函数中,所以它是。这意味着不能直接评估
date\u month
值,因此不能使用此列的索引和统计信息

为解决此问题,我建议进行以下更改:

在SP的顶部定义另外两个变量:

DECLARE @YearStart AS DATETIME, @NextYearStart DATETIME
SET @YearStart = DATEADD(yy, DATEDIFF(yy, 0, @tdate ), 0 )
SET @NextYearStart = DATEADD( yy, @YearStart, 1 )
然后将
year(date\u month)=year(@tdate)
的所有实例替换为

@YearStart <= date_month AND date_month < @NextYearStart
在主要查询中,按如下方式连接到此表:

SELECT hlid,
    ISNULL( SUM( CASE WHEN itemID NOT IN (8, 6) THEN netvalue END ), 0 ) AS Bill,
    ISNULL( SUM( CASE WHEN itemID = 6 THEN asset * rate / 100 END ), 0 ) AS Sr
INTO #Bills
FROM tx_bill 
WHERE @YearStart <= date_month AND date_month < @NextYearStart
    AND NOT hlid IS NULL
GROUP BY hlid
LEFT JOIN #SumBills AS SumBills ON SumBills.hlid = cl.hlid
并在
中选择
更改分配,如下例所示:

pay_bill= ISNULL( SumBills.Bill, 0 ) / 4,
注意:我相信您在
bill
列中有一个错误,因为该值被4除,而不是在原始光标中

最后一点:
正如@GarethD在给您的文档中所说的,正确格式化代码可以显著减少理解和更改代码所需的时间。我想进一步说,代码格式代表了您对当前问题的态度和理解。

我添加了非聚集索引,然后我的查询运行了5秒钟。这几乎解决了我的问题@亚历克斯谢谢你的辛勤工作和时间。我会检查你的提示。我会投票给你的评论。

我添加了非聚集索引,然后我的查询需要5秒运行。这几乎解决了我的问题@亚历克斯谢谢你的辛勤工作和时间。我会检查你的提示。我支持你的评论

摆脱循环做得很好。但正如前面提到的,没有更多细节,没有人能在这里帮助你。从执行计划开始。@DaleBurrell我尝试粘贴计划,但显示错误“提供的XML没有正确解析。您确定有有效的查询计划XML文本吗?”嗯……您是否粘贴了执行计划中的XML?@SeanLange感谢您的评论和链接。这有助于我找出问题所在。摆脱循环做得很好。但正如前面提到的,没有更多细节,没有人能在这里帮助你。从执行计划开始。@DaleBurrell我尝试粘贴计划,但显示错误“提供的XML没有正确解析。您确定有有效的查询计划XML文本吗?”嗯……您是否粘贴了执行计划中的XML?@SeanLange感谢您的评论和链接。这有助于我找到问题所在。这件事的不可取性只是冰山一角。在开始研究索引之前,似乎还有很大的改进空间。@SeanLange,我同意,但上面的构造在他的SP中的几个地方突然出现,需要5分钟的修复。我没有时间将move
tx\U bill
子查询写入单独的查询答案:)@Alex感谢您的辛勤工作和时间。我会检查你的提示。我添加了非聚集索引,然后我的查询需要5秒才能运行。这一点的不可搜索性仅仅是冰山一角。在开始研究索引之前,似乎还有很大的改进空间。@SeanLange,我同意,但上面的构造在他的SP中的几个地方突然出现,需要5分钟的修复。我没有时间将move
tx\U bill
子查询写入单独的查询答案:)@Alex感谢您的辛勤工作和时间。我将检查您的提示。我添加了非聚集索引,然后我的查询需要5秒运行。