一年前,我寫了在索引的導航結構里,SQL Server如何存儲VARCHAR列。我們都知道,在SQL Server里索引(聚集索引,非聚集索引)的鍵列有最大900byte的大小限制。 假設現在你想捉弄下SQL Server,在VARCHAR(8000)的列上創建一個索引,併在索引鍵列上插入超900b ...
一年前,我寫了在索引的導航結構里,SQL Server如何存儲VARCHAR列。我們都知道,在SQL Server里索引(聚集索引,非聚集索引)的鍵列有最大900byte的大小限制。
假設現在你想捉弄下SQL Server,在VARCHAR(8000)的列上創建一個索引,併在索引鍵列上插入超900byte的值。想想,SQL Server會如何反應?不知道?我們來試驗下。在下列代碼里,我創建了有VARCHAR(8000)列的表,併在這列上創建非聚集索引。
USE TempDb GO -- Create a simple table CREATE TABLE Foo ( Bar VARCHAR(8000) ) GO -- Create a simple Non-Clustered Index CREATE NONCLUSTERED INDEX idx_Bar ON Foo(Bar) GO
SQL Server這裡已給你一個插入/更新操作會失敗的警告:
現在糟糕的事情發生了:我插入一條901byte大小列的記錄。
-- Insert a too large index key column... INSERT INTO Foo VALUES(REPLICATE('x', 901)) GO
偶滴神——如你所見,現在插入不會發生:
SQL Server還是會確保我們的鍵大小在900bytes限制內。我們來插入剛好900bytes鍵大小的記錄。
-- This will work INSERT INTO Foo VALUES(REPLICATE('x', 900)) GO
現在這個會正常運行,沒有問題。但如果我們再次更新那列,讓它大於900bytes,會發生什麼?
-- This UPDATE will fail UPDATE Foo SET BAR = REPLICATE('x', 901) GO
UPDATE語句也會失敗!這是對的。SQL Server再次保證鍵大小還是在它限制里。啥收穫?不管你怎麼折騰,你不會打破SQL Server。
感謝關註!
參考文章:
http://www.sqlpassion.at/archive/2016/04/25/indexes-on-varchar-columns/