2009-10-13 86 views
0

使用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 

對於上述查詢,有任何其他的方法來做到日期過濾器。

期待我的查詢替代查詢?

+0

看起來是發佈的初始選擇語句的失蹤子句? – Andrew 2009-10-13 11:06:04

回答

1

我敢肯定,這不是連接表是問題,而是「不在」,這使得它緩慢。

嘗試使用代替連接:

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放在正確的位置。

+0

我的表名是tmp_cardevent3,然後才能從tmp_cardevent3中放入。我執行了,但是出錯了。請幫助我 – Gopal 2009-10-14 16:28:06

+0

難怪如果您嘗試在字段列表中輸入表名,則會出現錯誤...我將其置於上述查詢中的正確位置。 – Guffa 2009-10-14 19:21:14

0

您是否在所有用於執行連接的列上創建了索引?特別是,我會考慮T_CARDEVENT中的PERSONID,T_PERSON和T_WORKINOUTTIME中的TACODE以及T_WORKINOUTTIME中的HOLIDAY中的索引。