2011-08-17 32 views
0

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

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

回答

2

优化动态搜索查询的圣经写由SQL Server MVP厄兰Sommarskog:

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

对于SQL Server 2008的具体做法是:

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

有很多的信息在这里消化,你最终决定什么取决于查询是如何形成的。是否有某些参数始终在搜索?是否有通常一起请求的某些参数组合?你能真正买得起创建于每列索引(记住,不是所有会即使多个列在where子句中提到使用[编辑] 一定和额外的指标不是“自由” - 一分钱一分货他们在维修)?

0

每列一个索引。问题在于你对这些查询毫无头绪,这是最通用的方法。

2

的化合物,当索引中的搜索条件指定最左边的键才能使用。如果您对(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

0

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

我会建议做一些使用测试,以确定哪些组合使用最频繁。然后关注组合这些列的索引。如果最常见的组合是:

C1,C2,C3 C1,C2,C5

...然后就C1和C2组合索引。

2

这完全取决于数据是什么:他们索引(例如只有两个值在列的索引是不会帮你)如何,他们如何可能被搜查,以及如何可能他们将一起搜索

特别是,如果列A被查询了很多,并且列B只在查询列A时才被查询,则在(A,B)上的复合索引将会使得查询两列的特定值快速,并且还可以免费获得A(而不是B)上的单个索引的好处。

有可能每列一个索引对您的数据有意义,但更有可能不是。考虑到您的数据和模式的性质,可能会有更好的折衷。

我个人不会打扰使用存储过程来创建动态SQL。与使用Web应用程序本身使用的任何服务器端脚本语言相比,没有任何性能优势,并且您正在编写Web应用程序的语言几乎总是会具有比SQL更灵活,可读和安全的字符串处理函数确实。在SQL本身生成SQL字符串是一个痛苦的练习;你几乎肯定会在某处出错,给自己一个SQL注入安全漏洞。