主キーと 8 つのインデックスを持つ 18 列のテーブルがあります。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つしかない場合でも、問題は残ります。
これを高速化し、更新のパフォーマンスを向上させる方法を誰か教えてください。設計によるレイの削除と追加です>>
私たちのアプリケーションはマルチスレッドであり、接続行に MVCC=true を追加した「テーブルをロックしようとしてタイムアウト エラーが発生しました」という問題が発生し、別の問題が発生しました。