![](/img/trans.png)
[英]SQL Server: Better to use varchar(MAX) or keep a separate notes table and INNER JOIN it?
[英]SQL Server 2012 - Separate 2 Varchar(max) columns to separate table?
如果SQL Server 2012表具有2個varchar(max)
列,這些列很少使用並且導致表快速增長,那么將其拆分為一個單獨的表是否有意義?
兩個varchar(max)
列中的數據用於存儲來自API的原始JSON響應。
如果存儲在單獨的表中,則行將被截斷為僅包括前6個月,從而減小了第一個表的表大小。
如果存儲在單獨的表中,則行將被截斷為僅包括前6個月,從而減小了第一個表的表大小。
必須刪除行而不是將其截斷,然后必須通過運行ALTER INDEX ... REORGANIZE WITH (LOB_COMPACTION = ON)
來回收BLOB空間ALTER INDEX ... REORGANIZE WITH (LOB_COMPACTION = ON)
如果您將blob存儲在原始表中,則必須將行更新為SET blob = NULL
,然后使用ALTER INDEX ... REORGANIZE WITH (LOB_COMPACTION = ON)
回收空間ALTER INDEX ... REORGANIZE WITH (LOB_COMPACTION = ON)
因此,當涉及到細節時,使用拆分表imho並不會取得太大的成就。 因此,我堅持使用SQL Server varbinary(max)和varchar(max)數據在單獨表中的早期建議:在拆分中看不到任何好處,但是在拆分之間必須保持行1:1一致時會遇到麻煩。
如果拆分並分區 “ blobs”表,則可能會有情況。 然后,您確實可以通過切換“出”舊分區並將其替換為空分區,然后刪除已切換出的數據,非常有效地重新分配舊空間。 那是要考慮的事情。 當然,當代碼加入兩個“拆分”時,您的代碼必須足夠聰明以考慮斑點可能消失了(例如,使用OUTER JOIN)。
只是給你一個提示。 您可以在很少使用的列上使用SPARSE
。
例:
CREATE TABLE myTable (
id int identity(1,1),
name nvarchar(100),
blob nvarchar(max) SPARSE,
blob2 nvarchar(max) SPARSE
)
稀疏將在頁面內留下一個小標記。 但是擁有nvarchar(max)
通常是不好的做法。 真的需要嗎?
您可以在此處了解更多信息。
這個問題幾乎是重復的,但並非完全相同。
在很大程度上, varchar(max)
列是頁外存儲的。 如果您在查詢中未引用它們,則不會加載它們。 因此,它們幾乎沒有額外的開銷。
如果這些值存儲在同一頁面上,情況將有所不同。 然后刪除它們可以縮小表的大小,並且更少的頁面應該更快地用於select
查詢。 這是有關此主題的有趣博客。
就截斷表而言,您還有其他約束。 對於許多查詢來說,這似乎是一個勝利,所以我認為這提示了將值放在單獨表中的論點。
但是請注意,截斷不是唯一可能的解決方案。 您還可以對數據進行分區(例如按月或周)。 如果分區鍵是所有查詢的一部分,則可以使用分區代替截斷,還可以減小表的有效大小。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.