性能问题 - 在非常大的桌子上每月选择firstdate
问题描述:
我有一个非常大的桌子(超过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
现在我的问题是,查询有一个很长的时间来获取数据。是否有其他选项可以创建性能更好的查询?你有任何性能建议选择这样的大表我的具体情况?
其实我不能对表本身,只有“读”访问的任何变化......
答
如果我明白你的问题,两个快速选项
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
答
使用窗口功能:
SELECT distinct min([date_dim])
over (partition by Year([date_dim]), month([date_dim])) as [FirstDate]
FROM myTable_2015
ORDER BY [date_dim]
答
如果你有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)
广东话,你刚刚从日期表把它隔离开来? – RegBes
不,因为我需要每月存储数据的第一个日期... –