此查询运行了几个小时,寻求帮助以提高效率。我玩过的是什么似乎让它运行得如此缓慢是WHERE子句的最后一部分:
"AND emp.employee_ID NOT IN <subquery with INNER JOINS and WHERE clause>".
如果我注释掉那个部分,它会在几秒钟内返回,但不幸的是我需要从父查询中省略那些记录,所以我需要一些逻辑来做到这一点。任何其他方法赞赏。 SQL查询分析器建议我相信employeejob表上的索引。
我无法更改选择列表,此查询会将数据发送到网站,并且必须采用该格式。
此查询不只运行一次。其select子句略有不同(例如,Part Time将更改为Full Time),它将在循环内再次运行。 @Reporting_Date将更改为另一个月,它将在循环内再次运行。总而言之,这个查询将运行数十次(在几个月的系列中,每个月都有一个略微不同的指标,如兼职,全职,豁免,非豁免)。我将循环逻辑排除在外,因为它基本上是相同的查询重复。对于一个指标,似乎需要几个小时才能返回一个月。
以下是确切的代码:
DECLARE @Reporting_Date varchar(20)
DECLARE @Metric_Date varchar(20)
DECLARE @Begin_Date varchar(20)
DECLARE @End_Date varchar(20)
SET @Reporting_Date = cast('02/01/2015' as datetime)
SET @Metric_Date = convert(varchar,dateadd(m, -1 ,@Reporting_Date),112)
SET @Begin_Date = convert(varchar,dateadd(m, -1 ,@Reporting_Date),112)
SET @End_Date = convert(varchar,dateadd(d, -1 ,@Reporting_Date),112)
select @Metric_Date as MetricPeriod
,org.locationnameid
,dep.divisionid
,ej.jobdepartmentid
,1
,' Part Time'
,3
,Count(*)
from ddw.dbo.Employee emp
inner join dbo.Organization org on org.organizationid = emp.organizationid and org.orgid in ('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z')
inner join dbo.status st on st.statusid = emp.statusid and st.statuscode not in ('T','X','N')
inner join dbo.employeejob ej on ej.employeeid = emp.employeeid and ej.jobnumber = '1' and ej.SnapShotDate = @Metric_Date
inner join dbo.department dep on dep.departmentid = ej.jobdepartmentid
where
ej.percentfulltime between '2.00' and '89.00'
AND
emp.SnapShotDate = @Metric_Date
**AND
emp.Employee_ID not IN
(
select Employee_ID
from dbo.Employee_Terms_All terms
inner join dbo.Organization org on org.organizationid = terms.organizationid and org.orgid in ('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z')
inner join dbo.terminationreasoncode trc on trc.terminationreasoncodeid = terms.terminationreasoncodeid and trc.terminationreasoncode not in ('4','5','6')
inner join dbo.department dep on dep.departmentid = terms.jobdepartmentid
where terms.terminationdate between @Begin_Date and @End_Date
)**
group by
org.locationnameid
,dep.divisionid
,ej.jobdepartmentid
order by
org.locationnameid
,dep.divisionid
,ej.jobdepartmentid
感谢您的任何想法!
答案 0 :(得分:0)
第一条道路 以便了解yout查询的瓶颈,我将分解问题: 1 /选择包含计数(*) 在做2 /和1 /
后会计算这些记录2 /来自员工(包含很多iner加入) 将所有此连接复制到employee_join_temp表
中3 / EmployeesID计算器列表 将复制employeesID_temp表中所有需要的id
=&GT;这样做会让你明白什么是沉重的。 =&GT;这样做会使您分割作业,并分割时间(如果在//系统中运行)
第二道路 如果不是那么快,我会去:MAP / REDUICE 1 /准备所有数据(导出/导入) 2 /清理数据 3 / map reduise以便在RAM中执行此查询。
一旦查询速度很慢,如果调整索引,拆分作业不起作用,你最好选择一个干净的版本Map / reduice而不是松散时间。
选择你的路径! :)强>