Sql-Server
文本或 NVARCHAR(MAX) 欄位的索引策略
我有以下查詢(為問題而簡化)我正在嘗試加快只讀數據庫的速度…
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 子句),那麼就沒有讀取所有數據的捷徑。我能問一下為什麼 a
to_addr
包含超過 4000 個字元的數據,根據 SMTP 標準(取決於您相信的標準),它大概限制為 ~320 個字元?很多人認為掃描不好。如果需要返回大量數據,那麼通常會使用聚集索引掃描。您的 where 子句可能會導致使用查找來定位要返回的行,但是在該列中的數據很大的情況下,查找將不起作用。您是否只是在執行計劃中看到掃描並假設這一定是問題所在?