sql - select query in Cursor taking too long -
i have designed cursor run stats against 6500 inspectors taking long. there many other select queries in cursor running okay following select running very slow. without cursor select query running fine.
requirements:
number of visits each inspectors visits has uploaded document (1 or 2 or 13)
tables:
inspectors: inspectoridinspectionscope: scopeid, inspectorid (fk)visits: visitid, visitdate scopeid (fk)visitsdoc: docid, doctype, visitid (fk)
cursor code:
declare @curinspid int, @datefrom date, @dateto date; select @dateto = cast(getdate() date) ,@datefrom = cast(getdate() - 90 date) declare @inspectorid int, @totalvisits int; declare @report table ( inspectorid int, totalvisits int) declare curlist cursor select inspectorid inspectors ; open curlist fetch next curlist @curinspid; while @@fetch_status = 0 begin select @curinspid = s.inspectorid ,@totalvisits = count(distinct v.visitid) visits v inner join inspectionscope s on s.scopeid = v.scopeid inner join visitdocs vd on vd.visitid = v.visitid s.inspectorid = @curinspid , vd.doctype in (1,2,13) , v.visitdate between @datefrom , @dateto group s.inspectorid insert @report values(@curinspid,@totalvisits); fetch next curlist @curinspid; end close curlist deallocate curlist select * @report following queries run okay inside same cursor
,@totalvisitswithreportscore = (select count(v.visitid) visits v inner join inspectionscope s on s.scopeid = v.scopeid v.reportstandard not in (0,9) , v.visittype = 1 , v.visitdate between @datefrom , @dateto , s.inspectorid = @curinspid ) ,@totalvisitswith_reportscore_rejectionfeedback = (select count(v.visitid) visits v inner join inspectionscope s on s.scopeid = v.scopeid v.reportstandard not in (0,9) , v.visittype = 1 , v.discrepancytype in (2,5,6,7,8) , v.visitdate between @datefrom , @dateto , s.inspectorid = @curinspid )
no need cursor here -- can use insert into select, joining on inspector table.
insert @report select s.inspectorid , count(distinct v.visitid) visits v inner join inspectionscope s on s.scopeid = v.scopeid inner join visitdocs vd on vd.visitid = v.visitid inner join inspector on s.inspectorid = i.inspectorid vd.doctype in (1,2,13) , v.visitdate between @datefrom , @dateto group s.inspectorid please note, may need use outer join inspector table if there results in table not exist in other tables. depends on data , desired results.
Comments
Post a Comment