如何从 SELECT 加速 HSQLDB UPDATE?

Posted

技术标签:

【中文标题】如何从 SELECT 加速 HSQLDB UPDATE?【英文标题】:How to speed up HSQLDB UPDATE from SELECT? 【发布时间】:2013-12-05 20:32:03 【问题描述】:

我需要从这样的查找表中设置我的主表中的值:

UPDATE primary
SET primary.value =
  (SELECT lookup.value FROM lookup WHERE primary.key = lookup.key)

关键字段是两个表中的 VARCHAR 字段,并且在主表中具有索引,在查找表中具有唯一索引。

这两个表的行数都在大约 1000 万行范围内。

在具有 12 个内核并分配了 15G 堆空间的快速服务器上使用 HSQLDB 2.3 需要非常长的时间。

为了尽可能加快此操作,我应该知道哪些事项?有没有什么我可能做错了,以至于性能可能会受到严重影响?涉及的 VARCHAR 键字段的最大大小是否有严重影响?

我已经看到,理论上,在 SQL 中执行此操作的其他方法,人们声称它们要快得多,但 HSQLDB 似乎不支持其中任何一种。

【问题讨论】:

什么是“难以置信的长”? 请在涉及的表上发布定义的索引。您是否尝试过MERGE 声明?你可以在那里加入。 实际的问题是:你为什么要首先进行更新?如果primary.key 引用lookup 表,您始终可以在查询中加入lookup 表。据我所知,您实际上是在复制外键引用的数据。 primary.value 上有一个非唯一键,lookup.value 上有一个唯一键 我想这样做的原因是我最终需要一个非规范化的快速访问表.换句话说,我希望能够通过从一个表中检索一行来查找我需要的所有信息(一旦该表完成,它将不再更新,因此不需要规范化)。跨度> 【参考方案1】:

回答一:

您实际上在做的是:将 1000 万个(子)选择发送到数据库(至少在大多数数据库系统中)。我不知道这背后的真正需求,但我会尝试通过批量导出/加载表之类的方法来解决这个问题

回答二:

您可能会遇到一个可怕的锁定和日志记录 (LOGFILE) 问题。再次:我会尝试使用类似 EXPORT/LOAD 表的批量操作

编辑:EXPORT/IMPORT - 我不知道(你需要的)语法,基础

EXPORT 
  select -needed fields- 
  from 
      primary, lookup
  where
      primary.key = lookup.key -- this will be fast


IMPORT into primary pevios EXPORT 

编辑: 在开始更新之前尝试“以独占模式锁定表”之类的东西

【讨论】:

谢谢你这是解决我的问题的好主意!有点难以相信 HSQLDB 真的没有任何东西可以有效地更新表。我严重怀疑我已经决定使用 HSQLDB。正如我所说,我通常会在没有子选择的情况下使用正确的 JOIN 语法来执行此操作,但 HSQLDB 似乎不支持这一点(尽管我不确定是否没有其他方法可以实现这一点) @Johsm 它不是真正的数据库(系统)问题;在我写这篇文章时,在开始更新之前尝试“以独占模式锁定表”之类的东西 我实际上正在使用一些据说应该加快速度的语句:自动提交关闭、没有文件日志、NIO 大小增加、事务控制 MVCC,但这并没有太大帮助。关于你的建议,我认为直接创建一个新的“主”表可能会更快,使用 insert INSERT INTO newprimary (fields) SELECT fields FROM primary, lookup WHERE ... @Johsm(我还是不知道你的环境)尝试这样的事情:创建表primary_next,插入primary_next,删除primary,将primary_next重命名为primary;如果在您的环境中可能的话 "调度 1000 万个(子)选择" 没有一个具有良好优化器的 DBMS 可以做到这一点。

以上是关于如何从 SELECT 加速 HSQLDB UPDATE?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 HSQL 获取用户帐户列表?

HSQLDB: INSERT INTO ... (SELECT NULL, * FROM) 导致“列名重复”

hsqldb select查询真的很慢

如何从命令行停止 HSQLDB

HSQLDB - 可更新语句不适用于“SELECT TOP”或“ORDER BY”

如何在 Hypersql 数据库(HSQLDB)中设置 Rank 函数