2011-06-07 66 views
10

刷新準備好的報告表大約需要5-10分鐘。我們希望不斷刷新本表(可能每15分鐘或連續刷新一次)。如何定期重建非常頻繁訪問的報表?

我們非常頻繁地查詢此報告表(每分鐘多次),並且我無法在任何時間長度內保留它。如果數據是15分鐘的話就沒關係。

我不能刪除表並重新創建它。我無法刪除表格的內容並重新創建它。

是否有我應該使用的技術,例如在兩個表之間進行交換(在構建另一個表時從一個表中讀取)還是將這個5-10分鐘的過程放入大型事務中?

+0

當您實施解決方案時,您是否使用sp_getapplock?而且,如果你這樣做,sp_getapplock是否只包含你的SYNONYM的DROP和CREATE? – mg1075 2011-07-31 01:17:28

回答

13

Use synonyms?。在創建時,這指向tableA。

CREATE SYNONYM ReportingTable FOR dbo.tableA; 

,15分鐘後你創建tableB的和重新定義的代名詞

DROP SYNONYM ReportingTable; 
CREATE SYNONYM ReportingTable FOR dbo.tableB; 

同義詞只是一個指針到實際的表:這樣實際的表的處理重命名等被簡化和抽象化了和所有的代碼/客戶端將使用ReportingTable

編輯,2011年11月24日

同義詞在所有版本可供選擇:分區n切換僅限於Enterprise/Developer。

編輯,2012年2月

可以在標準版(也許快遞,未經測試)

ALTER TABLE .. SWITCH .. 

這將是比同義詞更優雅,如果目標表是空的切換整個表。

編輯,2012年2月(2)

此外,您還可以通過旋轉模式按照Caching joined tables in SQL Server

+0

如果同義詞不斷被使用,是否有可能在不出錯的情況下重新創建它?這是否需要重試機制? – 2011-06-07 16:58:18

+0

@克里斯辛普森:同義詞是不使用*本身*。丟棄它並調用break:它不會鎖定或阻止任何事情。在交易中包裝DROP/CREATE應該可以解決這個問題:它仍然更輕,然後與桌面混合 – gbn 2011-06-07 17:05:55

+0

這很有趣。因此DROP將被允許,因爲同義詞已經解析爲正在運行的查詢中的真實表格。我很好奇包裝模式在交易中的變化,並遇到你的答案這一個:http://stackoverflow.com/questions/4166989/alternate-synonym-in-sql-server-in-one-transaction,會是有益的這裏? – 2011-06-07 17:12:29

0

有兩張桌子聽起來像是最簡單的解決方案。

+0

並且有一種簡單的方法可以在它們之間進行交換,或者實現使用哪一種?如果我必須將所有讀取的查詢改爲指向兩個表格,這看起來非常極端。 – Jason 2011-06-07 16:21:49

+0

我會重命名錶中的一個事務。 – MRAB 2011-06-07 16:30:01

+0

無論事務如何,對象名稱仍然必須是唯一的 – gbn 2011-06-07 16:50:32

1

是的,您應該交換表,如果尚未完成,請考慮爲報告表使用不同的服務器或其他物理分區。

近實時報告的推薦方法是從操作系統中卸載讀取,並將報告系統中的讀取活動與寫入活動分開。

您已經完成了第一部分,至少在邏輯上是通過準備好一張表。在用戶的只讀表和用戶更新的單獨表之間進行交換可消除事務之間的寫入讀取衝突。成本是用戶的緩存延遲,但如果需要,應該可以採取措施將準備時間減到最少,並且更頻繁地更換表。

有關實時報告中設計選擇的更多信息,我推薦由Wayne Eckerson編寫的一篇文章,文章爲Best Practices in Operational BI

0

在我們的項目中,我們使用了兩個表,創建/更改視圖切換。

相關問題