2012-09-08 48 views
1

性能使用SQL Server 2000如何增加的查詢

假日(表)

dates 

2012-08-02 
2012-08-19 
2012-08-20 

表1

id dates time 

001 01/08/2012 00:00 
001 02/08/2012 00:00 
001 03/08/2012 00:00 
001 04/08/2012 12:00 
... 
... 
001 17/04/2012 11:00 
001 18/08/2012 00:00 
001 19/08/2012 00:00 
001 20/08/2012 00:00 
001 21/08/2012 12:00 
... 

我要檢查每一列的以前的日期和未來日期,那麼我想更新禮物或缺席或假期。

條件的

  • 如果當前行時間不等於00:00則狀態應該是P(現任)
  • 如果以前的日期時間列是00:00和下一個日期時間列是00: 00然後自動當前行的狀態應該是AB(缺席),
  • 如果日期等於假期表日期後自動當前行的狀態應該是H

注:此查詢運行不用其他任何故障,唯一擔心的是費時......

查詢

Select 
    t2.id, 
    t2.dates, 
    case 
     when t2.time <> '00:00' 
      then 'P' 
     when t4.dates = t2.dates and t1.intime = '00:00' and t3.intime = '00:00' 
      then 'AB' 
     else 'H' 
    end as attn 
from 
    (
     Select id, dates, time from table1 
     where t1.dates = Cast('18/08/2012' as datetime) 
    ) t1 
    left outer join 
    (
     Select id, dates, time from table1 
     where t2.dates = Cast('19/08/2012' as datetime) 
    ) t2 
    on t1.id = t2.id 
    left outer join 
    (
     Select id, dates, time from table1 
     where t2.dates = Cast('20/08/2012' as datetime) 
    ) t3 
    on t2.id = t3.id 
    left outer join 
    (
     select dates from holiday 
    ) t4 
    on t4.dates = t2.dates 

上述查詢工作正常,但它正在採取更多的時間來展示,因爲我想要查看從01/09/201230/09/2012的數據,每個id,我有n個編號, 系統正在檢查每個編號的上一個日期和下一個日期並顯示結果。

任何其他替代查詢或解決方案是有用於顯示數據

+4

這個功課?爲什麼不使用連接? –

+0

@ElVieejo,雅我想要使用連接... – JetJack

回答

0

您基本查詢結構細。就個人而言,我不會在子查詢中對日期進行硬編碼,而是將日期添加到「on」子句中。

您可以通過創建(ID,日期)的索引使這個運行速度更快:

create index table1_id_date on table1(id, date) 

和索引度假也可以幫助:

create index holiday_date on holiday(date) 

你還可以升級到更最近版本的SQL Server。由於lag()和lead()函數的原因,在SQL Server 2012中,您的查詢將更快,更容易表達。

1

戈登說,你的結構是好的,但我可以推薦你另一種方式,以提高該查詢(或任何其他重型之一)的性能是使用數據庫引擎優化顧問

使用此工具,SQL服務器將嘗試創建額外的索引,統計數據和其他任何可以提高所提供查詢性能的內容。

要啓動它,從查詢窗口中選擇您的查詢文本,單擊右鍵,然後選擇分析數據庫引擎優化顧問中的查詢。

enter image description here

+0

@thanks,我正在使用sql server 2000 – JetJack