close
文章出處

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


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 AutoPoster 的頭像
    AutoPoster

    互聯網 - 大數據

    AutoPoster 發表在 痞客邦 留言(0) 人氣()