Sql server sql server中时间序列的最佳性能设计
(TL;DR)Sql server sql server中时间序列的最佳性能设计,sql-server,time-series,Sql Server,Time Series,(TL;DR) 设计要解决的问题: 快速检索不同频率的相关时间序列。 工具: sql server表和索引设计 较长的版本: 我希望使用不同分辨率的时间序列的输入数据,在一个或仅仅特定的时间或间隔计算不同的函数。我的直觉告诉我,我需要额外考虑表/索引的设计,因为对象需要快速连接行 到目前为止,我所看到的设计建议主要涉及检索单个时间序列,而这里的问题是,在同一时间点从不同的时间序列检索值 我的目标总体设计如下: CREATE TABLE [dbo].[time_series_definition]
设计要解决的问题:
快速检索不同频率的相关时间序列。
工具:
sql server表和索引设计 较长的版本:
我希望使用不同分辨率的时间序列的输入数据,在一个或仅仅特定的时间或间隔计算不同的函数。我的直觉告诉我,我需要额外考虑表/索引的设计,因为对象需要快速连接行 到目前为止,我所看到的设计建议主要涉及检索单个时间序列,而这里的问题是,在同一时间点从不同的时间序列检索值 我的目标总体设计如下:
CREATE TABLE [dbo].[time_series_definition](
[ID] [int] IDENTITY(1,1) NOT NULL,
[data_type_description] [nvarchar](100) NULL,
[duration_sec] [int] NOT NULL,
CONSTRAINT [PK_time_series_definition] PRIMARY KEY CLUSTERED
(
[ID] ASC
))
CREATE TABLE [dbo].[time_series](
[ID] [int] IDENTITY(1,1) NOT NULL,
[start_date] [date] NOT NULL,
[end_date] [date] NOT NULL,
[time_series_definition_ID] [int] NOT NULL,
[source] [nchar](30) NULL,
[description] [nvarchar](100) NULL,
[update_time] [datetime2](0) NOT NULL,
CONSTRAINT [PK_time_series] PRIMARY KEY CLUSTERED
(
[ID] ASC
))
ALTER TABLE [dbo].[time_series] WITH CHECK ADD CONSTRAINT [FK_time_series_time_series_definition] FOREIGN KEY([time_series_definition_ID])
REFERENCES [dbo].[time_series_definition] ([ID])
CREATE TABLE [dbo].[data_values](
[ID] [int] IDENTITY(1,1) NOT NULL,
[date_time] [datetime2](0) NOT NULL,
[time_series_ID] [int] NOT NULL,
[value] [decimal](19, 8) NULL,
CONSTRAINT [PK_data_values] PRIMARY KEY CLUSTERED
(
[ID] ASC
))
ALTER TABLE [dbo].[data_values] WITH CHECK ADD CONSTRAINT [FK_data_values_time_series] FOREIGN KEY([time_series_ID])
REFERENCES [dbo].[time_series] ([ID])
值[start_date]、[end_date]是冗余的,但相信当在[data_values]表中查找之前知道序列的开始/结束时,可以提高查询速度
[duration_sec]用于节省[data_values]表中的空间,因为序列在特定序列中的空间是均匀的
因此,对于这种设计,在给定的时间或时间间隔内实现不同序列的快速查找的最佳索引/分区策略是什么 到处都是。这里没有正确或错误的答案。您模糊地要求其他人在几乎没有任何信息的情况下设计您的数据库。我猜你想得太多了。你应该设计你的数据库来存储这种情况下的数据。然后,您开始关注报告要求,并在出现性能问题时处理这些问题。如果您从一开始就拥有设计良好的数据库,那么输出的性能通常是非常直接的。我的问题是,寻求最佳索引策略取决于初始设计。我确实考虑过这个问题,因为索引设计是我设计的最佳方案,但是选择了一个非常开放的问题,希望一些在时间序列上表现更好的设计可能会面面俱到。将我的初始设计添加到问题中。索引大约是60%的技术知识和40%的工艺。实际上,没有一种基于表设计的最佳索引策略。表设计当然是其中的一部分,但查询也很关键。where子句中使用了哪些列?身份真的是最好的聚类索引吗?您预计这些表中有多少行?普通查询返回的行数。所有这些都是索引策略中的因素。我将构建您的系统,并在出现问题时处理索引。