繁体   English   中英

对Sql Server中的索引感到困惑

[英]Confused about Index in Sql Server

我有以下表结构:

在此输入图像描述

当我将Id列设置为主键时,它会自动在Indexes文件夹中创建名为PK_TestIndexTbl (Clustered)的索引。 我的表包含大约1,300,000条记录,当我执行以下查询时,大约需要5秒钟:

SELECT [Id], [Name], [Family], [Score]
FROM   [TestIndexTbl]

但是当我从表中删除主键时,当然它会删除索引,我希望我的查询花费超过5秒,因为我现在没有任何索引。 但它没有区别,我在5秒钟内得到了结果。 为什么?

我的问题:如何查看索引使用情况? 我应该运行什么查询来查看有无索引的区别? 而且Where没有效果。 使用或不使用index时,执行以下查询的时间不到一秒:

SELECT [Id], [Name], [Family], [Score]
FROM   [TestIndexTbl]
where Id = 602145

由于您选择了数据库中的所有条目,因此索引无关紧要。 当它们按顺序存储并且不存在时,需要花费相同的时间才能将所有书籍从库中取出。

您之前提到的索引与数据的保存方式有关。 基本上,SQL Server中的索引是B +树结构。 声明主键结构时,将创建聚簇索引,其中包含主键并将所有数据存储在B +树结构中。

基本上 ,有两种索引

  • 集群
  • 非集群

一个表只能有一个最高的聚簇索引,同时它可以有不止一个非聚集索引。

具有Clustered Index的表称为Clustered表,而没有聚簇索引的表称为Heap。 数据存储在数据库的数据文件中的方式有​​很大差异。

但是,如果您的数据不是太多,无论您有堆还是群集,它都会产生任何影响。

在任何情况下,如果您请求所有数据(SELECT * FROM ...),时间将是相同的,因为将要执行的操作将是表扫描。 sql server的执行引擎必须访问包含数据的所有数据页。 因此,您会发现任何差异。

如果您运行以下查询:

SELECT [Id], [Name], [Family], [Score]
FROM   [TestIndexTbl]
WHERE Id = 602145

并且您有一个主键,那么用于检索数据的运算符是对聚簇索引的索引搜索。 如果您没有聚簇索引,则运算符将是表扫描。 如果您有一百万或记录,那么您会发现数据检索存在差异。

如果要选择没有WHERE子句的所有数据,它将选择所有行,聚簇索引对此没有影响。 选择没有聚簇索引的所有行甚至可能更快,因为您不太可能有碎片。

当您的表缺少聚簇索引时,它称为heap

尝试使用WHERE ID = @Id进行选择,您将在具有聚簇索引的表和不具有聚簇索引的表之间获得速度的主要差异。

有关差异的更多信息,请查看此处

创建索引后不希望它会自动生效。在执行第二次或更多次后,索引等待调用,看看执行它的时间会比第一次更快。

有关详细信息,请参阅索引类型

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM