2017-10-17 51 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)