From 1e4432b1f38ff9e400b543164a6fb55687546ca5 Mon Sep 17 00:00:00 2001 From: catbref Date: Mon, 10 Aug 2020 13:59:56 +0100 Subject: [PATCH] Convert LOBs to VARBINARY in DB, reducing sizes at the same time --- .../hsqldb/HSQLDBDatabaseUpdates.java | 23 ++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/qortal/repository/hsqldb/HSQLDBDatabaseUpdates.java b/src/main/java/org/qortal/repository/hsqldb/HSQLDBDatabaseUpdates.java index 97aca3bc..faf351ff 100644 --- a/src/main/java/org/qortal/repository/hsqldb/HSQLDBDatabaseUpdates.java +++ b/src/main/java/org/qortal/repository/hsqldb/HSQLDBDatabaseUpdates.java @@ -95,7 +95,6 @@ public class HSQLDBDatabaseUpdates { stmt.execute("CREATE COLLATION SQL_TEXT_NO_PAD FOR SQL_TEXT FROM SQL_TEXT NO PAD"); stmt.execute("SET FILES SPACE TRUE"); // Enable per-table block space within .data file, useful for CACHED table types - stmt.execute("SET FILES LOB SCALE 1"); // LOB granularity is 1KB // Slow down log fsync() calls from every 500ms to reduce I/O load stmt.execute("SET FILES WRITE DELAY 5"); // only fsync() every 5 seconds @@ -103,15 +102,15 @@ public class HSQLDBDatabaseUpdates { stmt.execute("INSERT INTO DatabaseInfo VALUES ( 0 )"); stmt.execute("CREATE TYPE ArbitraryData AS VARBINARY(256)"); - stmt.execute("CREATE TYPE AssetData AS CLOB(400K)"); + stmt.execute("CREATE TYPE AssetData AS VARCHAR(400K)"); stmt.execute("CREATE TYPE AssetID AS BIGINT"); stmt.execute("CREATE TYPE AssetName AS VARCHAR(34) COLLATE SQL_TEXT_NO_PAD"); stmt.execute("CREATE TYPE AssetOrderID AS VARBINARY(64)"); - stmt.execute("CREATE TYPE ATCode AS BLOB(64K)"); // 16bit * 1 - stmt.execute("CREATE TYPE ATCreationBytes AS BLOB(576K)"); // 16bit * 1 + 16bit * 8 + stmt.execute("CREATE TYPE ATCode AS VARBINARY(1024)"); // was: 16bit * 1 + stmt.execute("CREATE TYPE ATCreationBytes AS VARBINARY(4096)"); // was: 16bit * 1 + 16bit * 8 stmt.execute("CREATE TYPE ATMessage AS VARBINARY(32)"); stmt.execute("CREATE TYPE ATName AS VARCHAR(32) COLLATE SQL_TEXT_UCC_NO_PAD"); - stmt.execute("CREATE TYPE ATState AS BLOB(1M)"); // 16bit * 8 + 16bit * 4 + 16bit * 4 + stmt.execute("CREATE TYPE ATState AS VARBINARY(1024)"); // was: 16bit * 8 + 16bit * 4 + 16bit * 4 stmt.execute("CREATE TYPE ATTags AS VARCHAR(80) COLLATE SQL_TEXT_UCC_NO_PAD"); stmt.execute("CREATE TYPE ATType AS VARCHAR(32) COLLATE SQL_TEXT_UCC_NO_PAD"); stmt.execute("CREATE TYPE ATStateHash as VARBINARY(32)"); @@ -142,7 +141,7 @@ public class HSQLDBDatabaseUpdates { + "transaction_count INTEGER NOT NULL, total_fees QortalAmount NOT NULL, transactions_signature Signature NOT NULL, " + "height INTEGER NOT NULL, minted_when EpochMillis NOT NULL, " + "minter QortalPublicKey NOT NULL, minter_signature Signature NOT NULL, AT_count INTEGER NOT NULL, AT_fees QortalAmount NOT NULL, " - + "online_accounts BLOB(1M), online_accounts_count INTEGER NOT NULL, online_accounts_timestamp EpochMillis, online_accounts_signatures BLOB(1M), " + + "online_accounts VARBINARY(1204), online_accounts_count INTEGER NOT NULL, online_accounts_timestamp EpochMillis, online_accounts_signatures VARBINARY(1M), " + "PRIMARY KEY (signature))"); // For finding blocks by height. stmt.execute("CREATE INDEX BlockHeightIndex ON Blocks (height)"); @@ -634,6 +633,18 @@ public class HSQLDBDatabaseUpdates { stmt.execute("CREATE INDEX IF NOT EXISTS ATCodeHashIndex ON ATs (code_hash, is_finished)"); break; + case 22: + // LOB downsizing + stmt.execute("ALTER TABLE Blocks ALTER COLUMN online_accounts VARBINARY(1024)"); + stmt.execute("ALTER TABLE Blocks ALTER COLUMN online_accounts_signatures VARBINARY(1048576)"); + + stmt.execute("ALTER TABLE DeployATTransactions ALTER COLUMN creation_bytes VARBINARY(4096)"); + + stmt.execute("ALTER TABLE ATs ALTER COLUMN code_bytes VARBINARY(1024)"); + + stmt.execute("ALTER TABLE ATStates ALTER COLUMN state_data VARBINARY(1024)"); + break; + default: // nothing to do return false;