2008-09-11 205 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表。