灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:2452回复:0

[SQL Server]T-SQL之哈希索引简析

楼主#
更多 发布于:2012-09-04 18:06



T-SQL之哈希索引简析

(一)问题提出
1,当表中一个字段过长时,建立索引就不适合的了,建立索引的一个原则就是索引不能太宽。
2,对于varchar(max)、nvarchar(max) 和 varbinary(max) 大值数据类型根本就不能建立索引。
3,对于这个情况怎么办呢?  www.atcpu.com  
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  www.atcpu.com  
            (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 *  www.atcpu.com  
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 次。



作者 小材小用


喜欢0 评分0
游客

返回顶部