【发布时间】:2016-01-28 20:22:25
【问题描述】:
SQL Server 2012 中的批处理(嵌套存储过程)存在零星的性能问题。有时,它需要的时间比平时长得多。
该过程根据输入参数重建某些表。 RULE 表有一个语句列,该列有 70 多个不同的语句(涉及 20 多个不同的列),用于动态 sql 中的 WHERE 子句。
所以,DELETE,在每个进程运行时,不仅参数不同,WHERE子句中的列类型和列数也不同。
除了管理统计信息和索引调整之外,您还有什么建议?开发团队对代码和架构更改持开放态度。
SELECT rul.SQL_STATEMENT
FROM APP_RULE rul
LEFT JOIN APP_RULE_EXCEPTION exc
ON rul.RULE_ID = exc.RULE_ID
WHERE rul.APP_ID = @AppId
AND (exc.RULE_ID IS NULL OR exc.RULE_ID NOT IN (
SELECT RULE_ID FROM APP_RULE_EXCEPTION ))
SET @SQLStatement =
'DELETE FROM EMPLOYEE ' +
'WHERE APP_ID = ' + CAST(@AppId AS VARCHAR(10)) +
' AND EMPLOYEE_ID NOT IN (' +
'SELECT EMPLOYEE_ID FROM EMPLOYEE_NEW ' +
'WHERE '+ @SQLStatement + ')'
EXEC (@SQLStatement)
SET @SQLStatement =
'DELETE FROM ' + @TableName + ' ' +
'WHERE EMPLOYEE_ID NOT IN (' +
'SELECT EMPLOYEE_ID FROM EMPLOYEE_STG ' +
'WHERE APP_ID = ' + CAST(@AppId AS VARCHAR(10)) +''')'
EXEC (@SQLStatement)
SET @SQLStatement =
'INSERT INTO ' + @DestinationTable + ' '+'( [APP_ID], ' + @AttributeList + ')'+
'SELECT ' + CAST(@AppId AS VARCHAR(10)) + ',''' + @ExposedAttributeList +
'FROM ' + @SourceTable + ' ' +
'WHERE [DATE] = ''' + @TDate + ''''
EXEC (@SQLStatement)
以下是动态 sql 生成的两个 DELETE 示例。
DELETE FROM EMPLOYEE WHERE APP_ID = 103 AND APP_TYPE = 'IE' AND EMPLOYEE_ID NOT IN (
SELECT EMPLOYEE_ID FROM EMPLOYEE_NEW WHERE APP_TYPE = 'IE' )
DELETE FROM EMPLOYEE WHERE APP_ID = 103 AND APP_TYPE = 'IE' AND COUNTRY='USA' AND EMPLOYEE_ID NOT IN (
SELECT EMPLOYEE_ID FROM EMPLOYEE_NEW WHERE APP_TYPE = 'IE' AND EMPLOYEE_ID IN (
SELECT EMPLOYEE_ID FROM EMPLOYEE_EMAIL WHERE ISNULL(EMAIL_ADDRESS,'')<>'' and EType='OFFICE' ))
谢谢, 库泽
【问题讨论】:
-
使用 WITH RECOMPILE 可能会有所帮助。另外,请参见此处:sommarskog.se/query-plan-mysteries.html
-
根据这个问题中显示的内容无法知道问题出在哪里。这个问题本身表明对如何优化基于 SQL 的流程知之甚少。我建议您做以下两件事之一:A) 聘请一位知道自己在做什么的 DBA,或 B) 购买性能监控工具来确定您遇到性能问题的位置和原因。任何人都无法查看您向我们展示的内容,也无法判断他们当前的系统设计和架构是好还是坏。它可能从根本上是好的,一个小的改变将解决这个问题。
标签: sql-server performance tsql dynamic