sql中的脚本优化

sql中的脚本优化,sql,sql-server,Sql,Sql Server,我正在运行简单的select脚本,它与其他3个表进行内部连接。所有的表都很大(数据量很大),运行大约需要20秒。想要优化它 我试着使用诺洛克,但没有太多的尊重 SELECT RR.ReportID, RR.RequestFormat, RRP.SequenceNumber, RRP.ParameterName, RRP.ParameterValue CASE WHEN RP.ParameterLabelOvrrd IS NUL

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

我试着使用诺洛克,但没有太多的尊重

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;

请提供建议。

我建议在运行时打开执行计划,并查看SSMS是否可以就附加索引向您提供建议

除此之外,您的查询看起来是直截了当的,除了可能去掉case语句和NOLOCK语句之外,没有任何代码方面的东西可以帮助您加快查询速度

这是您的查询:

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;
假设id是一个数字,我已经删除了
2226765
上的单引号。混合类型可能会妨碍优化器

然后,我建议在
ReportRequestParameters(RequestID,SequenceNumber)
上建立一个索引。我假设其他表在适当的列上有索引,但它们是:

  • ReportRequests(RequestID、ReportID、SequenceNumber)
  • ReportParameter(ReportID、SequenceNumber、ParameterID)
  • 参数(ParameterID)

我强烈建议您不要使用
nolock
,除非您知道自己在做什么。Aaron Bertrand在这方面做得很好。

with(nolock)建议使用SQL Server,因此我添加了标记。您选择对这里的每个表使用
with(nolock)
的原因是什么?如果是为了“提高”性能,那么这不是
使用(NOLOCK)
所做的,您应该将它们全部删除(您的问题表明这就是原因)。SQL的格式也不正确,因为
参数值
后缺少逗号,
参数labelovrd
缺少表别名。帮助我们的最快方法是发布表的DDL以及任何索引。如果能给我们一份你的。我更喜欢
ISNULL
而不是
COALESCE()
@yogesharma。我没有。在这种情况下,没有性能差异,
COALESCE()
是一个标准函数。根据我的经验,我也面临着性能差异。这取决于
RP.parameterlabelovrd
P.ParameterLabel
的数据类型,@YogeshSharma。2之间的行为不相同,
COALESCE
将产生OP当前具有的相同行为<代码>为空不可以。