Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql单索引或多索引_Sql_Sql Server_Sql Server 2005_Tsql_Indexing - Fatal编程技术网

Sql单索引或多索引

Sql单索引或多索引,sql,sql-server,sql-server-2005,tsql,indexing,Sql,Sql Server,Sql Server 2005,Tsql,Indexing,假设我有产品表 在我的UI上,我允许用户按名称、描述、代码进行搜索 用户只能根据条件进行搜索 我是否应该为每个条件创建索引:名称、描述、代码 还是为所有3个创建一个索引 什么会让你选择一个而不是另一个呢?你需要为每一个都建立一个索引。所有三个索引中的一个索引只对涉及索引中第一个条件或与第二个条件组合的搜索有利。如果将搜索限制为使用字符串匹配开头模式('search%'),则该列上需要一个索引。此索引是有序的数据,可以查找以查找第一个匹配项,并持续读取,直到找到最后一个匹配项 如果您有一个无约束的

假设我有产品表

在我的UI上,我允许用户按名称、描述、代码进行搜索 用户只能根据条件进行搜索

我是否应该为每个条件创建索引:名称、描述、代码 还是为所有3个创建一个索引


什么会让你选择一个而不是另一个呢?

你需要为每一个都建立一个索引。所有三个索引中的一个索引只对涉及索引中第一个条件或与第二个条件组合的搜索有利。

如果将搜索限制为使用字符串匹配开头模式('search%'),则该列上需要一个索引。此索引是有序的数据,可以
查找
以查找第一个匹配项,并持续读取,直到找到最后一个匹配项

如果您有一个无约束的搜索模式(“%search%”),或者允许对三列的任意组合进行搜索,则需要为所有三列创建一个索引。此索引是列的副本,其扫描速度可能比原始表快

一如往常,量体裁衣,量体裁衣

SET STATISTICS IO ON
SET STATISTICS TIME ON

答案是:视情况而定

优化器是根据表的统计信息以及表和查询中列的索引来决定的。强制索引并不能确保最有效/性能最佳的查询


您所能做的就是使用实际执行计划(子树成本越低越好)针对最可能的查询测试各种索引方法,并选择最适合您的方法。

每当您在多列上构建索引时,例如
创建索引。。在T(A,B,C)
上,只有指定了最左边的列,才能使用索引。如果搜索列
A
,则可以使用索引。如果搜索列
A
B
,则可以使用索引。如果搜索列
A
B
C
,则可以使用索引。但是,如果您仅在
B列
上搜索,或仅在
C列
上搜索,或仅在
B列
C列
上搜索,则不会使用索引


所以,若你们想搜索产品、描述或代码,你们需要在每一个上分别建立索引。如果您想在这三列中的任何一列中搜索一个术语,那么很可能需要进行全文搜索。描述也是一样,你不太可能想要一个普通的索引,很可能你需要一个全文索引。

其他的都是正确的,你需要为每一列建立索引。然而,我想补充两件事:

  • 无论结果的顺序如何(升序、降序),一个索引(每列)就足够了

  • >P>对于标题和描述等列,您可能需要考虑全文搜索,而不是常规的SQL比较和类似的过滤器。


    +1-理想情况是有一个覆盖查询的索引。如果一次只查询一个条件,则需要单独的索引。如果在同一个查询中使用所有3个,则需要一个覆盖索引。谢谢,解释得很好。