簡體   English   中英

具有復合字段的聚簇索引上的SQL Server查詢性能

[英]SQL Server query performance on clustered index with composite fields

我有2列的多對多鏈接表CategoryProduct,它將具有數百萬條記錄:

CREATE TABLE [dbo].[CategoryProduct](
[Category_ID] [int] NOT NULL,
[Product_ID] [int] NOT NULL,
CONSTRAINT [PK_dbo.CategoryProduct] PRIMARY KEY CLUSTERED 
(
    [Category_ID] ASC,
    [Product_ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]

基於聚集索引,我希望看到物理記錄要存儲在以下結構中:

CategoryID    ProductID
1             2
1             3
2             1
2             3

但是,選擇的結果是

CategoryID    ProductID
2             1
1             2
1             3
2             3

為什么數據存儲在ProductID組中? 這是否反映了數據的實際順序? 我如何將數據保存在CategoryID組中,以便在命中匹配的CategoryID時可以通過連續讀取來優化如下查詢。

select ProductID from CategoryProduct where CategoryID = value

當Sql Server通過執行表掃描或聚簇索引掃描(如果您的表是聚簇的)來獲取數據時,由於搜索參數,鎖定提示和其他參數,它可能選擇遵循葉子頁鏈接,或者它可能遵循索引分配映射在大多數情況下,由於發生頁面拆分,因此順序不相同。

使用聚簇索引並不能保證速度,Sql服務器為每個請求,甚至對於簡單請求,都以不同的方式檢索數據(Sql Query優化器是一個非常復雜的系統)。

也不是以特定順序獲取數據的方法,以特定順序獲取數據的唯一方法是在查詢中指定ORDER BY子句(這是ANSI規范)。

如果要提高性能,則應研究請求的查詢計划。 有幾種獲取請求的查詢計划的方法,最簡單的一種是在執行請求之前,在Sql Magenement Studio工具欄中選擇“包括實際查詢計划”按鈕。

后續操作:使用聚簇索引,數據將按照聚簇定義的順序進行物理存儲,直到聚簇被分割為止。 在SELECT中以特定順序獲取數據的唯一方法是向SELECT添加ORDER BY子句,而不創建索引。

您不應該依賴於集群鍵來對數據進行排序。 它以集群鍵的順序存儲在磁盤上,但這並不意味着可以保證以任何順序返回返回的數據。 如果需要對數據進行排序,則需要使用ORDER BY子句。

就索引的使用而言,您的查詢會很好。 無論如何,數據排序不是驗證數據的方法。 您應該執行查詢,檢查執行計划並確認確實使用了索引。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM