[英]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.