2008-09-11 70 views
2

我熟悉SQL Server索引视图(或Oracle物化视图),我们在我们的OLAP应用程序中使用它们。它们具有非常酷的功能,能够篡夺执行计划并将其重新映射到索引视图,无需更改现有代码。OLTP中的索引视图?

IE。假设我有一个非常昂贵的SPROC连接。

SELECT [某些列]
FROM表1 INNER JOIN表2 [详情]
INNER JOIN表3 [一批更多JOINS] ...

如果我撰写这举行的索引视图类似的结果集,那么查询优化器很可能会将SPROC发送到我的索引视图,而不是基表,并且性能会有很大提升。

现在说我想在OLTP!中使用索引视图!?我的意思是大多数OLTP(如本站点)相对较重,如果它们的连接费用很高,那么我们可以加快它们的速度并可能减少锁定争用(http://www.codinghorror.com/blog/archives/001166.html)。更好的是,你不必更改任何代码,只需编写索引视图即可。

但是,这也意味着数据库变得更大,因为我们需要保持这些数据的副本索引视图...

有没有人使用索引视图解决在OLTP争或速度的问题?我怎么从未见过这种使用?

回答

5

物化视图可用于报告OLTP,特别是大量行被聚合以获取结果。空间要求完全取决于您保存的数据量。把它看作一个缓存。

棘手的问题在于报告的数据需要多长时间,以及OLTP性能可达到多少。如果有些陈旧的数据没有问题,那么您可以在系统活动较少时安排视图的更新。

有一次,我不能,也需要非常当前的数据,我最终使用了一些自定义开发。对基表的每次更新都触发了一条向事务表写入记录的触发器。该视图查看了一个缓存聚合,加上存储在事务表中的增量。由于系统资源允许,交易作为增量交易应用于聚合表。这使我获得了第二个数据,报告的性能良好(唯一的聚合发生在最近的事务中)并且对数据库的负载相当小(每次写入只增加一倍,而不是每次都重新计算大量聚合)。

不幸的是,维护起来很复杂,并没有使用简单的内置工具。如果您可以等待报告数据,通常最好使用内置的物化视图并推迟刷新。

+0

在OLTP中创建了这些物化视图还是将它们存储在别处?如果它们是在OLTP中创建的,它是如何影响数据库大小和性能的。这些OLTP在**实体化视图被放下之前是否有重负载**? – Tyler 2008-09-11 19:51:04

2

我们使用物化视图来加速我工作的地方。通常针对OLTP系统的报告。我们的许多报告都是从数据仓库运行的,但是由于我们在一夜之间刷新了仓库,直到数据必须来自OLTP表。