我有以下查询(为问题而简化)我正在尝试加快只读数据库的速度...
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 子句可能会导致使用查找来定位要返回的行,但是在该列中的数据很大的情况下,查找将不起作用。您是否只是在执行计划中看到扫描并假设这一定是问题所在?