jan*_*dic 7 sql-server sql-server-2008-r2
我们有一个包含空间数据和一些属性的表,需要对其进行聚合,以便可以在各种查询中使用。我们有通过 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 | 10 | 8 | 2015-01-03
Run Code Online (Sandbox Code Playgroud)
我们得到的结果是:
FeatureId | MeasureFrom | MeasureTo | Value | Timestamp
1 | 1 | 5 | 2 | 2015-01-01
1 | 5 | 9 | 3 | 2015-01-02
1 | 9 | 10 | 8 | 2015-01-03
1 | 10 | 15 | 3 | 2015-01-02
1 | 15 | 20 | 2 | 2015-01-01
Run Code Online (Sandbox Code Playgroud)
如您所见,结果实际上包含比原始数据更多的行。基本上我们需要该区域内任何一点的最新值。最新值根据时间戳列中的值确定。当间隔内存在间隙时,这应该传播到结果数据集。
代码实际上是用 .NET 编写的,而且相当复杂。算法如下:获取感兴趣特征的所有数据,按时间戳降序对记录进行排序,循环处理所有记录。取区间 (MeasureFrom, MeasureTo),将其与您拥有的结果相交,如果您得到一些您尚未拥有的部分,请将其添加到结果中。继续下一个记录。数据代表定期进行的调查,因此您及时进行的调查越多,丢弃的数据就越多,因为您在同一时间间隔内已经拥有更新的价值。
调查带有随机时间戳,因此它并不总是最新的。然后对其他功能重复相同的过程,因为您可能有兴趣一次获取几个功能的值。这是人们经常查询的结果。
理想情况下,我们希望聚合结果尽可能接近实时。
要更多地解释所需的算法,请参阅@dnoeth 发布的链接(在下面的评论中)http://sqlmag.com/sql-server/packing-intervals-priorities。它通过使用优先级而不是时间戳解决了类似的问题,并且所描述的解决方案使用了 SQL Server 2012 的功能。
从多个数据库读取/连接不太可能比将数据保留在主数据库的一个表中更快,除非第二个数据库位于单独的物理磁盘上。请记住,大多数时候“成本”都在磁盘 IO 上;因此,在这种情况下,为了加快速度,您应该减少或分配磁盘 IO。创建索引、将表分区到不同的磁盘或将聚合表移动到另一个磁盘或另一个数据库可以实现此目的。
听起来您倾向于按计划迁移或存储内容;SSAS 或许能够实现这一目标(我不知道),但可能很难找到相当擅长 SSAS 的人。另一方面,您可以通过 SSIS 轻松安排作业(这可能就是您的意思;SSAS 是分析服务,与多维数据集一起使用;SSIS 是集成服务,它更多地用于在源之间转换和移动数据,例如提取表或查看 CSV 或 Excel 文件中的内容。)
| 归档时间: |
|
| 查看次数: |
3489 次 |
| 最近记录: |