2017-10-17 52 views
1

我有一個非常大的桌子(超過140萬行,大小約230 gb)。有一列名爲「date_dim」的聚集索引asc。表格中存儲了2015年的所有數據。性能問題 - 在非常大的桌子上每月選擇firstdate

我的目標是獲取存儲數據的月份的第一個日期。所以一月份的數據可能在5日開始。所以我必須建立一個'動態'查詢。

要獲取這個數據,我創建了以下查詢:

SELECT 
    * 
FROM (
    SELECT    
    date_dim 
    ,row_num = ROW_NUMBER() OVER (PARTITION BY MONTH(date_dim) ORDER BY date_dim ASC) 
    FROM myTable_2015 WITH (NOLOCK) 
) AS s 
WHERE 
    row_num = 1 
ORDER BY 
    1 

現在我的問題是,查詢有一個很長的時間來獲取數據。是否有其他選項可以創建性能更好的查詢?你有任何性能建議選擇這樣的大表我的具體情況?

其實我不能對錶本身,只有「讀」訪問的任何變化......

+0

廣東話,你剛剛從日期表把它隔離開來? – RegBes

+0

不,因爲我需要每月存儲數據的第一個日期... –

回答

1

如果我明白你的問題,兩個快速選項

Select BOMonth = min(date_dim) 
From myTable_2015 
Group By year(date_dim),month(date_dim) 

甚至

Select BOMonth = min(date_dim) 
From (select distinct date_dim from myTable_2015) A 
Group By year(date_dim),month(date_dim) 
+0

非常感謝您的建議 - 將檢查它... –

+0

第二個查詢應該快得多。 – qxg

0

使用窗口功能:

SELECT distinct min([date_dim]) 
    over (partition by Year([date_dim]), month([date_dim])) as [FirstDate] 
FROM myTable_2015 
ORDER BY [date_dim] 
0

如果你有140萬行那麼好的機會,你每月的第一天

select distinct(date_dim) 
from myTable_2015 WITH (NOLOCK) 
where day(date_dim) = 1 

或者你可以在第一個x

select min(date_dim) 
from myTable_2015 WITH (NOLOCK) 
where day(date_dim) <=5 
group by month(date_dim)