Sql-Server

大索引 INCLUDE 欄位將如何影響系統性能?

  • August 29, 2018

這個問題是關於 SQL Server 索引性能的一個varchar(2000)as an INCLUDEin 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。

是的,數據在頁面級別的儲存方式會嚴重影響索引的性能,具體取決於索引的使用方式。

問題是,你可以塞進一個頁面的數據行越多,訪問的頁面就越少,你的系統在大多數情況下就越快。添加一個非常大的列意味著儲存在頁面上的資訊更少,因此,在範圍搜尋或掃描的情況下,必須讀取更多頁面來檢索數據,從而嚴重減慢速度。

要確定這是否是您的查詢或系統上的問題,您必須監控讀取,尤其是查詢使用的頁數。

引用自:https://dba.stackexchange.com/questions/12809