【问题标题】:Performance issue in updating Hashkey using HASHBYTES 'SHA2_256' for huge volume of ~20 million使用 HASHBYTES 'SHA2_256' 更新 Hashkey 的性能问题,大约为 2000 万
【发布时间】:2020-05-29 10:24:21
【问题描述】:

我有一个场景,我需要更新近 2000 万条记录的哈希键值。哈希键需要使用近70个属性生成,会在频繁的连接条件下使用。

我正在将HASHBYTES 输出转换为NVARCHAR,然后更新具有近2000 万条记录的临时表。更新语句需要 3 多个小时才能运行。

UPDATE #TempSomeTable
SET HashKey = CONVERT(NVARCHAR(50), HASHBYTES('SHA2_256',CONCAT(ISNULL(COL_1,'NA'),ISNULL(COL_2,'NA'),ISNULL(COL_3,'NA'),.....ISNULL(COL_70,'NA'))),2)

这里,HashKey 的数据类型是NVARCHAR(50)

这里有人可以建议如何提高性能吗?

我正在看几个选项:

  1. 将临时表转换为 MEMORY OPTIMIZED 表
  2. UPDATE 语句之前的某处应用ISNULL
  3. 将数据类型从 NVARCHAR(50) 更改为 VARCHAR(50)BINARY(32)
  4. 代替UPDATE,将数据写入新的临时表并在SELECT 中导出哈希键,同时将记录插入新表(内存优化表可能代替临时表)

请帮助和反馈。

【问题讨论】:

  • 这是一个非常特定于 SQL Server 的问题。 标签适用于 ANSI/ISO SQL。

标签: sql-server performance


【解决方案1】:
  • 获得更快的计算机
  • 不要使用 ONE 更新 - 找到一种方法将其拆分为各种更新,即按主键范围。然后,您可以在多个连接上并行发出这些。如果您有一台 16 核机器,理论上您可以将更新拆分为 16 个连接 - 虽然不在临时表上,但您必须将其设为 GLOBAL 临时表(前缀 ##),以便所有连接都可以看到它(即好的 - 给它一个随机名称,即一个 GUID,你就可以了)。

最后,Hashbytes 在您使用时是串行的(在更新中),并且不是必要时最快的(它的作用很多)。

【讨论】:

    猜你喜欢
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-04
    • 2016-05-12
    • 1970-01-01
    • 2021-11-14
    • 2020-05-04
    相关资源
    最近更新 更多