【问题标题】:SQLServer indexing for search critieria搜索条件的 SQL Server 索引
【发布时间】:2011-08-17 18:31:19
【问题描述】:

在 sqlserver 2008 数据库中,我们有一个包含 10 列的表。在 Web 应用程序中,用户界面旨在允许用户在某些或所有列上指定搜索条件。 Web 应用程序调用一个存储过程,该过程动态创建一个仅在 where 子句中指定选项的 sql 语句,然后使用 sp_executesql 执行查询。

索引这些列的最佳方法是什么?我们目前有 10 个索引,每个索引都有不同的列。我们应该有 1 个索引和所有 10 个索引,还是其他组合?

【问题讨论】:

    标签: sql-server sql-server-2008 indexing


    【解决方案1】:

    关于优化动态搜索查询的圣经是由 SQL Server MVP Erland Sommarskog 编写的:

    http://www.sommarskog.se/dyn-search.html

    专门针对 SQL Server 2008:

    http://www.sommarskog.se/dyn-search-2008.html

    这里有很多信息需要消化,您最终的决定将取决于查询的形成方式。是否有某些参数总是被搜索?是否存在通常一起请求的某些参数组合?你真的能负担得起在每一列上创建一个索引吗(请记住,即使 where 子句中提到了多个列,也不是所有的都会 [edit] 必要索引不是“免费的”——您需要为它们支付维护费用)?

    【讨论】:

      【解决方案2】:

      只有在搜索条件中指定了最左边的键时,才能使用复合索引。如果您在(A, B, C) 上有一个索引,它可以用于搜索值WHERE A =@aWHERE A=@a AND B=@bWHERE A=@a AND C=@cWHERE A=@a AND B=@b AND C=@c。但是如果不指定最左边的key就不能使用,WHERE B=@b或者WHERE C=@c不能使用这个索引。因此,每列中的 10 个索引都可用于特定的用户条件,但 10 列上的 1 个索引仅在用户包含第一列的条件时才有用,而在所有其他情况下无用。至少这是 10000 英尺的答案。如果您开始深入研究,还有更多细节。

      有关您的问题和可能的解决方案的全面讨论,请参阅Dynamic Search Conditions in T-SQL

      【讨论】:

        【解决方案3】:

        这完全取决于数据是什么:它们的索引程度(例如,只有两个值的列上的索引对您没有多大帮助)、它们被搜索的可能性以及它们的可能性有多大将被搜索一起

        特别是,如果 A 列被大量查询,而 B 列往往只在同时查询 A 列时被查询,则 (A, B) 上的复合索引将使搜索两列特定值的查询非常快速,并且还免费为您提供 A(但不是 B)上的单个索引的好处。

        每列有一个索引可能对您的数据有意义,但更有可能不是。考虑到数据和架构的性质,可能会有更好的权衡。

        我个人不会费心使用存储过程来创建动态 SQL。与您在 webapp 本身中使用的任何服务器端脚本语言相比,没有性能优势,而且您编写 webapp 所用的语言几乎总是比 SQL 具有更灵活、可读和安全的字符串处理功能做。在 SQL 本身中生成 SQL 字符串是一项痛苦的练习;你几乎肯定会在某个地方出现一些转义错误,并给自己一个 SQL 注入安全漏洞。

        【讨论】:

          【解决方案4】:

          每列一个索引。问题是您对查询一无所知,这是最通用的方式。

          【讨论】:

            【解决方案5】:

            根据我的经验,组合索引确实使查询速度更快。在这种情况下,您不可能拥有所有可能的组合。

            我建议进行一些使用测试,以确定最常用的组合。然后专注于组合这些列的索引。如果最常见的组合是:

            C1、C2、C3 C1、C2、C5

            ...然后在 C1 和 C2 上进行组合索引。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2010-09-14
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2010-10-31
              相关资源
              最近更新 更多