当MVCC = true时,H2数据库更新表执行时间过长

时间:2012-11-04 13:54:22

标签: h2

我有一个包含18个列的表,其中包含一个主键和8个索引。如果我与H2 DB(嵌入模式)进行常规连接并更新此表的非索引字段,则在H2控制台中需要大约20秒才能更新50000条记录。但是,如果我在连接字符串中设置MVCC = true,然后尝试更新SAME 50000记录,则表格不会更新超过30分钟

下面的架构

CREATE TABLE
    TEMP
    (
        SWITCHIPADDRESS VARCHAR(16),
        ID BIGINT NOT NULL IDENTITY,
        MACADDRESS VARCHAR(14),
        USERID VARCHAR(32),
        TIMESTMP TIMESTAMP NOT NULL,
        LINKCOUNT INTEGER,
        HASLINKTOSWITCH BOOLEAN,
        LINKIPADDR VARCHAR(16),
        IFINDEX INTEGER,
        PORT INTEGER,
        SLOT INTEGER,
        VLANID INTEGER,
        IFSPEED INTEGER,
        IFADMINSTATUS INTEGER,
        PORTDUPLEXMODE INTEGER,
        UNP VARCHAR(32),
        DOMAIN INTEGER,
        DISPOSITION INTEGER,
        PRIMARY KEY (ID)
    )

索引

KEY `ForwardIdx` (`SwitchIPAddress`,`MACAddress`,`slot`,`port`),
KEY `ForwardSwIPIdx` (`SwitchIPAddress`),
KEY `ForwardMACIdx` (`MACAddress`),
KEY `ForwardSlotIdx` (`slot`),
KEY `ForwardPortIdx` (`port`),
KEY `ForwardVlanIdx` (`VlanID`),
KEY `UserIdIdx` (`UserId`),
KEY `UNPIdx` (`UNP`)

我可以在跟踪日志文件中看到,数千个密钥首先被删除然后被添加,这可能需要时间。但我想知道,为什么要做的关键重新调整是在非idx字段上进行的简单更新。

即使我只有一个在where子句中使用的索引,问题仍然存在。

有人可以让我知道如何加快速度并提高更新性能。是设计>>

删除然后添加leys

我们的应用程序是多线程的,我们收到“试图锁定表的超时错误”问题,我已经在连接线中添加了MVCC = true,现在遇到了另一个问题。

1 个答案:

答案 0 :(得分:0)

MVCC模式是实验性的。此外,我们将使用不同的引擎替换它,因此使用它实际上是“自担风险”的解决方案。

我建议您关闭MVCC模式,并尝试以其他方式修复超时问题。