T-SQL之哈希索引


 

T-SQL之哈希索引

(一)問題提出

1,當表中一個字段過長時,建立索引就不適合的了,建立索引的一個原則就是索引不能太寬。

2,對於varchar(max)、nvarchar(max) 和 varbinary(max) 大值數據類型根本就不能建立索引。

3,對於這個情況怎么辦呢?

4,哈希索引就派上了用場。

(二)示例代碼

 

-建立測試表
CREATE TABLE hash_index
  (
     id   INT IDENTITY(1, 1) PRIMARY KEY,
     name VARCHAR(max)
  )
 
go
--插入10000測試數據
WITH cte
     AS (SELECT NUMBER + 1 AS NUMBER
         FROM   master..spt_values a
         WHERE  a.TYPE = 'P'
                AND NUMBER < 100)
INSERT INTO hash_index
            (name)
SELECT Cast(Newid() AS VARCHAR(50)) + Cast(Newid() AS VARCHAR(50)) + Cast(
              Newid() AS VARCHAR(50)) + Cast(Newid() AS VARCHAR(50)) + Cast(
              Newid() AS VARCHAR(50)) + Cast(Newid() AS VARCHAR(50)) + Cast(
              Newid() AS VARCHAR(50))
FROM   cte a
       CROSS JOIN cte b
 
go
--增加計算列
ALTER TABLE hash_index
  ADD cs_name AS Checksum(name);
 
go
--增加索引
CREATE INDEX idx_name
  ON hash_index(cs_name)

 

 

 

(三)查詢示例

--查詢一表掃描
SELECT *
FROM   hash_index
WHERE  name =
'C3AA9897-9303-48C9-B2C2-758C0FFE0BB1ABB3F6FB-BC2C-45DF-B40A-E3DA413AD91E1A598E90-31FE-4F54-B468-0D085A191DA37A35782D-B048-4A6B-89CA-00A15FC1467E0235D0F1-A9EA-4908-9531-3D787C7E7AAA2E6DB162-1099-4B3B-BF93-261B87660B1359768A42-F9F7-4107-9D57-BCB91EEF3CD5'
--查詢二哈希索引
SELECT *
FROM   hash_index
WHERE  name =
'C3AA9897-9303-48C9-B2C2-758C0FFE0BB1ABB3F6FB-BC2C-45DF-B40A-E3DA413AD91E1A598E90-31FE-4F54-B468-0D085A191DA37A35782D-B048-4A6B-89CA-00A15FC1467E0235D0F1-A9EA-4908-9531-3D787C7E7AAA2E6DB162-1099-4B3B-BF93-261B87660B1359768A42-F9F7-4107-9D57-BCB91EEF3CD5'
AND cs_name = Checksum(
'C3AA9897-9303-48C9-B2C2-758C0FFE0BB1ABB3F6FB-BC2C-45DF-B40A-E3DA413AD91E1A598E90-31FE-4F54-B468-0D085A191DA37A35782D-B048-4A6B-89CA-00A15FC1467E0235D0F1-A9EA-4908-9531-3D787C7E7AAA2E6DB162-1099-4B3B-BF93-261B87660B1359768A42-F9F7-4107-9D57-BCB91EEF3CD5'
)  

 (四)對比性能消耗
表 'hash_index'。掃描計數 1,邏輯讀取 340 次,物理讀取 4 次,預讀 133 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
表 'hash_index'。掃描計數 1,邏輯讀取 5 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM