查询执行问题

时间:2009-10-13 10:56:11

标签: sql-server sql-server-2005

使用SQL 2005:“花费太多时间执行”

我想过滤日期,日期不应该在假日中显示,而我正在使用三个带内连接的表

当我运行以下查询时,执行会花费太多时间,因为我使用三个表过滤了cardeventdate。

查询

SELECT 
   PERSONID, CardEventDate tmp_cardevent3 
WHERE (CardEventDate NOT IN 
           (SELECT T_CARDEVENT.CARDEVENTDATE 
            FROM T_PERSON 
            INNER JOIN T_CARDEVENT ON T_PERSON.PERSONID = T_CARDEVENT.PERSONID 
            INNER JOIN DUAL_PRO_II_TAS.dbo.T_WORKINOUTTIME ON T_CARDEVENT.CARDEVENTDAY = DUAL_PRO_II_TAS.dbo.T_WORKINOUTTIME.DAYCODE 
                   AND T_PERSON.TACODE = DUAL_PRO_II_TAS.dbo.T_WORKINOUTTIME.TACODE
            WHERE (DUAL_PRO_II_TAS.dbo.T_WORKINOUTTIME.HOLIDAY = 'true')
           )
      ) 
ORDER BY PERSONID, CardEventDate DESC

对于上面提到的Query,还有其他方法可以进行日期过滤。

期待我的查询的替代查询?

2 个答案:

答案 0 :(得分:2)

我很确定这不是连接表是问题,而是“不在”使它变慢。

尝试使用连接:

select m.PERSONID, m.CardEventDate
from T_PERSON p
inner join T_CARDEVENT c on p.PERSONID = c.PERSONID
inner join DUAL_PRO_II_TAS.dbo.T_WORKINOUTTIME w
   on c.CARDEVENTDAY = w.DAYCODE 
   and p.TACODE = w.TACODE
   and w.HOLIDAY = 'true'
right join tmp_cardevent3 m on m.CardEventDate = c.CardEventDate
where c.CardEventDate is null
order by m.PERSONID, m.CardEventDate desc

(查询中缺少from个句子,因此我不知道您尝试从哪个表中获取数据。)

编辑:
将tmp_cardevent3放在正确的位置。

答案 1 :(得分:0)

您是否在用于进行连接的所有列上创建了索引?特别是,我会考虑T_PARDEVENT中的PERSONID索引,T_PERSON和T_WORKINOUTTIME中的TACODE以及T_WORKINOUTTIME中的HOLIDAY。