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 ( int AS
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 ,如需转载请自行联系原作者

相关文章
|
4月前
|
关系型数据库 MySQL
MySQL 报错 [ERROR] [FATAL] InnoDB: Table flags are 0 in the data dictionary but the flags in file
MySQL 报错 [ERROR] [FATAL] InnoDB: Table flags are 0 in the data dictionary but the flags in file
337 0
|
关系型数据库 MySQL
pt-table-checksum原理详解
环境 MySQL: MySQL 5.6.27 OS: centos 6.6 tool: pt-table-checksum 2.2.15 它能做什么 业界最流行的MySQL主从数据对比工具,数据一致性检测最好的的工具,没有之一 如何使用 ./pt-table-che
7335 0
|
关系型数据库 数据库 索引
pt-table-checksum
pt-table-checksum是目前可以说是最好的查看主从一致性的工具 先来个使用例子,有助快速上手使用 在主库执行:mysql>GRANT SELECT, PROCESS, SUPER, REPLICATION SLAVE,CREATE,DELETE,INSERT,UPDATE ON .
1643 0
|
算法 数据安全/隐私保护 SQL