SQL Query运行了几个小时

时间:2015-05-09 02:59:49

标签: sql-server subquery inner-join

此查询运行了几个小时,寻求帮助以提高效率。我玩过的是什么似乎让它运行得如此缓慢是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

感谢您的任何想法!

1 个答案:

答案 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而不是松散时间。

选择你的路径! :)