sql - 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;
请指教。
解决方案
这是您的查询:
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关于这个主题有一篇很好的博客文章。
推荐阅读
- c# - 类型约束,类型存储在变量中
- php - 如何在没有 sql 查询的情况下获取唯一数据
- python - 使用正则表达式一次提取两个模式
- android - 我的应用程序在 Oreo 8.1 版本上崩溃,但适用于较低的操作系统版本
- python - 如何将消息添加到不同功能的队列并读取它
- javascript - Bootstrap DateTimePicker v4 在我的 ASP.NET 页面上不起作用
- php - 使用 PHP 迭代多维数组似乎跳过了值
- database - 如何建模 NoSQL 数据库(Firestore)?回顾我的第一种方法
- r - R:“如果”条件的问题
- angular - Angular 找不到接口导入