如何从SELECT加速HSQLDB更新?

如何从SELECT加速HSQLDB更新?,sql,performance,sql-update,hsqldb,Sql,Performance,Sql Update,Hsqldb,我需要从如下查找表中设置主表中的值: UPDATE primary SET primary.value = (SELECT lookup.value FROM lookup WHERE primary.key = lookup.key) 键字段在两个表中都是VARCHAR字段,在主表中有一个索引,在查找表中有一个唯一索引 两个表的行数都在1000万行左右 HSQLDB2.3在一台12核、15G heapspace分配的快速服务器上运行,这需要非常长的时间 我应该知道哪些事情来尽可能地加快这

我需要从如下查找表中设置主表中的值:

UPDATE primary
SET primary.value =
  (SELECT lookup.value FROM lookup WHERE primary.key = lookup.key)
键字段在两个表中都是VARCHAR字段,在主表中有一个索引,在查找表中有一个唯一索引

两个表的行数都在1000万行左右

HSQLDB2.3在一台12核、15G heapspace分配的快速服务器上运行,这需要非常长的时间

我应该知道哪些事情来尽可能地加快这个操作?有没有什么事情是我做错了,以至于我的表现会受到严重影响?所涉及的VARCHAR键字段的最大大小是否有任何严重影响

我已经看到,理论上,在SQL中有其他方法可以做到这一点,人们声称它们的速度快得多,但HSQLDB似乎不支持任何一种方法。

回答一:

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

答复二:

您可能会遇到一个非常严重的锁定和日志(LOGFILE)问题。再次:我会尝试使用类似批量导出/加载表的方法

编辑:导出/导入-我不知道(你需要的)语法,基本知识

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


IMPORT into primary pevios EXPORT 
编辑:
在开始更新之前,请尝试“在独占模式下锁定表”

什么是“难以置信的长”?请在相关表上发布定义的索引。您是否尝试了
MERGE
语句?你可以在那里做一个连接。而实际的问题是:你为什么要首先进行更新?如果
primary.key
引用
lookup
表,您可以在查询中始终加入
lookup
表。据我所知,您实际上正在复制外键引用的数据。primary.value上有一个非唯一键,lookup.value上有一个唯一键。我之所以要这样做,是因为我最终需要一个表来进行快速访问,这是非规范化的。换句话说,我希望能够通过从一个表中检索一行来查找我所需的所有信息(一旦该表完成,它将不再更新,因此不需要进行规范化)。谢谢您这是解决我的问题的好主意!很难相信HSQLDB真的没有任何东西可以有效地更新表。我严重怀疑我是否已经决定使用HSQLDB。正如我所说的,我通常不会使用正确的连接语法进行子选择,但HSQLDB似乎不支持这一点(尽管我不确定是否有其他方法来实现这一点)@Johsm这不是一个真正的DB(系统)问题;在我写这篇文章的时候,在开始更新之前,尝试一下像“独占模式下锁定表”这样的方法。我实际上使用了一些语句,这些语句应该可以加快更新速度:自动提交关闭、无文件日志、NIO大小增加、事务控制MVCC,但这并没有多大帮助。关于您的建议,我认为直接创建一个新的“主”表可能会更快,使用insert insert to newprimary(字段)从主字段中选择字段,查找其中…@Johsm(我也不知道您的环境)尝试这样的操作:下一步创建表主字段,下一步插入主字段,删除主字段,将primary_重命名为primary旁边的primary_;如果在您的环境中“调度1000万(子)选择”是可能的,那么没有一个具有适当优化器的DBMS可以做到这一点。