0

我有一张大表,我一直在使用查询分析器并寻找最好的方法来做到这一点。

表格是这样的:

name         rows        reserved     data         index_size   unused
table_name   110980132   7802944 KB   6119784 KB   1679320 KB   3840 KB

并有这些列:

 ID int, time_stamp datetime, value1 float, value2 float, value3 float.... 

这些time_stamps是带有时间的日期。我需要找到一种简单的方法,而不存储任何东西,以便能够只获取表格的日期部分。最终,我可能只需要知道天 + 小时部分(而不是整个时间部分)。目前,我只需要知道过去 30 天我们拥有的数据是什么(有时此时缺少几天,这个问题/查询最终将不仅仅是寻找最后 x 天,而是所有天,或者任何)。

考虑到性能和时间,最好的方法是什么?我玩过group by, distinct, top x, rank(), 临时表、视图……有些东西比其他东西好,但我所做的一切似乎都不是很好。

想法?谢谢!

4

2 回答 2

1
-- Get the earliest date (without time) you want
DECLARE @smallestDate datetime = DATEADD(DAY, DATEDIFF(DAY, -30, GETDATE()), 0)

-- Select the distinct dates
SELECT DISTINCT DATEADD(DAY, DATEDIFF(DAY, 0, time_stamp), 0) AS [Date]
FROM yourTable
WHERE time_stamp > @smallestDate

这是一些性能比较 SQL Server 中从日期+时间获取日期的最有效方法?

于 2012-11-14T22:41:27.383 回答
0

如果您愿意使用 T-SQL 批处理而不是单个查询,那么您可以使用如下索引:

create table #tmp (date datetime primary key clustered);
declare @pivot datetime;
  insert #tmp
  select TOP(1) datediff(d,0,time_stamp)
    from tbl
order by time_stamp desc;
while @@rowcount > 0 and (select count(*) from #tmp) < 30
begin
      insert #tmp
      select TOP(1) datediff(d,0,time_stamp)
        from tbl
       where time_stamp < (select min(date) from #tmp)
    order by time_stamp desc;
end;

所有这一切都需要您在 上建立一个良好的索引time_stamp,并且它将在该索引上执行 30 次(或更少)搜索。非常手术和快速。我把它作为一个概念提出来,所以显然可以很容易地优化其中的 2 个标量子查询。

于 2012-11-14T22:16:15.697 回答