Sql 查询运行非常慢
我设计了一个sql查询来运行6500个检查人员的一些统计数据,但是它花费的时间太长了。sql中还有许多其他select查询,但它们运行正常,但“TotalVisitsWithAtLeastOneReport”select运行非常慢 要求:Sql 查询运行非常慢,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,我设计了一个sql查询来运行6500个检查人员的一些统计数据,但是它花费的时间太长了。sql中还有许多其他select查询,但它们运行正常,但“TotalVisitsWithAtLeastOneReport”select运行非常慢 要求: 已上传文件的每位检查员的访问次数(1或2或13) 表: Inspectors: InspectorID InspectionScope: ScopeID, InspectorID (FK) Visits: VisitID, VisitDate ScopeI
- 已上传文件的每位检查员的访问次数(1或2或13)
Inspectors: InspectorID
InspectionScope: ScopeID, InspectorID (FK)
Visits: VisitID, VisitDate ScopeID (FK)
VisitsDoc: DocID, DocType, VisitID (FK)
SQL:
将其分解,看看哪里不起作用
select i.InspectorID , i.InspectorGrade
,VisitWithReport = (select COUNT(v.visitid)
from visits v
inner join InspectionScope s
on s.ScopeID = v.ScopeID
where v.ReportStandard not in (0,9) and v.VisitType = 1
and v.VisitDate BETWEEN @DateFrom90 and @DateTo
and s.InspectorID = i.InspectorID)
from inspectors i
试试这个-你给查询优化器更多的机会变得聪明
select i.InspectorID, i.InspectorGrade
, COUNT(v.visitid) as VisitWithReport
from inspectors i
join InspectionScope s
on s.InspectorID = i.InspectorID
join visits v
on v.ScopeID = s.ScopeID
and v.ReportStandard not in (0,9)
and v.VisitType = 1
and v.VisitDate BETWEEN @DateFrom90 and @DateTo
group by i.InspectorID, i.InspectorGrade
SELECT i.InspectorID , i.InspectorGrade
,TotalVisitsWithAtLeastOneReport = (select COUNT(distinct v.visitID)
from Visits v
inner join InspectionScope s on s.ScopeID = v.ScopeID
inner join VisitDocs vd on vd.VisitID = v.VisitID
where vd.DocType IN (1,2,13) and s.InspectorID = i.InspectorID
and v.VisitDate BETWEEN i.DateFrom and i.DateTo
)
from @Inspectors i
试一试
我已经在QueryTunningAdvisor中检查了我的sql,在创建了以下非集群索引之后,sql脚本现在只需要两到三秒就可以执行了。我将对此进行更多的测试,并在实时实现之前查看它是否不会影响系统的其他部分
CREATE NONCLUSTERED INDEX [DocType_VisitID] ON [dbo].[VisitDocs]
(
[DocType] ASC,
[VisitID] ASC
)WITH (SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF) ON [PRIMARY]
我只能说,这不是个好问题。你有更好的选择。速度慢的原因是因为你使用的是光标。在
COUNT(v.visitid)
和COUNT(distinct v.visitid)
上的那些子选项可能会影响速度,当然你应该包括(的图片)为整个脚本执行的执行计划我已经尝试使用游标,但是使用过多的@SeanLange游标在哪里?TotalVisitsWithAtLeastOneReport中的查询导致problem@user1263981我怎么知道?你投票否决了我吗?你应该在@Inspectors TABLELet us@user1263981上声明PK,我不知道如何使用聊天。如果你有问题,就发出来。我没有否决你的问题。
SELECT i.InspectorID , i.InspectorGrade
, COUNT(distinct v.visitID) as TotalVisitsWithAtLeastOneReport
from @Inspectors i
join InspectionScope s
on s.InspectorID = i.InspectorID
join Visits v
on s.ScopeID = v.ScopeID
join VisitDocs vd
on vd.VisitID = v.VisitID
and vd.DocType IN (1,2,13)
and v.VisitDate BETWEEN i.DateFrom and i.DateTo
group by i.InspectorID , i.InspectorGrade
CREATE NONCLUSTERED INDEX [DocType_VisitID] ON [dbo].[VisitDocs]
(
[DocType] ASC,
[VisitID] ASC
)WITH (SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF) ON [PRIMARY]