索引是否会提高varchar(max)查询性能,以及如何创建索引

joh*_*hna 14 sql-server indexing full-text-indexing sql-server-2008 database-optimization

首先,我应该指出我对SQL Server索引知之甚少.

我的情况是我有一个SQL Server 2008数据库表,其中varchar(max)列通常填充了大量文本.

我的ASP.NET Web应用程序有一个搜索工具,可以在此列中查询关键字搜索,并且根据搜索的关键字数量,可能是SQL查询中的一个或多个LIKE'%keyword%'语句来进行搜索.

我的Web应用程序也允许通过此表中的各个其他列进行搜索,而不仅仅是一列.其他表也有一些连接.

我的问题是,是否值得在此列上创建索引以提高这些搜索查询的性能?如果是这样,什么类型的索引,只是索引一列是足够的,还是我需要包括其他列,如主键和其他可搜索的列?

Aar*_*and 23

我见过的最好的比喻,为什么索引不会帮助'%wildcard%'搜索:

带两个人.递给每一本同一本电话簿.跟你左边的人说:

告诉我这本电话簿中有多少人姓"史密斯".

现在对你右边的人说:

告诉我这本电话簿中有多少人的名字是"西蒙".

索引就像电话簿.很容易寻找一开始的事情.很难扫描中间或末尾的东西.

每次我在会话中重复这个,我都会看到灯泡继续播放,所以我认为在这里分享可能会有用.


Die*_*ego 18

您无法在varchar(max)字段上创建索引.索引上的最大字节数为900.如果列大于900字节,则可以创建索引,但任何超过900字节的插入都将失败.

我建议你阅读全文搜索.在这种情况下它应该适合你

  • varchar(max) 只能包含在索引中,这意味着只有叶级别才会参与索引,这意味着它几乎不会用于搜索查询 (2认同)
  • WITH (ONLINE=OFF) 不是索引的属性。表示索引在创建过程中将被设置为离线。如果将其设置为 ON,将在 tempDB 上创建索引,并且在索引创建过程中可以访问该表。适用于创建索引需要较长时间且创建过程中不能访问表的大表 (2认同)

McG*_*gle 9

如果您正在进行LIKE'%keyword%'搜索,那么创建常规索引是不值得的.原因是索引的工作方式就像搜索字典一样,从中间开始然后分割差异直到找到单词.通配符查询就像要求您查找包含文本"to"或其他内容的单词 - 查找匹配项的唯一方法是扫描整个字典.

但是,您可以考虑使用全文搜索,这适用于此类场景(请参阅此处).