2012-11-14 37 views
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(),临时表,视图......有些事情比别人好,但我所做的一切似乎都很棒。

想法?谢谢!

+1

如果你不想通过铸造(楼(CAST(TIME_STAMP为Float))的日期时间),可以添加额外的指数Daterow,你能集团 – bummi

+0

最好在我看来,下注是为了(1)创建一个“仅限日期”的计算列(在SQL Server ** 2008中**会更容易**),(2)确保您可以**持续**计算列,并(3)在其上设置索引。这样,计算的列将始终只包含'time_stamp'的日期部分,它将被索引(可能还可以在方程中添加一些“INCLUDE”列),并且这应该允许您获得半体面性能。但它需要存储额外的列..... –

+0

是的...我使用的是dateadd(dd,0,datediff(dd,0,time_stamp))。谷歌只是告诉我,我可以做到这一点:选择不同的顶端30 ...我之前尝试,但只是在错误的顺序的东西。我在time_stamp列上加了一个索引,我不确定它是否在做任何事情,但是这个组合似乎工作的非常好。 –

回答

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个标量子查询可以很容易地进行优化。

+0

你能告诉我什么time_stamp上的“好指数”会是什么?请。我对索引/索引不太了解......我对教科书有所了解,但不能总是告诉他们什么时候需要或需要什么。 –

+0

我应该说“有帮助”。从某种意义上说,索引只能是好的。只要创建它'创建索引ix_tblname_time tblname(time_stamp desc)' – RichardTheKiwi

0
-- 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 

这里的一些性能比较 Most efficient way in SQL Server to get date from date+time?

+0

这就是我正在做的......但我不知道最早的日期。因为...我假设30天,60天......但我可能有其他限制......比如,值在x或类型的有效范围内。我可以假设我想要的范围是双倍的(所以如果我需要30天的数据,我可以假设这将在60天内发生),但最终需要只要运行整个事情,我肯定会得到我需要的。 –

相关问题