在SQL Server 2005/2008中存储历史数据的最佳方法是什么?

And*_*mer 22 sql t-sql sql-server performance sql-server-2008

我的简化和人为的例子如下: -

让我们说,我想每天测量和存储所有世界城镇的温度(和其他值).我正在寻找一种存储数据的最佳方式,以便在所有城镇中获得当前温度同样容易,因为它可以在一个城镇中获得历史上的所有温度.

这是一个很容易解决的问题,但我正在寻找最佳解决方案.

我能想到的两个主要选择如下: -

选项1 - 相同的表存储当前和历史记录

将所有当前和归档记录存储在同一个表中.

CREATE TABLE [dbo].[WeatherMeasurement](
  MeasurementID [int] Identity(1,1) NOT Null,
  TownID [int] Not Null,
  Temp [int] NOT Null,
  Date [datetime] NOT Null,
)
Run Code Online (Sandbox Code Playgroud)

这样可以保持一切简单,但获得城镇列表和当前温度的最有效查询是什么?一旦表中有数百万行,这会缩放吗?通过在表中使用某种IsCurrent标志可以获得什么?

选项2 - 将所有存档记录存储在单独的表中

将有一个表来存储当前的实时测量值

CREATE TABLE [dbo].[WeatherMeasurement](
  MeasurementID [int] Identity(1,1) NOT Null,
  TownID [int] Not Null,
  Temp [int] NOT Null,
  Date [datetime] NOT Null,
)
Run Code Online (Sandbox Code Playgroud)

还有一个存储历史存档日期的表(也许是由触发器插入)

CREATE TABLE [dbo].[WeatherMeasurementHistory](
  MeasurementID [int] Identity(1,1) NOT Null,
  TownID [int] Not Null,
  Temp [int] NOT Null,
  Date [datetime] NOT Null,
)
Run Code Online (Sandbox Code Playgroud)

这具有以下优点:保持主要当前数据精简并且非常有效地查询,代价是使模式更复杂并且插入数据更昂贵.

哪个是最好的选择?我还没有提到更好的选择吗?

注意:我已经简化了模式以帮助更好地集中我的问题,但是假设每天会插入大量数据(100,000条记录),并且数据是最新的一天.目前的数据与历史数据一样可能被查询.

Cha*_*ana 13

它取决于应用程序使用模式...如果使用模式表明将比当前值更频繁地查询历史数据,则将它们全部放在一个表中......但如果历史查询是例外,(或者小于10%的查询,以及更常见的当前值查询的性能会受到将所有数据放在一个表中的影响,那么将这些数据分成它自己的表是有意义的...


God*_*eke 5

我会将数据保存在一个表中,除非您对当前数据(使用中)或历史数据(数量)有非常严重的偏差.在大多数情况下,具有DATE + TOWNID(按此顺序)的复合索引将消除性能问题(尽管我们目前还没有确定数据的数据).

我想知道的一件事是,是否有人想要一个城镇的当前和历史数据的数据.如果是这样,您只需创建至少一个新视图以担心该方向上可能出现的性能问题.

遗憾的是,您可能需要根据实际数据分析解决方案.我个人在很多情况下使用了上面指定的复合索引,但是有一些边缘情况我选择将历史记录分成另一个表.好吧,实际上是另一个数据文件,因为问题是历史记录非常密集,我单独创建了一个新的数据文件,以避免膨胀整个主数据文件集.性能问题很少通过理论解决.

我建议阅读索引使用的查询提示,以及"覆盖索引"以获取有关性能问题的更多信息.

  • 我会稍微修改你的陈述"性能问题很少解决理论*单独*." 了解理论是在优化过程中获得良好预感的唯一方法 - 否则你只是在四处挣扎,可能永远不会改善性能.我认为这就是你的意思.:) (2认同)