如何从 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?的主要内容,如果未能解决你的问题,请参考以下文章
HSQLDB: INSERT INTO ... (SELECT NULL, * FROM) 导致“列名重复”