Sql-Server
大索引 INCLUDE 欄位將如何影響系統性能?
這個問題是關於 SQL Server 索引性能的一個
varchar(2000)
as anINCLUDE
in acovering index。我正在嘗試提高緩慢且不穩定的數據庫應用程序的性能。在某些情況下,通過大型 varchar 字元串訪問數據,查詢包括多個字元串操作,如
SUBSTRING()
、SPACE()
和DATALENGTH()
. 這是一個簡化的訪問範例;update fattable set col3 = SUBSTRING(col3,1,10) + '*' + SUBSTRING(col3,12,DATALENGTH(col3)-12) from fattable where substring(col3,10,1) = 'A' and col2 = 2
架構如下所示:
CREATE TABLE [dbo].[FatTable]( [id] [bigint] IDENTITY(1,1) NOT NULL, [col1] [nchar](12) NOT NULL, [col2] [int] NOT NULL, [col3] [varchar](2000) NOT NULL, ...
已定義以下索引,在大文本列上有一個覆蓋欄位。
CREATE NONCLUSTERED INDEX [IndexCol2Col3] ON [dbo].[FatTable] ( [col2] ASC ) INCLUDE( [col3] )
從我讀過的內容來看,將大數據欄位放在索引中是不好的。我已經閱讀了幾篇文章,包括http://msdn.microsoft.com/en-us/library/ms190806.aspx,其中討論了分頁和磁碟大小對索引性能的影響。話雖如此,查詢計劃肯定使用覆蓋索引。我沒有足夠的資訊來確定這在系統負載方面實際花費了我多少。我確實知道,總體而言,系統表現不佳,我擔心這是問題之一。問題:
- 將此
varchar(2000)
列放在索引INCLUDE
中是個好主意嗎?- 由於
INCLUDE
欄位儲存在葉子節點中,它們對索引性能有很大影響嗎?更新:感謝您的出色回复!在某些方面,這是一個不公平的問題——正如你們所說,沒有實際的統計數據和分析就沒有絕對正確的答案。像許多性能問題一樣,我想答案是“視情況而定”。
Ever 是一個大詞,但一般來說,不,我不會將 varchar(2000) 欄位放入 INCLUDE。
是的,數據在頁面級別的儲存方式會嚴重影響索引的性能,具體取決於索引的使用方式。
問題是,你可以塞進一個頁面的數據行越多,訪問的頁面就越少,你的系統在大多數情況下就越快。添加一個非常大的列意味著儲存在頁面上的資訊更少,因此,在範圍搜尋或掃描的情況下,必須讀取更多頁面來檢索數據,從而嚴重減慢速度。
要確定這是否是您的查詢或系統上的問題,您必須監控讀取,尤其是查詢使用的頁數。