测试 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/