簡體   English   中英

SQL Server 2012-將2個Varchar(max)列分開以分開表嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM