SQL Server HASH函数的妙用以及注意事项
来源:互联网 发布:微信群加人软件免费版 编辑:程序博客网 时间:2024/06/08 06:35
在很多系统设计的时候包括OS,SQL Server很多方面都用到了HASH大大提高了系统的性能,其实我们也可以利用SQL Server的HASH函数实现相同的效果。 比如对长String的Text创建HASH索引快速提高查询能力,可以用来比较表数据差异。
下面有两个例子:
1.用于比较两表的数据异同.
例如找出在T1有,T表没有的记录。
SELECT*
FROMT1
WHERECHECKSUM(*)
NOTIN(SELECTCHECKSUM(*)FROMT)
2.用于创建计算列索引
下列示例显示使用CHECKSUM 生成哈希索引。通过将计算校验和列添加到索引的表中,然后对校验和列生成索引来生成哈希索引。
– Create a checksum index.
SET ARITHABORTON;
USEAdventureWorks;
GO
ALTER TABLE Production.Product
ADD cs_Pname ASCHECKSUM(Name);
GO
CREATE INDEX Pname_indexONProduction.Product(cs_Pname);
GO
校验和索引可用作哈希索引,尤其是当要索引的列为较长的字符列时可以提高索引速度。校验和索引可用于等价搜索。
/*Use the index in a SELECT query. Add a second search
condition tocatch stray cases where checksums match,
but the valuesare not the same.*/
SELECT *
FROM Production.Product
WHERE CHECKSUM(N’Bearing Ball’)= cs_Pname
AND Name = N’Bearing Ball’;
GO
对计算列创建索引将具体化为校验和列,对ProductName 值所做的任何更改都将传播到校验和列。也可以直接对索引的列生成索引。然而,如果键值较长,则很可能不执行校验和索引甚至常规索引。
但是使用 CHECKSUM()也是有风险的,有可能两个不同的值会产生同样的HASH值,这样比对的数据j就会错误,虽然这样的情况非常少。
比如下面的两个数据不同,但是HASH的结果是相同的。
DECLARE@guid1UNIQUEIDENTIFIER,@guid2UNIQUEIDENTIFIER
SELECT@guid1=’3DB7D309-A8F4-47C4-BA90-0CB458B44CB0′, @guid2=‘EFE7F2C5-19F9-42B9-9C16-21BED41E882B’
SELECT chksum_guid1=CHECKSUM(@guid1),chksum_guid2=CHECKSUM(@guid2)
针对上面提到的问题有些专家给出了下面的解决办法:可以使用CHECKSUM两次,一次正向一次做反向HASH然后把两次的结构加在一起,这样出现碰撞的机会就很少了。
DECLARE@guid1UNIQUEIDENTIFIER,@guid2UNIQUEIDENTIFIER
SELECT@guid1=’3DB7D309-A8F4-47C4-BA90-0CB458B44CB0′, @guid2=‘EFE7F2C5-19F9-42B9-9C16-21BED41E882B’
SELECT chksum_guid1 = CONVERT(BIGINT,CONVERT(BINARY(4),CHECKSUM(REVERSE(@guid1)))+CONVERT(BINARY(4),CHECKSUM(@guid1)))
, chksum_guid2 = CONVERT(BIGINT,CONVERT(BINARY(4),CHECKSUM(REVERSE(@guid2)))+CONVERT(BINARY(4),CHECKSUM(@guid2)))
经过优化之后我们可以看到HASH的结构已经不一样了,这样就避免的HASH值的碰撞。
- SQL Server HASH函数的妙用以及注意事项
- sql server的HASH加密
- SQL Server通配符妙用
- SQL Server的若干注意事项
- SQL Server数据库的注意事项
- Sql server 自定义函数中的注意事项
- MoPaQ的hash函数以及常用的hash函数
- SQL Server的增、删、改、查以及系统函数
- sql server日期函数以及与字符串的转换
- SQL Server中,isnull()函数以及null的用法
- SQL Server CONVERT() 函数以及SQL Server DATEADD() 函数
- Hash函数以及解决冲突的方法
- Hash函数以及解决冲突的方法
- 宏的妙用以及与函数的比较
- 状态机与编程以及函数指针数组的妙用
- 关于SQL Server的若干注意事项
- 关于SQL Server的若干注意事项
- 关于SQL Server的若干注意事项
- 移植了Qt4.5
- 雷锋读图:平板电脑能否成为传统纸媒的救世主?
- cocos2d-x 开发网络游戏(http post&socket)
- 成为Android高手必须掌握的28大项内容和10个建议
- Linux下同步模式、异步模式、阻塞调用、非阻塞调用总结
- SQL Server HASH函数的妙用以及注意事项
- 验证snprintf是否以null结尾
- __user && address_space(1)
- 转载-关于加班的思考
- oracle 分页查询
- 分享几个jquery的效果,虽然有些很简单,但是可以学习学习编码
- 基于tcp开发—异步机制
- 在Eclipse下搭建Android开发环境教程
- HDFS Federation(联邦)