Sql 查询运行非常慢

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

我设计了一个sql查询来运行6500个检查人员的一些统计数据,但是它花费的时间太长了。sql中还有许多其他select查询,但它们运行正常,但“TotalVisitsWithAtLeastOneReport”select运行非常慢

要求:

  • 已上传文件的每位检查员的访问次数(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]