2013-01-02 70 views
3

我正在設計一個會有很多記錄的交易表。它會有很多的讀寫操作。我應該將XML Blob放入單獨的表中嗎?

用戶上傳一個XML文件將有一個點,我將它存儲在XML類型的數據庫列中。

對於一個給定的事務記錄,這個XML不會像其他所有的一樣經常需要。它可能只會讀取幾次,通常只會插入而不會更新。

我想知道在單獨的表中存儲此XML字段是否有任何優勢。然後,我只能在需要時加入它。我認爲唯一的優勢是「主」桌上的個人記錄將佔用更少的空間。但是,如果我的表格被正確編入索引,那真的很重要嗎?

我懷疑自己是否在過度使用我的優化。我應該將XML字段留在主表上嗎?

我有一個示例XML文件是12KB。我不指望它會比這大得多。我不確定SQL Server的XML數據類型是否會比這更有效地存儲信息。

澄清,這是一對一的關係。每個事務都會有一個XML blob。多個事務不會有一個XML blob。並且每個事務應該最終得到一個XML blob,即使它不是立即的。

感謝, Tedderz

+0

XML blob是否僅與其上傳的交易相關?該交易僅存儲一次,還是將該XML blob存儲在該記錄/帳戶/等的每個交易中。 – Taryn

+0

你認爲XML數據和非XML數據有多大?兩者能否輕鬆融入內存? – usr

+0

@bluefeet是的,只有那一筆交易。它只會被存儲一次,只能存儲一次。 – Tedderz

回答

3

的答案是,你沒有必要爲你修改或以其他方式危及邏輯數據設計以適應這一物理存儲的考慮。

這是因爲在SQL Server中,XML是一種「大值類型」,並且可以控制是否在物理上這些行內或外的行通過sp_tableoption系統過程中使用'large value types out of row'選項的存儲,像這樣:

EXEC sys.sp_tableoption N'MyTable', 'large value types out of row', 'ON' 

如果你把它關閉,超過8000個字節小於XML值將被存儲在行。如果將其設置爲ON,則所有XML值(和[N] Varchar(MAX)列)將被存儲在表外的單獨區域中。 (這裏全部詳細解釋:http://technet.microsoft.com/en-us/library/ms189087(SQL.105).aspx

問題的設置很難說,但一般來說:如果您希望很多檢索/修改此列,我建議將在排隊。否則,將其存儲在行外。

+0

這是一篇很棒的文章,謝謝!我不知道,我會繼續存儲它。 – Tedderz

0

不,你不應該。如果存在一對一的關係,則它屬於同一個表。聯接是昂貴的。

2

如果你的XML比較大,並且在你的查詢中不需要這些信息的用例不少 - 那麼把它放到一個單獨的表中 - 即使有1: 1關係到位。

這裏的動機是這樣的:如果你的「基」表更小,例如不包含XML blob,並且您經常查詢表而不需要需要檢索XML,那麼這個較小的行大小可以導致基表上的性能更好(因爲更多的行適合頁面,因此SQL服務器需要加載較少的頁面來滿足您的一些查詢)。

另外:如果該XML只在少數情況下存在(例如,只有10-20%的行實際上有一個XML blob),這也可能是一個有利於「外包」的因素XML blob到一個單獨的表。

+0

這正是我的想法。我在上面的問題中加了一些說明。 – Tedderz

+1

@Tedderz:好吧 - 既然你的XML blob的大小是12k(因此大於8k SQL Server數據頁面),它將被大部分存儲在「行外」 - 所以也許把它放在放到一個單獨的表格中是不值得的,你需要採取額外的步驟才能使它工作。最後,實際上,你只需要測試一下,看看你是否能從兩個表格中獲得任何(性能)​​好處 - 從邏輯設計的角度來看,顯然這並不是必要的,也不可取。 –

相關問題