使用子查询和联接的SQL查询性能
我需要加快以下查询的执行时间,因为执行时间太长,我认为子查询就是问题所在使用子查询和联接的SQL查询性能,sql,sql-server,Sql,Sql Server,我需要加快以下查询的执行时间,因为执行时间太长,我认为子查询就是问题所在 SELECT WFApplication.*, WorkflowIncidentType.TypeName ProcessCategory, WFProcess.WFProcessName ProcessName, LUTAppStatus.EnglishName AppStatus FROM WFApplication INNER JOIN LUTAppStatus ON WFA
SELECT WFApplication.*,
WorkflowIncidentType.TypeName ProcessCategory,
WFProcess.WFProcessName ProcessName,
LUTAppStatus.EnglishName AppStatus
FROM WFApplication
INNER JOIN LUTAppStatus ON WFApplication.ApplicationStatus = LUTAppStatus.Id
INNER JOIN WorkflowIncidentType ON WorkflowIncidentType.TypeID = WFApplication.ApplicationIncidentType
INNER JOIN WFProcess ON WFProcess.WFProcessId = WFApplication.ApplicationProcess
LEFT OUTER JOIN IBSCustomer ON IBSCustomer.RIM = WFApplication.RIM
LEFT OUTER JOIN Reschedule ON Reschedule.RescheduleId = WFApplication.ProcessId
WHERE WFApplication.ProcessId IN
(SELECT ProcessId
FROM WFProcessInstanceLog)
AND WFProcessInstanceId IN (28251,
28345,
28773,
28774,
28846,
29309, .....)
如果是子查询,则可以在wfapplication和wfprocessingstancelog之间进行内部联接。没有理由为此使用子查询:
SELECT WFApplication.*,
WorkflowIncidentType.TypeName ProcessCategory,
WFProcess.WFProcessName ProcessName,
LUTAppStatus.EnglishName AppStatus
FROM WFApplication
Inner Join WFProcessInstanceLog WPL on WPL.ProcessID = WFApplicaiton.ProcessId
INNER JOIN LUTAppStatus ON WFApplication.ApplicationStatus = LUTAppStatus.Id
INNER JOIN WorkflowIncidentType ON WorkflowIncidentType.TypeID = WFApplication.ApplicationIncidentType
INNER JOIN WFProcess ON WFProcess.WFProcessId = WFApplication.ApplicationProcess
LEFT OUTER JOIN IBSCustomer ON IBSCustomer.RIM = WFApplication.RIM
LEFT OUTER JOIN Reschedule ON Reschedule.RescheduleId = WFApplication.ProcessId
WHERE WFProcessInstanceId IN (28251,
28345,
28773,
28774,
28846,
29309, .....)
如果是子查询,则可以在wfapplication和wfprocessingstancelog之间进行内部联接。没有理由为此使用子查询:
SELECT WFApplication.*,
WorkflowIncidentType.TypeName ProcessCategory,
WFProcess.WFProcessName ProcessName,
LUTAppStatus.EnglishName AppStatus
FROM WFApplication
Inner Join WFProcessInstanceLog WPL on WPL.ProcessID = WFApplicaiton.ProcessId
INNER JOIN LUTAppStatus ON WFApplication.ApplicationStatus = LUTAppStatus.Id
INNER JOIN WorkflowIncidentType ON WorkflowIncidentType.TypeID = WFApplication.ApplicationIncidentType
INNER JOIN WFProcess ON WFProcess.WFProcessId = WFApplication.ApplicationProcess
LEFT OUTER JOIN IBSCustomer ON IBSCustomer.RIM = WFApplication.RIM
LEFT OUTER JOIN Reschedule ON Reschedule.RescheduleId = WFApplication.ProcessId
WHERE WFProcessInstanceId IN (28251,
28345,
28773,
28774,
28846,
29309, .....)
好的,下面是SQL查询性能优化的基础知识 第一步:显示实际执行计划。在“查询”菜单中,选中“包括实际执行计划”。然后,当您运行查询时,结果窗格中将显示一个额外的选项卡,用于“执行计划” 第二步:查看树中最右边的节点。通常有四种可能性:
- 表格扫描。基本上,这是不好的。这意味着必须查看整个表才能找到它要查找的内容-根本没有使用索引。如果桌子很小,那可能没什么大不了的;如果桌子很大,你可能会遇到问题
- 聚集索引扫描。也不好。聚集索引是表,因此,如果SQL扫描一个表,则意味着它扫描整个表
- 索引扫描-非聚集。半坏。基本上,它能够使用索引来帮助查找数据(比完整的表更好),但无法使用二进制查找来快速缩小所查找的数据范围
- 索引搜索(非聚集或聚集)-您的目标。这意味着SQL能够快速找到它所寻找的数据的二进制方式
SELECT WFApplication.*
FROM WFApplication
WHERE WFProcessInstanceId IN (28251,
28345,
28773,
28774,
28846,
29309, .....)
执行计划有变化吗?如果上面语句中的计划不好,则可能意味着您缺少WFProcessInstanceId上的索引,或者您的表不够大,无法对主表进行5000次引用
但是,如果它在该查询上使用索引查找,但在添加其他表时切换到扫描操作,则可能表明您需要将这些额外的查找列添加到单独的索引中,这样它就不必尝试协调多个索引。好的,下面是SQL查询性能优化的基础知识 第一步:显示实际执行计划。在“查询”菜单中,选中“包括实际执行计划”。然后,当您运行查询时,结果窗格中将显示一个额外的选项卡,用于“执行计划” 第二步:查看树中最右边的节点。通常有四种可能性:
- 表格扫描。基本上,这是不好的。这意味着必须查看整个表才能找到它要查找的内容-根本没有使用索引。如果桌子很小,那可能没什么大不了的;如果桌子很大,你可能会遇到问题
- 聚集索引扫描。也不好。聚集索引是表,因此,如果SQL扫描一个表,则意味着它扫描整个表
- 索引扫描-非聚集。半坏。基本上,它能够使用索引来帮助查找数据(比完整的表更好),但无法使用二进制查找来快速缩小所查找的数据范围
- 索引搜索(非聚集或聚集)-您的目标。这意味着SQL能够快速找到它所寻找的数据的二进制方式