我们在我们的环境中使用 SQL Spotlight。它很方便。我们特别使用 sys.dm_exec_requests 和 sys.dm_exec_query_stats 的输出。
Spotlight 使用很好的散列从计划缓存中为您提取查询计划。
问题是,除非您对代码库有经验,否则很难知道该查询来自何处。
我有一个想法,如果我可以:
通过这种方式,我可以快速匹配哈希值,以便能够查看特定查询来自代码库的何处。
或者我必须做一些非常慢的正则表达式......
按照另一个答案给出的建议,我尝试digest()
在 AWS RDS 上的 PostgreSQL 9.3 上使用该函数:
devdb=> SELECT digest('blah', 'sha1');
ERROR: function digest(unknown, unknown) does not exist
LINE 1: SELECT digest('blah', 'sha1');
^
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
Run Code Online (Sandbox Code Playgroud)
即使存在 pgcrypto:
devdb=> SHOW rds.extensions;
Run Code Online (Sandbox Code Playgroud)
btree_gin,btree_gist,chkpass,citext,cube,dblink,dict_int,dict_xsyn,earthdistance,fuzzystrmatch,hstore,intagg,intarray,isn,ltree,pgcrypto,pgrowlocks,pg_trgm,plperl,plpgsql,pltcl,posttiger,postggis_ tablefunc,tsearch2,unaccent,uuid-ossp
如何启用该digest()
功能?
我在AWS RDS论坛上有共同提问,会发帖互相更新。
digest()
数据库上似乎不存在:
devdb=> \df digest
List of functions
Schema | Name | Result data type | Argument …
Run Code Online (Sandbox Code Playgroud) 我目前正在将数据从 Oracle 迁移到 SQL Server,但在尝试验证迁移后的数据时遇到了问题。
环境详情:
SQL Server 2016
我在 Oracle 上使用 DBMS_CRYPTO.HASH 生成整行的校验和,然后复制到 SQL 并使用 HASHBYTES 生成整行的校验和,然后我将其进行比较以验证数据匹配。
除具有多字节字符的行外,所有行的校验和都匹配。
例如,具有以下字符的行: ? 校验和不匹配,即使数据传输正确。当我在 Oracle 中使用 DUMP 或在 SQL Server 中转换为 VARBINARY 时,除此字符的字节外,数据完全匹配。
在 SQL Server 中,字节为 0xE625,在 Oracle 中为 0x25E6。
为什么它们的顺序不同,是否有可靠的方法将一个转换为另一个以确保另一端的校验和与具有多字节字符的字符串匹配?
我正在使用 SQL Server。
我有这张桌子:
create table MyTable (
ID int not null ,
Name varchar(500) )
Run Code Online (Sandbox Code Playgroud)
我正在添加一name_hash
列来存储该name
列的哈希值:
alter myTable
add
name_hash AS HASHBYTES('SHA1', CONVERT(VARCHAR(90), Name))
Run Code Online (Sandbox Code Playgroud)
如何确定 的结果大小name_hash
?它与我想要应用散列的列的大小有关吗?
我想使用 Postgres(CloudSQL 中的 11)作为高效的键值存储。我有大约 200GB 的字典(平均大小为 10kB,结构可以不同并且可以嵌套)。我正在考虑利用改进的哈希索引。这是架构:
\n\n CREATE EXTENSION IF NOT EXISTS "uuid-ossp";\n\n CREATE TABLE IF NOT EXISTS key_val (\n id uuid DEFAULT uuid_generate_v4(),\n value jsonb,\n EXCLUDE using hash (id with =)\n );\n\n CREATE INDEX IF NOT EXISTS idx_key_val ON key_val USING hash (id);\n
Run Code Online (Sandbox Code Playgroud)\n\n获取、更新和插入非常简单,但我不知道如何实现高效的更新插入。
\n\nINSERT INTO key_val VALUES ($1, $2) ON CONFLICT ON CONSTRAINT key_val_id_excl DO UPDATE SET value = ($2)\n
Run Code Online (Sandbox Code Playgroud)\n\n结果是WrongObjectTypeError ON CONFLICT DO UPDATE not supported with exclusion constraints
可能的解决方案:
\n\n …我正在尝试将 SQL Server 生成的HASHBYTES()
哈希值与 python hash()
(或hashlib
) 函数生成的哈希值进行比较。对于这两个函数,使用相同的算法。问题是我不知道 SQL 的种子,所以我无法使用 python 生成相同的输出。有没有办法设置SQL的种子?我无法找到任何与之相关的信息。
我一直在阅读有关 Hash Join 以及它在物理层面上是如何工作的。但是,有些事情我不明白(因为我缺乏知识)。
这是我找到的Hash Join算法;
for each row R1 in the build table
begin
calculate hash value on R1 join key(s)
insert R1 into the appropriate hash bucket
end
for each row R2 in the probe table
begin
calculate hash value on R2 join key(s)
for each row R1 in the corresponding hash bucket
if R1 joins with R2
return (R1, R2)
end
Run Code Online (Sandbox Code Playgroud)
这对于诸如"TABLE1.NAME == TABLE2.NAME"
等的连接条件似乎是足够的。但是,当连接条件为"TABLE1.NAME == TABLE2.NAME" && "TABLE1.AGE > TABLE2.AGE"
.
我只是无法找到并理解他们如何生成或比较需要相等运算符和其他一些关系运算符(例如大于等)的哈希值。
我们想对我们的散列函数使用 MD5 而不是 SHA_256,但从 SQL Server 2016 开始,不推荐使用 MD5。我们将其用于散列(比较哪些记录已更改)。我们现在面临着使用这个函数冒着风险或使用 SHA_256 产生存储和性能开销的困境。令人沮丧的是,Microsoft 决定弃用这些功能,即使它们在某些情况下仍然有用。
该项目不是业务的关键组成部分。我们可能会选择 SHA_256,但这是正确的选择吗?新开发应该总是避免弃用的功能吗?
对于上下文 - 每天将有大约 1-2 百万个更新插入到一个 4 亿行表中,动态比较哈希字节。大约 30 列宽
https://docs.microsoft.com/en-us/sql/t-sql/functions/hashbytes-transact-sql?view=sql-server-2017
我正在设计一个系统,在该系统中我需要能够使用文件或字符串 SHA3-256 哈希来搜索数据库。
例如,测试的哈希是
36f028580bb02cc8272a9a020f4200e346e276ae664e45ee80745574e2f5ab80
Run Code Online (Sandbox Code Playgroud)
我想使用 SQL ServerHASHBYTES()
功能。
但我不知道如何取回传递给HASHBYTES
...的值
我想知道是否有人可以阐明我的担忧,即query_plan_hash
碰撞可能导致查询作为完全不同的查询执行。
散列是一个 16 位的十六进制,sp_help sys.dm_exec_query_stats
表示是一个二进制。因此它只是一个 64 位的散列,并且碰撞似乎很有可能(考虑到 SHA1 [160 位] 刚刚被验证有碰撞)。
请问plan_hash
并query_plan_hash
都有碰撞的这个(查询作为一个完全不同的查询被执行)的情况发生?
我也很好奇 SQL Server 中是否有设置允许我们将此哈希更改为 SHA2-512(以减少发生冲突的可能性)。我们的数据非常重要。
我通过 Google 和 Stack Exchange 论坛进行了高低搜索。
我们正在 SQL 服务器表中进行并行、多线程插入,并希望减少闩锁。
利用散列分区来减少闩锁的缺点是什么?从本质上查询所有这些拆分的分区表是否降低了查询速度?
我们有大约 120 表插入每秒,金融系统。
其他注意事项:SQL 2016 系统每年将使用大约 50 GB 的 SSD 硬盘空间。目前,拥有 50 个核心处理器和 150 GB 的 RAM。
平台未搭建,所以没有基线测试;但我需要制定测试计划和策略。
哈希分区示例: http : //www.madeiradata.com/how-to-solve-the-tail-insert-problem-2/
CREATE PARTITION FUNCTION pf_hash (TINYINT)
AS RANGE LEFT FOR VALUES (0,1,2,3,4,5,6,7,8);
CREATE PARTITION SCHEME ps_hash
AS PARTITION pf_hash ALL TO ([PRIMARY]);
CREATE TABLE dbo.UserEntries_RegularWithHash
(
Id BIGINT IDENTITY NOT NULL,
UserId INT NOT NULL ,
CreatedDate DATETIME2 NOT NULL,
HashId AS CAST(Id % 9 AS TINYINT) PERSISTED NOT NULL,
CONSTRAINT PK_UserEntries_RegularWithHash
PRIMARY KEY CLUSTERED …
Run Code Online (Sandbox Code Playgroud) hashing ×12
sql-server ×8
concurrency ×1
datatypes ×1
encoding ×1
index ×1
join ×1
json ×1
oracle ×1
partitioning ×1
postgresql ×1
python ×1
t-sql ×1
unicode ×1
upsert ×1