Sql server 大表的TSQL校验和

Sql server 大表的TSQL校验和,sql-server,tsql,compare,sql-server-2014,large-data,Sql Server,Tsql,Compare,Sql Server 2014,Large Data,以下是对我的问题的修改描述: 我有一个我一直试图解决的问题,但遇到了困难,我希望有不同的想法 场景:数据文件在发生交易时从多个门店传输到总部。对于每家商店来说,这张桌子都是相当大的。在总部,同一张表格包含了来自所有商店的相同信息,这使得它变得巨大。数据通过文件传输,因为HO和商店之间没有任何直接连接 我正试图找到一种方法来确保每家商店的数据都能安全可靠地传到总部的桌子上。为了做到这一点,我尝试了对存储区和存储区之间应该匹配的字段进行校验和。。。但是表现很差。我还尝试了特定数字列的总和,并在主机上

以下是对我的问题的修改描述:

我有一个我一直试图解决的问题,但遇到了困难,我希望有不同的想法

场景:数据文件在发生交易时从多个门店传输到总部。对于每家商店来说,这张桌子都是相当大的。在总部,同一张表格包含了来自所有商店的相同信息,这使得它变得巨大。数据通过文件传输,因为HO和商店之间没有任何直接连接

我正试图找到一种方法来确保每家商店的数据都能安全可靠地传到总部的桌子上。为了做到这一点,我尝试了对存储区和存储区之间应该匹配的字段进行校验和。。。但是表现很差。我还尝试了特定数字列的总和,并在主机上对特定存储进行了相同的比较,但性能似乎也很差

我已经验证了索引的碎片,一切都很好

理想情况下,我希望逐行传输商店中的所有数据,并将其与HO进行比较,但这是不可想象的,因为这是一个巨大的过程

我正在寻找我可以探索的想法,看看性能是否可以接受。其思想是在每个日期存储/存储中的日期获取表的某种类型的校验和,并在何处执行相同的操作。。。然后比较这两个值。。。这意味着我只需要将每个存储和日期的校验和值传输到HO

任何想法都值得赞赏


感谢您比较行,我正在使用。对于整个表,可以使用行哈希的哈希字节

你需要这样的东西:

HASHBYTES('SHA2_512', CONCAT([ColA], [ColB], ..., ColZ]);
几点重要提示:

您使用的是SQL Server 2014,正如文档中所述,不允许使用最大值作为输入:

对于SQL Server 2014 12.x及更早版本,允许的输入值限制为8000字节

因此,您可能会使用多个散列来对零件上的不同列进行行合并,或者如果您有max-length类型,则无法使用此技术

您需要决定如何处理空值和空字符串(如果存在)

例如,以下哈希值相同,但其中一个虚拟列为NULL,另一个为空字符串:

如果你不小心,事情可能会变得疯狂。例如,我有这样的例子:不同的列值,相同的散列:

SELECT HASHBYTES('SHA2_512', CONCAT(1, '', NULL, 2));  --0x5AADB45520DCD8726B2822A7A78BB53D794F557199D5D4ABDEDD2C55A4BD6CA73607605C558DE3DB80C8E86C3196484566163ED1327E82E8B6757D1932113CB8
SELECT HASHBYTES('SHA2_512', CONCAT(1, '', 2, NULL));  --0x5AADB45520DCD8726B2822A7A78BB53D794F557199D5D4ABDEDD2C55A4BD6CA73607605C558DE3DB80C8E86C3196484566163ED1327E82E8B6757D1932113CB8
这就是为什么在每个值之间使用分隔符的原因。我使用的是CHAR26,但您可以使用任何非特殊的,只要您确定数据中没有使用它。因此,最终代码是:

HASHBYTES('SHA2_512', CONCAT([ColA], CHAR(26), [ColB], CHAR(26), ..., CHAR(26), ColZ]);
基本上,您可以查找CLR函数,该函数是由整个结果集的哈希值计算而成的——这将更难实现,但如果您熟悉.net,就可以了。检查创建SQL CLR函数的示例和官方代码

可能很难设置,但我使用数据校验和来创建单元测试。基本上,这种类型的测试是内置的,因此在环境就绪后,您可以使用它:

糟糕的是,您需要在高级中计算校验和,例如使用源数据,然后更改SQL以查询新数据。不要认为它会非常适合你的需要


说到单元测试,你可以检查这个框架——我肯定不是一个爱好者,但可能有一些例程在结果集上执行校验和。

这超出了本论坛的范围。也许可以试试dba.stackexchange.com?伊利亚·布尔索夫,戴夫·库勒姆,塔布·阿勒曼,伊万·斯塔罗斯汀,财政部我修改了我的问题描述。gotqn,谢谢。。。我一定会在我的实验室里试试,让你知道它是怎么回事。我没有意识到这一点。Gotqn看起来很有趣,但我希望每个商店每天都能累积一个价值。i、 e.对于一个商店,我将每天获得hashbyte值,在总部,我将执行相同的功能,每个商店每天将获得一个值。我尝试过使用它,但要在每个存储区的每个日期获得一个值,我需要在concat中聚合数据以获得我需要的数据,这样做会使问题变得太重。我不确定我是否理解这个问题。您可以添加一个新列来存储每一行的哈希-通过触发器或在插入/更新时填充哈希;然后在检查时使用预先计算的值,不要浪费时间gotqn因为表很大,而且我们没有与商店数据库的直接连接,我们必须通过文件传递数据。。。这意味着我需要将数百万行导出/导入到一个文件中。我想找的东西和你的建议很相似,但在商店/约会时就这么做。。。因此,我可以将每个门店/日期的哈希值与总行的门店/日期进行比较。我尝试对一些列的和进行散列和计数,但我不确定这是否比使用Checksum_AGG和Checksum函数更好。我很感激你花这么多时间。我用你的想法修改了描述 我曾尝试使用hashbytes创建一个持久化的计算列,但幸运的是,它失败了,因为创建表时禁用了ANSI_NULLS,而且由于此应用程序是大规模分布的,所以我无法真正改变这一点。。。我束手无策,必须找到另一个解决办法。在一个完美的世界中,我会在索引中添加计算列,并在每个商店每个日期对其进行聚合+1.
HASHBYTES('SHA2_512', CONCAT([ColA], CHAR(26), [ColB], CHAR(26), ..., CHAR(26), ColZ]);