首页 > 解决方案 > sql中的脚本优化

问题描述

我正在运行简单的选择脚本,它与其他 3 个表进行内部连接。所有表格都很大(大量数据),运行大约需要 20 秒。想优化一下。

我尝试使用 nolock ,但没有太多的尊重

SELECT RR.ReportID,
       RR.RequestFormat,
       RRP.SequenceNumber,
       RRP.ParameterName,
       RRP.ParameterValue
       CASE WHEN RP.ParameterLabelOvrrd IS NULL THEN P.ParameterLabel ELSE .ParameterLabelOvrrd END AS ParameterLabelChosen,
       RRP.ParameterValueEntered
FROM ReportRequestParameters AS RRP WITH (NOLOCK)
     INNER JOIN ReportRequests AS RR WITH (NOLOCK) ON RRP.RequestID = RR.RequestID
     INNER JOIN ReportParameter AS RP WITH (NOLOCK) ON RP.ReportID = RR.ReportID
                                                   AND RP.SequenceNumber = RRP.SequenceNumber
     INNER JOIN Parameter AS P WITH (NOLOCK) ON P.ParameterID = RP.ParameterID
WHERE RRP.RequestID = '2226765'
ORDER BY SequenceNumber;

请指教。

标签: sqlsql-server

解决方案


这是您的查询:

SELECT RR.ReportID, RR.RequestFormat, RRP.SequenceNumber, 
       RRP.ParameterName,  RRP.ParameterValue 
       COALESCE(RP.ParameterLabelOvrrd, P.ParameterLabel) as ParameterLabelChosen,
       RRP.ParameterValueEntered
FROM ReportRequestParameters RRP JOIN
     ReportRequests RR 
     ON  RRP.RequestID = RR.RequestID JOIN
     ReportParameter RP 
     ON RP.ReportID = RR.ReportID AND
        RP.SequenceNumber = RRP.SequenceNumber JOIN
     Parameter P 
     ON P.ParameterID = RP.ParameterID
WHERE RRP.RequestID = 2226765
ORDER BY RRP.SequenceNumber;

2226765假设 id 是一个数字,我已经删除了 上的单引号。混合类型会阻碍优化器。

然后,我推荐一个关于ReportRequestParameters(RequestID, SequenceNumber). 我假设其他表在适当的列上有索引,但这些是:

  • ReportRequests(RequestID, ReportID, SequenceNumber)
  • ReportParameter(ReportID, SequenceNumber, ParameterID)
  • Parameter(ParameterID)

我强烈建议您不要使用nolock,除非您知道自己在做什么。Aaron Bertrand关于这个主题有一篇很好的博客文章。


推荐阅读