Sql server SQL Server:时间序列数据性能

Sql server SQL Server:时间序列数据性能,sql-server,performance,sql-server-2000,time-series,Sql Server,Performance,Sql Server 2000,Time Series,我有一个表,其中包含略多于10亿行的时间序列数据,具有出色的插入性能,但(有时)糟糕的选择性能 表tblTrendDetails(主键顺序如图所示): 该表不断地引入新数据并清除旧数据,因此插入和删除性能需要保持快速 执行以下查询时,性能不佳(30秒): 如果我再次执行相同的查询(时间相似,但任何@inCavityId或@inTrendId),性能都非常好(1秒)。性能计数器表明,磁盘访问是第一次运行查询时的罪魁祸首 关于如何在不(显著)影响插入或删除性能的情况下提高性能的任何建议?欢迎提出任何

我有一个表,其中包含略多于10亿行的时间序列数据,具有出色的插入性能,但(有时)糟糕的选择性能

tblTrendDetails
(主键顺序如图所示):

该表不断地引入新数据并清除旧数据,因此插入和删除性能需要保持快速

执行以下查询时,性能不佳(30秒):

如果我再次执行相同的查询(时间相似,但任何
@inCavityId
@inTrendId
),性能都非常好(1秒)。性能计数器表明,磁盘访问是第一次运行查询时的罪魁祸首


关于如何在不(显著)影响插入或删除性能的情况下提高性能的任何建议?欢迎提出任何建议(包括完全更改基础数据库)。

对相同或类似数据的后续查询运行得更快,这可能是由于SQL Server。也就是说,有没有可能加快这个初始查询的速度

验证查询计划:

我的猜测是,您的查询应该导致索引查找,而不是索引扫描(或者更糟的是,表扫描)。请使用
设置SHOWPLAN_TEXT ON来验证这一点或类似功能。不过,像查询那样在
和=之间使用
,确实应该

索引碎片:

在所有这些插入和删除之后,您的聚集索引(本例中的主键)可能非常零碎。我可能会和你核对一下

可以使用对表的索引进行碎片整理。 这可能需要一些时间,但会使桌子保持可访问性,并且您可以停止操作而不会产生任何不良副作用

您可能需要进一步使用。不过,这是一个脱机操作,因此仅当不需要访问表时才应执行此操作

此处描述了一些差异:

请注意,对大型表进行碎片整理可能会使事务日志增长很多,而且这可能需要很长时间

分区视图:

如果这些都不能解决这种情况(或者碎片化不是问题),您甚至可以考虑,在其中为不同范围的记录创建一组基础基表,然后将它们合并到一个视图中(替换原始表)

更好的东西:


如果这些选择的性能是真正的业务需要,那么您可能能够提供更好的硬件:更快的驱动器、更多的内存等。如果您的驱动器速度是原来的两倍,那么此查询将在一半的时间内运行,是吗?此外,这对您来说可能不可行,但我发现新版本的SQL Server确实更快,具有更多的选项,并且更易于维护。我很高兴将公司的大部分数据转移到了2008R2。但我离题了…

PK是群集的吗?有索引吗?@TimLehner有。。PK是聚集的。没有(其他)索引。对于一个非常彻底且陈述良好的答案,为+1。在发布问题之前,我已经验证了查询计划。但我没有考虑索引碎片。
SHOWCONTIG
肯定显示了碎片。我现在正在运行一个
INDEXDEFRAG
PK  TrendTime    datetime
PK  CavityId     int
PK  TrendValueId int
    TrendValue   real
SELECT * 
FROM tblTrendDetails
WHERE TrendTime BETWEEN @inMinTime AND @inMaxTime
  AND CavityId = @inCavityId
  AND TrendValueId = @inTrendId