TSql checksum 比较两个表的数据是否相同

CheckSum函数,用于计算一组表达式的校验和,这个校验和是int,并且对于相同的一组表达式,校验和是相同的,只在极少数情况下,不同的表达式有相同的校验和。CheckSum函数的这一特性,可以用于比较两个表的数据是否相同。如果表中的两列的CheckSum值相同,那么这两列的值是相同的,因此校验和和表达式是一对一的关系。

if object_id(‘dbo.ta‘) is not null
    drop table dbo.ta

if object_id(‘dbo.tb‘) is not null
    drop table dbo.tb

create table dbo.ta
(c1 int,
c2 varchar(10)
)
create table dbo.tb
( b1 int,
b2 varchar(10)
)

insert into dbo.ta values(1,‘a‘),(10,‘a0‘),(11,‘a1‘),(12,‘a2‘),(13,‘a3‘),(14,‘a4‘)
insert into dbo.tb values(1,‘a‘),(10,‘a0‘),(11,‘a1‘),(12,‘a2‘),(13,‘a3‘),(14,‘a4‘),(15,‘a5‘)

--use join clause to compare
select *
from dbo.ta a
left join dbo.tb b
on checksum(c1,c2)=checksum(b1,b2)
where b.b1 is null

select *
from dbo.ta a
right join dbo.tb b
on checksum(c1,c2)=checksum(b1,b2)
where a.c1 is null

--use except clause to compare
select checksum(c1,c2) from dbo.ta
except
select checksum(b1,b2) from dbo.tb

--the query resutl is 1779172094
select checksum(b1,b2) from dbo.tb
except
select checksum(c1,c2) from dbo.ta

--use the value to query
select * from dbo.tb where checksum(b1,b2)=1779172094

MSDN对CheckSum的注释

1,CheckSum函数的语法是:CHECKSUM ( expression [ ,...n ] )

2,Note

CHECKSUM 对其参数列表计算一个称为校验和的哈希值。  此哈希值用于生成哈希索引。 如果 CHECKSUM 的参数为列,并且对计算的 CHECKSUM 值生成索引,则结果是一个哈希索引。 它可用于对列进行等价搜索。

CHECKSUM 满足哈希函数的下列属性:在使用等于 (=) 运算符比较时,如果两个列表的相应元素具有相同类型且相等,则在任何两个表达式列表上应用的 CHECKSUM 将返回同一值。  对于该定义,指定类型的 Null 值被作为相等进行比较。 如果表达式列表中的某个值发生更改,则列表的校验和通常也会更改。 但只在极少数情况下,校验和会保持不变。 因此,我们不推荐使用 CHECKSUM 来检测值是否更改,除非应用程序可以容忍偶尔丢失更改。 请考虑改用 HashBytes。 指定 MD5 哈希算法时,HashBytes 为两个不同输入返回相同结果的可能性比 CHECKSUM 小得多。

表达式的顺序影响 CHECKSUM 的结果值。  用于 CHECKSUM(*) 的列顺序是表或视图定义中指定的列顺序。 其中包括计算列。

CHECKSUM 值取决于排序规则,使用不同排序规则存储的相同值将返回一个不同的 CHECKSUM 值。

3,使用 CHECKSUM 生成哈希索引,通过将计算校验和列添加到索引的表中,然后对校验和列生成索引来生成哈希索引。

-- Create a checksum index
ALTER TABLE Production.Product
ADD cs_Pname AS CHECKSUM(Name);
GO
CREATE INDEX Pname_index ON Production.Product (cs_Pname);
GO

--校验和索引可用作哈希索引,尤其是当要索引的列为较长的字符列时可以提高索引速度。 校验和索引可用于等价搜索。
/*Use the index in a SELECT query. Add a 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 值所做的任何更改都将传播到校验和列。 也可以直接对索引的列生成索引。 然而,如果键值较长,则很可能不执行校验和索引甚至常规索引。

时间: 2024-10-29 19:08:29

TSql checksum 比较两个表的数据是否相同的相关文章

Oracle 取两个表中数据的交集并集差异集合

Oracle 取两个表中数据的交集 关键字: Oracle 取两个表中数据的交集 INTERSECT Oracle 作为一个大型的关系数据库,日常应用中往往需要提取两个表的交集数据 例如现有如下表,要求找出工资2500(不含2500)以上并且是男性(M)的员工编号,那么就要利用这两个表的关系做一个交集了 employee CODE NAME GENDER 001 Tom M 002 Jerry M 003 Ana F salary CODE SALARY 001 2800 002 2500 00

SQL如何查询两个表的数据

在进行查询操作时,我们通常需要查询两个关联表的数据,我们可以使用where语句进行查询,如: select Emp.E_Id,Company.C_OraName from Emp,Company where Companey.C_Id=Emp.C_Id 但是我们往往会碰到比较复杂的语句,这时候使用where就不太合适了,其实SQL可以用较为直接的形式进行连接操作,可以在From子句中以直接的形式指出: select top 10 E_Id,E_Name,C_Name from Emp join

【转】mysql 触发器实现两个表的数据同步

mysql通过触发器实现两个表的同步 目前,在本地测试成功. 假设本地的两个数据库a和b,a下有表table1(id, val) b下有表table2(id, val) 假设希望当table1中数据更新,table2中数据同步更新. 代码: DELIMITER $$ CREATE /*[DEFINER = { user | CURRENT_USER }]*/ TRIGGER `a`.`触发器名` BEFORE UPDATE ON `a`.`table1` FOR EACH ROW BEGIN I

T-SQL数据库中两个表之间的操作

--根据另一张表修改表中的数据 update Admin_FCOutDt set oLastId=T.contractID from (select crm_contract.contractTopic,crm_contract.contractID from Admin_FCOutDt left join crm_contract on Admin_FCOutDt.ContractName=crm_contract.contractTopic )T where Admin_FCOutDt.Co

Oracle将两张表的数据插入第三张表且第三张表中不存在

1.由于是先查再插所以不能使用insert into table1() values(), 要使用insert into table1() select * table2,不能使用values. 2.因为是多张表故查询和插入的时候需要指定是哪张表,否则会报错:指定列模糊. 3.三张表联查时可多次使用inner join等连接语法. 总结:在逻辑上SQL与Code实现基本一致,但是SQL的速度非常快,在具体实现上SQL需要非常强的逻辑性但是会省去很多写code的功夫. insert into SP

整合Excel两个表的数据 - 2 | xlrd | xlwt | Python

# coding=utf-8 import os import datetime import xlrd from xlwt import Workbook from xlrd import xldate_as_tuple agent_num = { "14": 1, "13": 1, "12": 1, "11": 1, "10": 1, "9": 1, "8": 1

关于mysql当中给数据量特别大的两个表做关联查询的时候解决查询速度很慢的解决方法

今天碰到了两个表做关联查询的mysql,这两个表的数据量都是特别大的,有一个表的数据是上亿条的数据,有一个是几百万的数据, 查询的速度是特别慢,然后我看了一下执行计划,下面是执行执行计划: 看到上面这个图这个数据量是特别大的,这个查询起来的肯定是非常慢的,而且他的类型都是ALL类型,也就是都是全表进行扫描的.然后在网上找资料,然后发现我们可以给关联的字段建索引. 于是我给关联字段建立了索引,然后就发生了下面的变化: 整个的行数就成不知道多少个数量级的情况在下降,整个的查询速度也是加快了额很多,现

数据库中两张表之间的数据同步实现思路(增加、删除、更新)Mysql、sqlserver

分别创建增加.删除.更新的触发器(Trigger)来达到两张表之间数据同步的目的. 1:数据同步增加:如有两张表--A表和B表,创建触发器使当A表插入数据后B表也同步插入数据.其中B表插入数据的字段需要同A表中的字段相对应. CREATE TRIGGER 触发器名称 ON A表 AFTER INSERT AS BEGIN INSERT INTO B表(B表字段1,B表字段2,B表字段3) SELECT A表字段1,A表字段2,A表字段3 FROM INSERTED END 2.数据同步删除:如有

SQLSERVER中如何快速比较两张表的不一样

一般来说,如何检测两张表的内容是否一致,体现在复制的时候发布端和订阅端的两端的数据上面 我这里罗列了一些如何从数据库层面来解决此类问题的方法 第一步当然就是检查记录数是否一致,否则不用想其他方法了~这里我们用两张表t1_old,t1_new来演示 方法介绍 方法一:老老实实看表结构和表记录数,弊端是根本看不到两张表的数据是否一致,只是看到表结构和记录数是否一致 --表结构: CREATE TABLE t1_old ( id int NOT NULL, log_time DATETIME DEFA