开发者社区> 技术小甜> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

CHECKSUM 和 BINARY_CHECKSUM 的应用场景

简介:
+关注继续查看

CHECKSUM 和 BINARY_CHECKSUM 的应用场景



1. 验证已复制的数据

 

复制验证使用 checksum 和 binary_checksum 函数。


通过事务复制和合并复制,您可以验证订阅服务器中的数据与发布服务器中的数据是否匹配。 可以对特定订阅或某一发布的所有订阅执行验证。 指定下列验证类型之一,分发代理或合并代理便会在下次运行时验证数据:


    仅行计数。 此选项将验证订阅服务器上的表与发布服务器上的表的行数是否相同,但不验证行内容是否匹配。 行计数验证提供了一种轻型验证方法,使您可以意识到数据的问题所在。


    行计数和二进制校验和。 除了可在发布服务器和订阅服务器上对行进行计数之外,还可使用校验和算法来计算所有数据的校验和。 如果行计数失败,则不计算校验和。

 

2. 实现哈希分区

 

用CHECKSUM可以实现哈希分区(Hash Partition)。

SQL Server 只有列表分区和范围分区,通过CHECKSUM函数可以创建相应的Hash Partition。

 

步骤1建议分区函数。

 

1
2
CREATE PARTITION FUNCTION fun_hash (intAS
RANGE LEFT FOR VALUES (-1073741824, 0, 1073741824);

 

注意:我们这里使用的int型数据,因为hash函数是checksum(id),这里根据int的最大长度进行分区,我们使用2,147,483,648/2=1073741824

这里:Range left 意思: <= Range right 意思: <

 

步骤2创建分区方案及相应的表。

 

1
2
3
4
5
6
7
CREATE PARTITION SCHEME sche_fun_hash AS PARTITION fun_hash all TO ([PRIMARY])
CREATE TABLE [dbo].test(
[id] [varchar](32) NOT NULL,
[sid] int,
[hashid] AS (checksum([id])) PERSISTED
)
ON sche_fun_hash ([hashid])

 

步骤3插入数据并查看数据分布情况。

 

1
2
3
4
insert into test(id,sid)
select replace(newid(),'-',''),1
from (select top 100 * from syscolumns) a
,(select top 100 * from syscolumns) b

 

步骤4查看结果。

 

1
2
3
4
5
SELECT
$partition.fun_hash(hashid)
AS 分区号,count(*) 数据条数
FROM test
group by $partition.fun_hash(hashid)

 

clip_image002

 

3. 生成哈希列

 

CHECKSUM 对其参数列表计算一个称为校验和的哈希值。 此哈希值用于生成哈希索引。

以下示例演示如何使用 CHECKSUM 生成哈希索引。 通过将计算校验和列添加到索引的表中,然后对校验和列生成索引来生成哈希索引。

 

1
2
3
4
5
6
7
8
9
-- Create a checksum index.
SET ARITHABORT ON;
USE AdventureWorks2012;
GO
ALTER TABLE Production.Product
ADD cs_Pname AS CHECKSUM(Name);
GO
CREATE INDEX Pname_index ON Production.Product (cs_Pname);
GO

 

校验和索引可用作哈希索引,尤其是当要索引的列为较长的字符列时可以提高索引速度。 校验和索引可用于等价搜索。

 

1
2
3
4
5
6
7
8
/*Use the index in SELECT query. Add second search
condition to catch stray cases where checksums match,
but the values are not the same.*/
SELECT *
FROM Production.Product
WHERE CHECKSUM(N'Bearing Ball') = cs_Pname
AND Name = N'Bearing Ball';
GO

 

对计算列创建索引将具体化为校验和列,对 ProductName 值所做的任何更改都将传播到校验和列。 也可以直接对索引的列生成索引。 然而,如果键值较长,则很可能不执行校验和索引甚至常规索引。



















本文转自UltraSQL51CTO博客,原文链接:http://blog.51cto.com/ultrasql/1607408 ,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
ERROR: libass not found using pkg-config2
ERROR: libass not found using pkg-config2
45 0
【音视频连载-001】基础学习篇- SDL 介绍以及工程配置
这是音视频基础学习系列的第一篇文章,主要讲解 SDL 是什么以及为什么要用到它,看似和音视频没啥卵关系,其实必不可少。
131 0
阿里P7架构师精解Mybatis源码,浅论程序员的修身之道
Mybatis基本纲要 1. Mybatis组成 · 动态SQL · Config配置 · Mapper配置 2. 核心源码分析 · Configuration源码解析 · SqlSessionFactory源码解析 · SqlSession源码解析 · SqlSessionManager源码解析 3.
1588 0
最新高通Vuforia 6-2-10版本 对应API 动态加载、卸载识别库 闪光灯 对焦 翻转摄像头 动态更改识别数量等
整理了下Vuforia 6-2-10 版本对应识别功能的函数 TrackableSettings类主要功能 开启扩展追踪 获取当前激活识别库名称列表 激活指定的识别数据集 关闭指定识别数据集 动态载入识别数据集 卸载所...
907 0
Flash调用Alchemy编译的代码时出现Error #1506的解决
Flash调用Alchemy编译的代码时出现Error #1506的解决 这个问题困扰了我很久,因为需要频繁的向Alchemy代码中传递大ByteArray数组。当某次传递的数据量较大时,后面再调用时就会抛出下面这个异常:Error #1506: The specified range is invalid.比较确定是Adobe在Alchemy实现中的BUG,但是一直没有找到解决办法。
673 0
+关注
10137
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载