大表最小值/最大值

时间:2016-12-16 16:24:26

标签: sql tsql

我正在使用SQL 2014,我目前正在尝试返回id列的最小值和最大值,id列是主键,并且具有唯一的非聚集索引。我的表包含206,923,208条记录,并且这种情况还在继续增长。我也是根据下面的创建日期示例代码选择我的记录

select min(id) from  tier_post (nolock) 
where created_datetime >= '2016-11-13' and created_datetime <= '2016-11-15'

根据我上面的记录选择,我返回了651,315条记录,但要查找id的最小值和最大值,它仍然需要6分钟以上才会停止脚本

最初我在同一个select语句中执行min和max,但是这会导致语句运行得更慢,所以我想我会尝试将其分解并单独运行。

为了使事情更加混乱,这个表每隔5分钟就会通过一个SSIS包连续填充,所以这可能会导致我的脚本在这段时间内运行时出现一些问题。

是否还有其他人遇到与此类似的问题并且有任何想法如何纠正它?

谢谢

3 个答案:

答案 0 :(得分:1)

对于此查询:

select min(id)
from tier_post (nolock) 
where created_datetime >= '2016-11-13' and created_datetime <= '2016-11-15';

你想要一个索引。我会建议tier_post(created_datime, id)上的索引。

注意:在包含206,923,208行的表上,创建索引可能需要几分钟。需要读取整个表格,这似乎需要花时间在您的系统上。

答案 1 :(得分:1)

除了这里建议的索引和分区之外,我建议因为它是如此庞大的数据集,所以通过不必在运行时通过显式转换将字符串转换为datetime来帮助查询。使用类似的东西:

declare @start_date datetime, @end_date datetime
set @start_date = '2016-11-13'
set @end_date = '2016-11-15'

select select min(id)
from tier_post (nolock) 
where created_datetime >= @start_date
and created_datetime <= @end_date;

答案 2 :(得分:0)

你提到了id的索引。

我猜测是created_datetime的索引。如果你没有通过id查找,那么id的索引对你没有好处。

在created_datetime上创建索引。请注意,对于包含2亿条记录的表格,这可能需要很长时间。