【问题标题】:Will indexing improve varchar(max) query performance, and how to create index索引是否会提高 varchar(max) 查询性能,以及如何创建索引
【发布时间】:2012-05-12 11:08:32
【问题描述】:

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

我的情况是我有一个 SQL Server 2008 数据库表,该表有一个 varchar(max) 列,通常填充 很多 文本。

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

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

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

【问题讨论】:

    标签: sql-server sql-server-2008 indexing full-text-indexing database-optimization


    【解决方案1】:

    我见过的关于为什么索引无助于 '%wildcard%' 搜索的最佳类比:

    两个人。递给每个人相同的电话簿。对你左边的人说:

    告诉我这本电话簿中有多少姓“Smith”的人。

    现在对你右边的人说:

    告诉我这本电话簿中有多少人名字是“Simon”。

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

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

    【讨论】:

    • 这是我经常使用的类比。
    【解决方案2】:

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

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

    【讨论】:

    • 迭戈,我的理解是我可以在 varchar(max) 列上建立索引,只要它是一个非聚集的离线索引并且 var(max) 列是 INCLUDEed,例如。 CREATE NONCLUSTERED INDEX IndexName ON TableName(SomeColumn) INCLUDE(VarcharMaxColumn) WITH (ONLINE=OFF)
    • varchar(max) 只能包含在索引中,这意味着只有叶级别会参与索引,这意味着它几乎不会用于搜索查询
    • WITH (ONLINE=OFF) 不是索引的属性。表示索引在创建过程中会被设置为离线。如果将其设置为 ON,则将在 tempDB 上创建索引,并且在索引创建过程中可以访问该表。它应该用于创建索引需要很长时间并且在创建过程中无法访问表的大表
    【解决方案3】:

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

    但是,您可能会考虑使用全文搜索,这适用于这种情况 (see here)。

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-10-28
        • 2014-01-23
        • 2014-06-10
        • 1970-01-01
        • 2020-06-22
        • 2014-11-25
        • 1970-01-01
        相关资源
        最近更新 更多