性能问题 - 在非常大的桌子上选择每月的第一天

时间:2017-10-17 13:24:32

标签: sql sql-server performance tsql row-number

我有一张非常大的桌子(超过140密耳的行,大小约为230 gb)。有一个名为“date_dim”的列,带有聚簇索引asc。在表格中存储了2015年的所有数据。

我的目标是获取存储数据的一个月的第一个日期。因此可能是1月份数据从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

现在我的问题是查询有很长时间来获取数据。是否可能有其他选项来构建具有更好性能的查询?对于我的特定情况,您是否有任何表现建议选择这样的大表?

实际上我不能对表本身进行任何更改,只能“读取”访问...

3 个答案:

答案 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)

答案 1 :(得分:0)

使用窗口功能:

.proxy

答案 2 :(得分: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)