【问题标题】: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
【解决方案2】:
只有在搜索条件中指定了最左边的键时,才能使用复合索引。如果您在(A, B, C) 上有一个索引,它可以用于搜索值WHERE A =@a、WHERE A=@a AND B=@b、WHERE A=@a AND C=@c 或WHERE 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 上进行组合索引。