在sqlserver 2008数据库中,我们有一个包含10列的表。在Web应用程序中,用户界面旨在允许用户在部分或全部列上指定搜索条件。 Web应用程序调用一个存储过程,该存储过程只使用where子句中指定的选项动态创建sql语句,然后使用sp_executesql执行查询。用于搜索关键字的SQLServer索引
索引这些列的最佳方法是什么?我们目前有10个索引,每个索引都有不同的列。我们应该有10个指数还是其他组合?
在sqlserver 2008数据库中,我们有一个包含10列的表。在Web应用程序中,用户界面旨在允许用户在部分或全部列上指定搜索条件。 Web应用程序调用一个存储过程,该存储过程只使用where子句中指定的选项动态创建sql语句,然后使用sp_executesql执行查询。用于搜索关键字的SQLServer索引
索引这些列的最佳方法是什么?我们目前有10个索引,每个索引都有不同的列。我们应该有10个指数还是其他组合?
优化动态搜索查询的圣经写由SQL Server MVP厄兰Sommarskog:
http://www.sommarskog.se/dyn-search.html
对于SQL Server 2008的具体做法是:
http://www.sommarskog.se/dyn-search-2008.html
有很多的信息在这里消化,你最终决定什么取决于查询是如何形成的。是否有某些参数始终在搜索?是否有通常一起请求的某些参数组合?你能真正买得起创建于每列索引(记住,不是所有会即使多个列在where子句中提到使用[编辑] 一定和额外的指标不是“自由” - 一分钱一分货他们在维修)?
每列一个索引。问题在于你对这些查询毫无头绪,这是最通用的方法。
的化合物,当索引中的搜索条件指定最左边的键才能使用。如果您对(A, B, C)
有一个指标可以用来搜索值WHERE A [email protected]
,WHERE [email protected] AND [email protected]
,WHERE [email protected] AND [email protected]
或WHERE [email protected] AND [email protected] AND [email protected]
。但是,如果没有指定最左边的键,则不能使用它,WHERE [email protected]
或WHERE [email protected]
不能使用此索引。因此,每列中的10个索引可以分别用于特定的用户标准,但是如果用户在第一列包含标准并且在所有其他情况下无用,则10列中的1个索引才有用。至少这是10000ft的答案。有更多的细节,如果你开始挖掘它。
您的问题和可能的解决方案的全面论述,请参阅Dynamic Search Conditions in T-SQL。
根据我的经验,组合索引确实可以使查询更快。在这种情况下,您不能拥有所有可能的组合。
我会建议做一些使用测试,以确定哪些组合使用最频繁。然后关注组合这些列的索引。如果最常见的组合是:
C1,C2,C3 C1,C2,C5
...然后就C1和C2组合索引。
这完全取决于数据是什么:他们索引(例如只有两个值在列的索引是不会帮你)如何,他们如何可能被搜查,以及如何可能他们将一起搜索。
特别是,如果列A被查询了很多,并且列B只在查询列A时才被查询,则在(A,B)上的复合索引将会使得查询两列的特定值快速,并且还可以免费获得A(而不是B)上的单个索引的好处。
有可能每列一个索引对您的数据有意义,但更有可能不是。考虑到您的数据和模式的性质,可能会有更好的折衷。
我个人不会打扰使用存储过程来创建动态SQL。与使用Web应用程序本身使用的任何服务器端脚本语言相比,没有任何性能优势,并且您正在编写Web应用程序的语言几乎总是会具有比SQL更灵活,可读和安全的字符串处理函数确实。在SQL本身生成SQL字符串是一个痛苦的练习;你几乎肯定会在某处出错,给自己一个SQL注入安全漏洞。