2011-05-09 229 views
1

在SQL Server 2005中,我有一個涉及大量ish連接的查詢(每個表的數量級從幾千行到幾百萬行,表的平均可能性相當於10-15列的整數和日期時間SQL Server存儲過程中間表

爲了加快查詢速度,我在考慮將一個大查詢分解爲一個存儲過程,該存儲過程執行一些連接,存儲會導致一些臨時表,然後將該臨時表與另一個也是幾個連接結果的臨時表結合在一起。

我目前使用表變量來存儲中間表,以及性能o ne off明顯更好。但在生產中,tempdb似乎存在IO瓶頸。

有沒有更好的方法來思考解決這樣的問題?我的意思是,在這裏使用表變量的方式?

+1

你能給我們提供關於查詢的更多細節嗎?我不認爲將單個基於集合的查詢拆分爲多個臨時表和查詢會使其更快...... – Matthew 2011-05-09 21:53:27

+0

您的執行計劃是如何看待的? – 2011-05-09 21:53:49

+0

涉及大約8個連接。執行計劃是巨大的各種合併,並尋求和掃描各種表 – 2011-05-09 21:55:20

回答

0

表格變量在TempDB中佔用quite a lot of memory

在大型生產環境中,我看到比我爲此目的而使用標準表更好的SQL編碼器;它們本質上是臨時表,但是它們將它們創建爲常規表並給它們一個特殊的前綴或後綴。這有額外的好處(如臨時表)能夠利用索引來幫助執行。

如果您可以使用標準表或利用可由複雜執行的所有步驟訪問的臨時表,則可以解決內存問題。

認爲它是緩存數據的地方。事實上,每次運行主存儲過程時,都可以更新這個「緩存」,只要確保使用適當的事務並鎖定即可。

想象一下替代方案 - 如果在存儲過程中使用巨大的表變量,並且存儲過程同時執行10或20次...該表變量可能不再只存在於內存中。