Sql-Server

文本或 NVARCHAR(MAX) 欄位的索引策略

  • May 1, 2012

我有以下查詢(為問題而簡化)我正在嘗試加快只讀數據庫的速度…

SELECT 
[sysid]
,[Date]=CONVERT(CHAR, DATEADD(D, [date], '1800-12-28'),101)   
,[From]=[from_addr]   
,[To]=[to_addr]  --I'm a very long Text or NVARCHAR(MAX) Field
,[Subject]=[subject]  
,CASE WHEN [attach] = 1 THEN 'Yes' ELSE 'No' END AS 'Att'   
,[Code]=[ccode]   
,[Staff]=[staff]  
,[MatNo]=[mat_no]  
FROM dbo.[email] 
DYNAMIC WHERE CLAUSE ON ANY OF ABOVE

我嘗試添加一些索引,包括覆蓋索引,但我無法按原樣包含 to_addr(作為文本或 NVARCHAR(MAX) col),並且查詢優化器最終使用聚集索引,因為不包含 to_addr 欄位。有什麼方法可以處理這種情況?不幸的是,我僅限於 2005 年。

編輯

嘗試為 to_addr 添加 Full_Text 仍然會進行表掃描。但是,如果我註釋掉該行,它將使用索引。:(該死的文本數據!

為什麼你認為應該使用掃描以外的任何方法來提取所有數據?全文索引並沒有真正的幫助——它可以幫助您搜尋這些列,但如果您只是返回所有數據(對於任何種類的 WHERE 子句),那麼就沒有讀取所有數​​據的捷徑。我能問一下為什麼 ato_addr包含超過 4000 個字元的數據,根據 SMTP 標準(取決於您相信的標準),它大概限制為 ~320 個字元?

很多人認為掃描不好。如果需要返回大量數據,那麼通常會使用聚集索引掃描。您的 where 子句可能會導致使用查找來定位要返回的行,但是在該列中的數據很大的情況下,查找將不起作用。您是否只是在執行計劃中看到掃描並假設這一定是問題所在?

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