我设计了一个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
不好查询,我只能说。你有更好的选择。 – johnny 2014-09-18 16:09:12
这是缓慢的原因是因为你正在使用游标。 – 2014-09-18 16:10:42
COUNT(v.visitid)'和COUNT(distinct v.visitID)'这些子选项可能会影响速度,为了确保你应该包含整个脚本的执行计划(图片) – DrCopyPaste 2014-09-18 16:10:49