我正在使用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包连续填充,所以这可能会导致我的脚本在这段时间内运行时出现一些问题。
是否还有其他人遇到与此类似的问题并且有任何想法如何纠正它?
谢谢
答案 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亿条记录的表格,这可能需要很长时间。