SQLSERVER中KeyHashValue的做用(下)html
原文的標題是:SQLSERVER在索引下如何找到哈希值的隨想算法
如今知道KeyHashValue的做用了,因此就改了標題~sql
測試環境:SQLSERVER2005 開發者版數據庫
真的很差意思,我作實驗的時候到最後仍是沒有找到這個問題的答案ide
問題是這樣的:sqlserver
當經過彙集索引查找和非彙集索引查找的時候,經過哈希碼來匹配,而後找到相應記錄的性能
既然經過哈希碼來匹配,那麼就須要一個hash bucket把全部索引頁面的全部key/value所有加載到hash bucket測試
既然要所有加載到hash bucket就須要讀取全部的索引頁spa
個人測試腳本,我使用SET STATISTICS IO ON來測試是否有讀取索引頁的狀況,可是到最後仍是找不到規律設計
1 --sql在彙集索引下如何找到哈希值的隨想 2 3 USE master 4 GO 5 --新建數據庫IAMDB 6 CREATE DATABASE SCANDB 7 GO 8 9 USE SCANDB 10 GO 11 12 13 14 --DROP TABLE clusteredtable 15 --DROP TABLE nonclusteredtable 16 17 18 --創建測試表 19 CREATE TABLE clusteredtable(c1 INT IDENTITY(1,1), c2 VARCHAR (900)) 20 GO 21 CREATE TABLE nonclusteredtable(c1 INT IDENTITY(1,1), c2 VARCHAR (900)) 22 GO 23 24 25 --創建索引 26 CREATE CLUSTERED INDEX cix_clusteredtable ON clusteredtable([C2]) 27 GO 28 CREATE INDEX ix_nonclusteredtable ON nonclusteredtable([C2]) 29 GO 30 31 32 --插入測試數據 33 DECLARE @a INT; 34 SELECT @a = 1; 35 WHILE (@a <= 100) 36 BEGIN 37 INSERT INTO clusteredtable VALUES ( CAST(@a AS NVARCHAR(2))+replicate('a', 880)) 38 SELECT @a = @a + 1 39 END 40 41 42 DECLARE @a INT; 43 SELECT @a = 1; 44 WHILE (@a <= 100) 45 BEGIN 46 INSERT INTO nonclusteredtable VALUES ( CAST(@a AS NVARCHAR(2))+replicate('a', 880)) 47 SELECT @a = @a + 1 48 END 49 50 51 52 53 --查詢數據 54 SELECT * FROM clusteredtable ORDER BY [c1] ASC 55 SELECT * FROM nonclusteredtable ORDER BY [c1] ASC 56 57 58 CREATE TABLE DBCCResult ( 59 PageFID NVARCHAR(200), 60 PagePID NVARCHAR(200), 61 IAMFID NVARCHAR(200), 62 IAMPID NVARCHAR(200), 63 ObjectID NVARCHAR(200), 64 IndexID NVARCHAR(200), 65 PartitionNumber NVARCHAR(200), 66 PartitionID NVARCHAR(200), 67 iam_chain_type NVARCHAR(200), 68 PageType NVARCHAR(200), 69 IndexLevel NVARCHAR(200), 70 NextPageFID NVARCHAR(200), 71 NextPagePID NVARCHAR(200), 72 PrevPageFID NVARCHAR(200), 73 PrevPagePID NVARCHAR(200) 74 ) 75 76 TRUNCATE TABLE [dbo].[DBCCResult] 77 78 INSERT INTO DBCCResult EXEC ('DBCC IND(SCANDB,nonclusteredtable,-1) ') 79 80 SELECT * FROM [dbo].[DBCCResult] ORDER BY [PageType] DESC 81 82 DBCC TRACEON(3604,-1) 83 GO 84 DBCC PAGE(SCANDB,1,89,3) 85 GO 86 87 checkpoint 88 DBCC DROPCLEANBUFFERS 89 DBCC freesystemcache('all') 90 GO 91 ----------------------------------- 92 SET STATISTICS IO ON 93 GO 94 --彙集索引查找 95 SELECT * FROM clusteredtable WHERE [c2]='18aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' 96 SET STATISTICS IO OFF 97 GO 98 99 100 101 (1 行受影響) 102 表 'clusteredtable'。掃描計數 1,邏輯讀取 4 次,物理讀取 2 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。 103 104 105 106 107 ---------------------------------------------------------------------------------------- 108 checkpoint 109 DBCC DROPCLEANBUFFERS 110 DBCC freesystemcache('all') 111 GO 112 ----------------------------------- 113 SET STATISTICS IO ON 114 GO 115 --索引查找 、RID查找 、嵌套循環 116 SELECT * FROM nonclusteredtable WHERE [c2]='17aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' 117 SET STATISTICS IO OFF 118 GO 119 120 121 122 (1 行受影響) 123 表 'nonclusteredtable'。掃描計數 1,邏輯讀取 5 次,物理讀取 1 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
彙集索引表的狀況
非彙集索引表的狀況
今天中午跟高文佳兄討論了很長時間,我把關鍵討論部分貼出來,你們參考參考,討論的最後結果是:尚未解釋到keyhashvalue字段實際的做用
感謝高文佳,頭腦很是靈活