T-SQL之哈希索引

当表中某个字段过长时(通常指 varchar\nvarchar之类),建立索引就不适合的了,建立索引的一个原则就是索引不能太宽。
对于varchar(max)、nvarchar(max) 和 varbinary(max) 大值数据类型根本就不能建立索引。
但是又必须提高查询效率,这时 哈希索引就派上了用场。
最近在论坛里回复了一个 哈希索引的贴。据楼主 拿到其环境中测试后 效率 提高了 89.3倍。
下面我将哈希函数在这里 显摆一下下。还是和论坛一样上实例最直接:

CREATE TABLE tb
  (
     id   INT IDENTITY(1, 1) PRIMARY KEY,
     name VARCHAR(max),
     address nvarchar(120),
     phone varchar(32),
     cks_name AS Checksum(name)
  )
 
go
--插入40000测试数据
WITH cte
     AS (SELECT NUMBER + 1 AS NUMBER
         FROM   master..spt_values a
         WHERE  a.TYPE = 'P'
And NUMBER < 200)

INSERT INTO tb
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))
              ,'北京市朝阳区大裤衩、国贸海淀区中关村、上地。都NB的地方'
              ,'15813149988'
FROM   cte a
       CROSS JOIN cte b

go
--增加索引
CREATE INDEX tb
  ON hash_index(cks_name)

go

--查询二哈希索引
SELECT *
FROM   tb with(nolock)
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 cks_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'
)  

 

 

http://topic.csdn.net/u/20120515/17/3a6b9d53-8abe-496f-8e07-3a6fc73817e9.html
 


 

你可能感兴趣的:(JOIN,c,测试,table,insert)