CHECKSUM建立索引

复制代码

/*
Author:浪客
Location:BeiJing
Date:GETDATE()
Descript:利用CHECKSUM建立索引
*/

SELECT CHECKSUM('我和你');
USE tempdb;
GO
DROP TABLE dbo.T
CREATE TABLE dbo.T(ID INT PRIMARY KEY IDENTITY(1,1),[Name] NVARCHAR(MAX));

--这里我偷懒一下,自己注意在IDE中,关闭,不要插入太多了.哈
WHILE 1=1
INSERT INTO dbo.T
SELECT CAST(NEWID() AS NVARCHAR(36))

--表 'T'。扫描计数 1,逻辑读取 5059 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
--
SQL Server 执行时间:
--
 CPU 时间 = 922 毫秒,占用时间 = 918 毫秒。
SET STATISTICS IO ON
SET STATISTICS TIME ON
SELECT *FROM dbo.T WHERE [Name] = '6DDC1B6C-0AC3-475F-8270-EA14AE69878A'
SET STATISTICS TIME OFF
SET STATISTICS IO OFF

--消息 1919,级别 16,状态 1,第 1 行
--
表 'dbo.T' 中的列 'Name' 的类型不能用作索引中的键列。一些大数据类型列还没发建立索引呢.怎么搞呢?
CREATE INDEX [IX_T_Name] ON dbo.T(Name);


--难道我们必须要表(聚集索引)扫描吗或者非全文索引,我们可以使用CHECKSUM 来做

ALTER TABLE dbo.T ADD Name_Idx AS (CHECKSUM(Name))

CREATE INDEX [IX_T_Name] ON dbo.T(Name_Idx)

--表 'T'。扫描计数 1,逻辑读取 6 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
--
SQL Server 执行时间:
--
CPU 时间 = 0 毫秒,占用时间 = 1 毫秒。
SET STATISTICS IO ON
SET STATISTICS TIME ON
SELECT *FROM dbo.T WHERE CHECKSUM('6DDC1B6C-0AC3-475F-8270-EA14AE69878A'=Name_Idx
SET STATISTICS TIME OFF
SET STATISTICS IO OFF

上述也只是出苗粗描了一下,建立索引的话,是不能超过900字节
的字段的.博友可以看看我的两篇索引的文章.
复制代码
文章过后,和同事探讨了一下这个问题,CHECKSUM主要是用于奇偶校检的哈希值,但是哈希可能会出现重复值,所以一直担心会不会CHECKSUM存在重复值的问题,但是MSDN对CHECKSUM解释很少,也没有具体的实现算法...
但是今天无意中在 用户自定义函数中,找到了类似的答案说 CHECKSUM是确定性函数,结果很明显,我担心的事可以散了.呵呵所以把文章顶上去...
posted @   Sai~  阅读(808)  评论(2编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示