簡體   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