sql - 在这个demo中,我应该在每一列上创建一个索引还是只创建一个非聚集索引(Index Scan、Seek)

标签 sql sql-server

测试 DDL:

CREATE TABLE TestTable([col1] varchar(2), [col2] varchar(2), [col3] varchar(2));   
INSERT INTO TestTable ([col1], [col2], [col3]) VALUES ('a1', 'b1', 'c1');

示例1(只有一个非聚集索引):

Create Nonclustered Index Index_TestTable  on  TestTable ([col1], [col2], [col3]) ;

select  [col2], [col3] from TestTable
where  [col2] = 'b1'  ;

结果:

Index Scan

示例2(两个非聚集索引):

Create Nonclustered Index Index_TestTable  on  TestTable ([col1], [col2], [col3]) ;
Create Nonclustered Index Index_TestTable2  on  TestTable ([col2], [col1], [col3]) ;
select  [col2], [col3] from TestTable
where  [col2] = 'b1'  ;

结果:

Index Seek

问:我应该在每一列上创建索引还是只创建一个索引?

ps. 选择 .. 其中 col1,col2,col3 的列顺序是随机的。

最佳答案

您没有提供任何关于为什么需要在这些列上建立索引的信息,但作为一般经验法则,我可以告诉您,在表的每一列上创建索引并不是正确的方法。

非聚集索引可以提高您的搜索性能,但会对您的插入/更新/删除操作产生负面影响(并且您可能会浪费存储空间)。

如果向表中添加新的非聚集索引,实际上会创建一个新表来维护该索引。例如,如果您在 LastName 列上创建非聚集索引,那么您将创建一个新表来存储 LastName 的排序列表,并带有指向相应的指针排。如果您在 LastName 上搜索表,这可以提高您的性能,但它会对表更新产生负面影响,因为每次更新表时,您也需要更新/排序索引。 p>

非聚集索引只能在您经常搜索的列上创建。

关于sql - 在这个demo中,我应该在每一列上创建一个索引还是只创建一个非聚集索引(Index Scan、Seek),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51238228/

相关文章:

mysql - 我是否必须时不时地创建一个特定的非聚集索引?

sql - 利用索引对 VARBINARY 进行前缀查询

mysql - Sql查询选择一对多关系中最新的两个表

sql - 如何从 SQL XML 查询中选择标签?

java - Findbugs错误 "Load of known null value"SQL连接

c# - 在 SQL 代理作业中运行 C# 代码

c# - 查看EF4生成的查询?

sql-server - SqlProfiler 扫描启动是否错误?

mysql - 获取不同的值mysql

mysql - 使用 SQL 查询的数据复制解决方案