小编jan*_*dic的帖子

在 SQL Server 中聚合、存储和使用数据的最佳方式(触发器、计划作业、SSAS?)

我们有一个包含空间数据和一些属性的表,需要对其进行聚合,以便可以在各种查询中使用。我们有通过 CLR 存储过程即时进行聚合的机制,但我想知道在 SQL Server 2008 R2 中缓存这些聚合数据的最佳方法是什么,因为聚合非常慢。

所以我们有这样的表:

[TableId] [int] NOT NULL,
[FeatureId] [int] NOT NULL,
[MeasureFrom] [float] NOT NULL,
[MeasureTo] [float] NOT NULL,
[Value] [smallint] NOT NULL,
[Timestamp] [datetime2](7) NOT NULL
Run Code Online (Sandbox Code Playgroud)

FeatureId、MeasureFrom 和 MeasureTo 基本上定义了一个区间,而 Rating 是这个区间的值。请注意,FeatureId 实际上引用了来自不同表的真实线条(形状)。我们目前在这个表中有大约 250k 行,它们具有重叠的间隔和各种时间戳(历史记录)。我们的聚合过程试图在所有区间中找到最新的值,因此它需要根据时间戳切割和连接区间并保留相关值。

由于动态查询很慢并且占用大量资源,我们认为我们可能需要创建另一个数据库来存储此聚合的结果。源表不断更新(但不是太频繁,几天更新一次)。

创建此数据库并使聚合值保持最新的最佳方法是什么?我可以考虑使用触发器或计划任务。我没有使用 SSAS 的经验,但这会更合适吗?

需要注意的是,我们有几个类似的表存储略有不同的值(有些表有更多的值列),因此需要一个单独的数据库而不是原始数据库中的另一个表。

使用跨数据库连接从原始数据库中查询这个单独的数据库的速度有多快?

编辑: 为了演示我们的“聚合”的作用,这里有一些示例数据:

FeatureId | MeasureFrom | MeasureTo | Value | Timestamp
1         | 1           | 20        | 2     | 2015-01-01
1         | 5           | 15        | 3     | 2015-01-02
1         | 9 …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2008-r2

7
推荐指数
1
解决办法
3489
查看次数

标签 统计

sql-server ×1

sql-server-2008-r2 ×1