2009-10-20 106 views
1

我有一個執行連接到數據庫的報告,用戶名爲my_report_user。報告中可能有許多最終用戶。並在每次執行一個新的連接到數據庫將與my_report_user(沒有連接池)本地vs全球臨時表 - 什麼時候使用?

我有一個結果集,我認爲可以只創建一次(可能是在第一次運行的報告)其他報告執行可以重複使用這些東西。基本上每個報告執行應檢查此結果集(存儲爲臨時表)是否存在。如果它不存在,則創建該結果集,然後重新使用可用的。

我應該使用local臨時表(#)或global臨時表(##)?

有沒有人試過這樣的東西,如果是的話,請讓我知道我應該關心什麼東西? (幾乎同時報告運行等)

編輯:我使用的SQL Server 2005中

+0

什麼版本的SQL Server?如果2005+,CTE(也可能是遞歸CTE)是另一種選擇。如果不瞭解更多有關您需要如何處理它們的信息,我推薦使用本地全局臨時表...... – 2009-10-20 17:44:58

+0

做出最壞情況的假設:全局臨時表不會因爲連接仍然存在而丟失,該表中的數據失效?即定義何時必須刷新數據以避免報告中的錯誤數據? – 2009-10-20 17:48:04

+0

其sql-server 2005.你確定本地臨時表允許我重新使用。我在考慮本地臨時表將不允許跨多個報告執行的可重用性。現在知道這個版本,你說什麼? – peakit 2009-10-20 17:48:35

回答

4

無論

如果你希望緩存自己的控制下,結果的結果集,那麼你就不能使用任何類型的臨時表。你應該使用普通用戶表,存儲在tempdb中,或者甚至有你自己的結果集緩存數據庫。

臨時表,bot #local和##共享的壽命由連接控制。如果您的應用程序斷開連接,臨時表將被刪除,這與您描述的不一致。

真正困難的問題將是在concurnt運行下填充這些緩存結果集,而不會混淆(最終結果集包含來自同時報告運行的重複項目,這兩個項目都被認爲是'第一次'運行)。

作爲便箋,SQL Server Reporting Services已經開箱即用。您可以緩存和共享數據集,可以緩存和共享報告,它已經可以工作並且已經過測試。

+0

「真正困難的問題是將這些緩存的結果集合填充到concurent下,而不會混淆」我也擔心這件事。感謝您的幫助,順便說一句。 – peakit 2009-10-20 18:01:54

+2

您可以使用應用程序鎖。使用標識您正在查看的報告的資源,例如。 「2009財年北西部銷售報告」,或「報告編號42」。 1. sp_getapplock'shared','session'。 2.檢查數據集(如果存在),將其用於報告,然後釋放應用程序鎖定並退出。 3.如果不存在,則釋放應用程序loc,將其還回X sp_getapplock'獨佔','會話'。 4.再次檢查報告是否存在,如果沒有創建並使用它,則釋放鎖定並退出。 5.如果在獲得X鎖定後報告存在,則釋放x鎖定,返回步驟1. – 2009-10-20 18:11:24

+0

我很感謝您的知識。但仍然有可能引擎清除結果集(當沒有到## temp表的活動連接時)。這打破了我緩存的目的。說啥?雖然你給的任何鎖定機制都可以解決併發問題...... – peakit 2009-10-20 18:26:12

0

聽起來您現在正在進入OLTP模式。閱讀數據庫倉庫一定會對你有所幫助。

3

我發現#temp表可以在某些情況下有用,但不是最佳實踐。我還沒有找到全球##臨時表的有效用法,無論是在我自己的工作中,還是在任何其他寫過關於它們的人的工作中。我能想到的唯一情況是BCP或其他需要構建臨時數據存儲的外部進程,然後在後續步驟中檢索它。在這種情況下,我寧願使用帶有某種鍵和後臺進程的永久表來處理清理。

相關問題