2

我的应用程序不断地轮询数据库。出于优化目的,我希望应用程序仅在表已被修改时才查询数据库。所以我想计算整个表的 HASH 并将其与表的last-saved-hash进行比较。(我计划通过首先计算每行的 HASH 来计算哈希值,然后计算它们的哈希值,即 HASH 的哈希值)

我发现 SQL Server 有 Checksum() sql 实用函数,它计算一行的 HASH/Checksum。

是否有任何类似的实用程序/查询可以在 SQL Anywhere 11 数据库中查找行的 HASH?

仅供参考,数据库表没有任何带有预先计算的哈希/校验和的列。

4

2 回答 2

1

这会在表的所有数据上创建哈希,以检测任何列中的更改:

CREATE VARIABLE @tabledata LONG VARCHAR;
UNLOAD TABLE MyTable INTO VARIABLE @tabledata ORDER ON QUOTES OFF COMPRESSED;
SET @tabledata = Hash(@tabledata);
IF (@tabledata <> '40407ede9683bcfb46bc25151139f62c') THEN
    SELECT @tabledata AS hash;
    SELECT * FROM MyTable;
ENDIF;
DROP VARIABLE @tabledata;

当然,这很昂贵,如果数据为数百兆字节,则不应使用。但是,如果唯一的其他方法是比较所有数据以进行任何更改,这将更快,并且仅在 db 服务器上产生负载和内存消耗。

如果只需要对几列进行更改检测,则可以UNLOAD SELECT col FROM table INTO ...改用。

于 2013-08-21T13:39:14.633 回答
1

得到了答案。我们可以使用以下查询计算表的特定列的哈希:

-- SELECT HASH(coulum_name, hash_algorithm) 
-- For example:
SELECT HASH(coulmn, 'md5') 
FROM MyTable
于 2011-03-01T11:32:42.053 回答