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

Sql server 索引是否会提高varchar(max)查询性能,以及如何创建索引,sql-server,sql-server-2008,indexing,full-text-indexing,database-optimization,Sql Server,Sql Server 2008,Indexing,Full Text Indexing,Database Optimization,首先,我应该指出,我对SQL Server索引了解不多 我的情况是,我有一个SQLServer2008数据库表,它有一个varchar(max)列,通常填充了大量文本 我的ASP.NET web应用程序有一个搜索工具,可以在此列中查询关键字搜索,根据搜索关键字的数量,可以在SQL查询中使用一个或多个类似“%keyword%”的语句进行搜索 我的web应用程序还允许按此表中的各种其他列进行搜索,而不仅仅是这一列。还有一些来自其他表的连接 我的问题是,是否值得在此列上创建索引以提高这些搜索查询的性能

首先,我应该指出,我对SQL Server索引了解不多

我的情况是,我有一个SQLServer2008数据库表,它有一个varchar(max)列,通常填充了大量文本

我的ASP.NET web应用程序有一个搜索工具,可以在此列中查询关键字搜索,根据搜索关键字的数量,可以在SQL查询中使用一个或多个类似“%keyword%”的语句进行搜索

我的web应用程序还允许按此表中的各种其他列进行搜索,而不仅仅是这一列。还有一些来自其他表的连接


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

最好的方法是创建一组类似于现实生活中发生的测试查询,并尝试在有索引和无索引的情况下对数据库运行它们。但是,一般来说,如果您执行许多SELECT查询,而很少执行UPDATE/DELETE查询,则索引可能会使您的查询更快


但是,如果您进行了大量更新,索引可能会影响您的性能,因此在做出此决定之前,您必须知道您的数据库将必须处理何种查询。

如果您正在进行像“%keyword%”这样的搜索,则不值得创建常规索引。原因是索引工作就像搜索字典,从中间开始,然后拆分,直到找到单词。这种通配符查询就像要求您查找包含文本“to”或其他内容的单词——查找匹配项的唯一方法是扫描整个词典


您可能会考虑全文搜索,但这是针对这种场景()的。

< P>不能在VARCHAR(MAX)字段上创建索引。索引上的最大字节数为900。如果列大于900字节,则可以创建索引,但任何超过900字节的插入都将失败


我建议你阅读有关搜索的内容。在这种情况下,它应该适合您

这是我所见过的最好的类比,解释了为什么索引无助于
'%wildcard%'
搜索:

拿两个人。把同一本电话簿递给每个人。对你左边的人说:

告诉我这个电话簿上有多少姓“史密斯”的人。

现在对你右边的人说:

告诉我这个电话簿中有多少人的名字是“西蒙”。

索引就像电话簿。很容易找到一开始的东西。很难扫描中间或结尾的东西。


每次我在会话中重复这一点时,我都会看到灯泡亮起,所以我认为在这里分享可能很有用。

Diego,我的理解是,我可以在varchar(max)列上建立索引,只要它是一个非聚集的脱机索引,并且var(max)列是included,例如,在TableName(SomeColumn)上创建非聚集索引IndexNameINCLUDE(VarcharMaxColumn)WITH(ONLINE=OFF)varchar(max)只能包含在索引中,这意味着只有叶级别才会参与索引,这意味着它几乎不会用于搜索查询,而(ONLINE=OFF)不是索引的属性。它表示索引将在创建期间设置为脱机。如果将其设置为ON,将在tempDB上创建索引,并且在索引创建过程中可以访问该表。它应该用于创建索引需要很长时间并且在创建过程中无法访问的大型表。这是我经常使用的类比。