[英]SqlServer and nvarchar(max)
我們目前正在考慮將字符串列設置為nvarchar(max)
而不是指定特定長度以防止在數據庫中沒有足夠空間存儲字符串的任何問題。 我只是想知道這是否是一件好事,或者它是否會導致任何問題,因為它可以做到那么為什么指定長度,如nvarchar(10)
而不是nvarchar(max)
。 我們也varbinary(max)
使用varbinary(max)
因為我們不知道我們需要多少二進制數據所以我不知道這是多少效果或者說我們的插入沒有我想的那么快。 這是一個示例表:
CREATE TABLE [dbo].[SAMPLETABLE] (
[ID] [uniqueidentifier] NOT NULL,
[FIELD1] [int] NOT NULL,
[FIELD2] [nvarchar] (2000) NULL,
[FIELD3] [nvarchar] (max) NULL,
[FIELD4] [uniqueidentifier] NULL,
[FIELD5] [int] NULL,
[FIELD6] [nvarchar] (2000) NULL,
[FIELD7] [varbinary] (max) NULL,
[FIELD8] [varbinary] (max) NULL,
[FIELD9] [varbinary] (max) NULL,
[FIELD10] [uniqueidentifier] NULL,
[FIELD11] [nvarchar] (2000) NULL,
[FIELD12] [varbinary] (max) NULL,
[FIELD13] [varbinary] (max) NULL,
[FIELD14] [bit] NULL,
[FIELD15] [uniqueidentifier] NULL,
[FIELD16] [varbinary] (max) NULL,
[FIELD17] [bit] NULL,
[FIELD18] [tinyint] NULL,
[FIELD19] [datetime] NULL,
[FIELD20] [nvarchar] (2000) NULL,
PRIMARY KEY CLUSTERED
(
[ID] ASC
)
) ON [PRIMARY]
GO
給定這樣的表設計並將nvarchar(2000)
更改為nvarchar(max)
會使事情變得更糟(或更好)? sqlserver不喜歡這樣的設計嗎?
如果你對J. Random Developer感到高興,6個月后,將莎士比亞的作品插入每一欄,那就好了。
對我來說,數據建模的很大一部分是認真思考我希望在每列中允許哪些數據,以及我希望禁止哪些數據。 然后我應用適當的CHECK
約束來實現這些限制(最好的SQL Server允許)。 “免費”進行合理的長度檢查似乎總是一種獎勵。
你也沒有做太多的“未來驗證” - 我相信,在以后將(n)varchar列的長度更改為更大的值,純粹是元數據操作。 所以我會說適當的列大小適合你今天要處理的數據(好的,明年左右)。 如果以后需要擴展它們,則需要幾秒鍾。
我們希望您不要使用該列進行搜索或具有唯一值...
索引不能超過900字節寬所以你可能永遠不會創建索引。 這是一個缺點:因為它給出了
它可以解決計算列,但為什么不存儲你需要的 ?
從行內類型切換到BLOB類型始終是一個重大決定。 您必須內部化BLOB類型( VARCHAR(MAX)
, NVARCHAR(MAX)
和VARBINARY(MAX)
)在行內類型內部是完全不同的類型:
ALTER INDEX ... REBUILD ... WITH (ONLINE= ON)
異常ALTER INDEX ... REBUILD ... WITH (ONLINE= ON)
。認為既然你的表已有BLOB,這不會是個問題 因此,將所有列切換為BLOB類型可能會帶來許多您未考慮的副作用:無法索引BLOB列,缺少在線操作,由於BLOB固有的較慢代碼等導致的一般性能下降等等。最嚴重的障礙可能是事實上,在將BLOB作為BLOB之后,您將無法對列進行索引。 如果這不是一個顯示阻止,那么你將不得不測試和衡量性能影響。
其他已經提出的數據建模問題一般都是有效的,但據我所知,在現實世界中,理論只能在理論上起作用...
答案與“當我可以將所有數字存儲為字符串時為什么需要指定int?”的答案相同。 - 因為它有助於:
但它不會立即引起任何明顯的“問題”,因為nvarchar(10)是nvarchar(max)的子集。
以下是我給另一個想要無盡桌子的人的答案:
對於任何關系數據存儲,上述位置都不是最優設計。 Pop為數據添加黃鼠狼:只需選擇一個你可能得到的數據。
也許沒有sql解決方案可以更好地工作,因此您可以擁有動態數據而不用擔心列限制。
我想如果我們要回答問題,那么我也認為在有不良設計的替代方案時,我們應該提供最好/更好的做法。
想想像KM上面提到的那個人
根據我的經驗,不過很多2000字符長的字段最終會被索引。 我認為使用nvarchar(max)比一些任意長度要好得多,如果數據不夠長,你可能需要截斷數據。
我看到的一個例子是一個錯誤日志表,其中表設計者還沒有准備好將調用堆棧存儲在nvarchar(max)字段中,因此他們存儲了前n個字符,導致截斷的調用堆棧最有趣部分缺失。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.