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

标签 sql sql-server performance tsql 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,
)

这将使一切变得简单,但是获取城镇列表和当前温度的最有效查询是什么?一旦表中有数百万行,这个规模还会扩展吗?通过在表中添加某种 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,
)

以及一个用于存储历史存档日期的表(可能由触发器插入)

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

这样做的优点是保持当前主要数据的精简,并且查询非常高效,但代价是使架构更加复杂并且插入数据更加昂贵。

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

注意:我简化了架构以帮助更好地集中我的问题,但假设每天都会插入大量数据(100,000 条记录),并且数据在一天内是最新的。当前数据与历史数据一样有可能被查询。

最佳答案

它取决于应用程序的使用模式...如果使用模式表明历史数据的查询频率比当前值更频繁,则将它们全部放在一张表中...但是如果历史查询是异常(exception),(或少于 10% 的查询),并且更常见的当前值查询的性能将因将所有数据放入一个表中而受到影响,那么将该数据分离到它自己的表中是有意义的...

关于sql - 在 SQL Server 2005/2008 中存储历史数据的最佳方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/296017/

相关文章:

sql-server - 如何找到 SSL 证书完整路径并在存储过程中使用以调用 API

c++ - 从保留的 vector 读取比从非保留的 vector 读取更快?

.net - 拥有多个 DLL 好还是单个大 DLL 好?

mysql - ORDER BY 最大值与分组依据

sql - 如何从 Access 表中获取选择性记录

c# - 无法用两个表创建外键

c++ - 对于基本数据类型,按值传递还是按引用传递更好?

sql - 在多个列上使用索引

sql - 如果路径键在变量 postgresql 中,如何更新 jsonb 值

sql - SSIS - 填充 OLE DB 目标表中未映射的列