性能问题 - Select 每个月第一次约会 table
Performance Issue - Select firstdate per month on a very big table
我有一个非常大的 table(超过 1.4 亿行,大小约为 230 GB)。有一个名为 "date_dim" 的列,其聚集索引为 asc。 table 中存储了 2015 年的所有数据。
我现在的目标是获取存储数据的月份的第一个日期。所以可能是一月份的数据是从5号开始的。所以我必须构建一个 'dynamic' 查询。
为了检索此数据,我创建了以下查询:
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
现在我的问题是查询需要很长时间才能获取数据。是否有其他选项可以构建性能更好的查询?对于为我的具体情况选择如此大的 table,您有什么性能建议吗?
实际上我无法对 table 本身进行任何更改,只能 'Read' 访问...
如果我理解你的问题,两个快速选项
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)
使用window函数:
SELECT distinct min([date_dim])
over (partition by Year([date_dim]), month([date_dim])) as [FirstDate]
FROM myTable_2015
ORDER BY [date_dim]
如果你有 1.4 亿行,那么你很有可能每个月的第一天都有
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)
我有一个非常大的 table(超过 1.4 亿行,大小约为 230 GB)。有一个名为 "date_dim" 的列,其聚集索引为 asc。 table 中存储了 2015 年的所有数据。
我现在的目标是获取存储数据的月份的第一个日期。所以可能是一月份的数据是从5号开始的。所以我必须构建一个 'dynamic' 查询。
为了检索此数据,我创建了以下查询:
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
现在我的问题是查询需要很长时间才能获取数据。是否有其他选项可以构建性能更好的查询?对于为我的具体情况选择如此大的 table,您有什么性能建议吗?
实际上我无法对 table 本身进行任何更改,只能 'Read' 访问...
如果我理解你的问题,两个快速选项
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)
使用window函数:
SELECT distinct min([date_dim])
over (partition by Year([date_dim]), month([date_dim])) as [FirstDate]
FROM myTable_2015
ORDER BY [date_dim]
如果你有 1.4 亿行,那么你很有可能每个月的第一天都有
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)