2014-09-18 247 views
-3

我设计了一个sql查询来针对6500个检查器运行一些统计数据,但它耗时太长。在sql中还有很多其他的select查询,但它们运行正常,但“TotalVisitsWithAtLeastOneReport”选择运行非常慢。查询运行速度非常慢

要求:

Inspectors: InspectorID 
InspectionScope: ScopeID, InspectorID (FK) 
Visits: VisitID, VisitDate ScopeID (FK) 
VisitsDoc: DocID, DocType, VisitID (FK) 

SQL:

  • 对于其中的访问已上传文档(1或2或13),每个检查员

表访问次数

DECLARE 
     @DateFrom90 date, @DateTo date, @DateFrom180 date, @DateFrom date; 

SELECT @DateTo  = CAST(GETDATE() AS DATE) 
     ,@DateFrom90 = CAST(GETDATE() - 90 AS DATE) 
     ,@DateFrom180 = CAST(GETDATE() - 180 AS DATE) 



DECLARE @Inspectors TABLE (
     InspectorID int, 
     InspectorGrade int, 
     DateFrom date, 
     DateTo date 
     ); 

insert into @inspectors (
     InspectorID , 
     InspectorGrade, 
     DateFrom , 
     DateTo 
     ) 

select tmp.InspectorID , tmp.InspectorGrade 
     ,case when tmp.VisitWithReport = 0 then @DateFrom180 else @DateFrom90 end StartDate 
     ,@DateTo EndDate 
from 
(
    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 
) tmp; 


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 

enter image description here

+0

不好查询,我只能说。你有更好的选择。 – johnny 2014-09-18 16:09:12

+0

这是缓慢的原因是因为你正在使用游标。 – 2014-09-18 16:10:42

+1

COUNT(v.visitid)'和COUNT(distinct v.visitID)'这些子选项可能会影响速度,为了确保你应该包含整个脚本的执行计划(图片) – DrCopyPaste 2014-09-18 16:10:49

回答

0

我已经检查了我的sql查询tunning顾问和后创建以下非集群索引,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] 
0

打破它,看看它是不是执行

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 

尝试

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 
+0

TotalVisitsWithAtLeastOneReport中的查询导致问题 – user1263981 2014-09-18 16:46:46

+0

请问为什么会得到反对票? – Paparazzi 2014-09-18 16:52:13

+0

我为什么不投票? – user1263981 2014-09-18 17:03:15