VARCHAR列上的索引


一年前,我寫了在索引的導航結構里,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/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM