当前位置: 首页 > 知识库问答 >
问题:

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

钮才哲
2023-03-14

我有一个包含18列主键和8个索引的表。如果我与H2 DB(嵌入式模式)建立通常的连接并更新该表的非索引字段,则在H2控制台中更新50000条记录大约需要20秒。但是,如果我在连接字符串中设置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子句中只使用了1个索引,问题仍然存在。

有人能告诉我如何加快速度,提高更新性能吗。是通过设计删除然后添加leys

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

共有1个答案

庄康胜
2023-03-14

MVCC模式是实验性的。此外,我们将在某种程度上用另一个引擎替换它,因此使用它确实是一种“风险自负”的解决方案

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

 类似资料:
  • 数据更新时间指当前可分析数据是什么时间准备好的。通过它你可以了解到,目前数据的时效性。 eg:当数据更新时间显示为3分钟前,则代表可以查看约3分钟之前的数据;当数据更新时间显示00:00~6:00的某一个时间,则代表可以查看前一天以及更早的数据。 1.数据更新频率 (1) 当应用刚创建时,支持分钟级别数据更新频率,即刚上传的数据在几分钟内就能在系统中看到 (2) 当应用累计事件触发超过10000

  • 问题内容: 我在C#/ Visual Studio 2008中使用MySQL。我需要知道任何方法,以便如果一个用户更新数据库,则通过网络通知所有已登录用户已发生更改。如果我通过我的应用程序登录数据库,那时候数据库中最新记录的序列号是10,然后我有特权的人更新了数据库中的记录,同时我收到通知,数据库已更新为新记录。常见的例子可能是MSN Messenger的一个朋友上线时向他发出警报的提示……虽然我

  • 我目前正在重构遗留代码,以使用Android架构组件,并在一种存储库模式中设置一个房间数据库和截取请求。因此,表示层/域层要求存储库获取LiveData对象进行观察,或告诉他与服务器同步,然后删除旧的db条目,并从服务器中重新提取所有当前条目。 我已经写了同步部分的测试,所以我确信,对象被正确地获取并插入到数据库中。但是当写一个测试来观察db表的条目时(并测试对象是否被正确保存,以及在将它们放入d

  • 我正在通过JDBC准备语句更新远程数据库。当我执行相同的代码来更新本地数据库时,需要几毫秒的时间,但是对于远程数据库来说,大约900行的时间太长了。所有行的大小加起来是160 KB。远程主机是Hostgator,表的数据库引擎是InnoDB。 下面是我的代码:

  • 这很慢吗?我有一个表有4列ID姓氏教练城 我有一个添加数据按钮,它添加了300行,每列都包含数据,所以总共有1200条记录。 实际添加数据只需4分钟多(这意味着从我按下按钮到显示消息框完成)。 我在澳大利亚的ADSL2上,速度测试刚刚完成,下载速度为28ms ping 14.12Mbps,上传速度为0.49Mbps 我知道澳大利亚互联网是一个笑话,但这似乎真的很慢! 这仅仅是因为我的网络上传速度吗