mirror of
https://github.com/XRPLF/clio.git
synced 2025-11-24 13:45:52 +00:00
expand primary key on account_transactions to support index only scans. fix account_tx stored procedure
This commit is contained in:
@@ -781,8 +781,8 @@ create table if not exists transactions5 partition of transactions for values fr
|
|||||||
create table if not exists transactions6 partition of transactions for values from (50000000) to (60000000);
|
create table if not exists transactions6 partition of transactions for values from (50000000) to (60000000);
|
||||||
create table if not exists transactions7 partition of transactions for values from (60000000) to (70000000);
|
create table if not exists transactions7 partition of transactions for values from (60000000) to (70000000);
|
||||||
|
|
||||||
-- create index if not exists tx_by_hash on transactions using hash (hash);
|
create index if not exists tx_by_hash on transactions using hash (hash);
|
||||||
-- create index if not exists tx_by_lgr_seq on transactions using hash (ledger_seq);
|
create index if not exists tx_by_lgr_seq on transactions using hash (ledger_seq);
|
||||||
|
|
||||||
-- Table that maps accounts to transactions affecting them. Deletes from the
|
-- Table that maps accounts to transactions affecting them. Deletes from the
|
||||||
-- ledger table cascade here based on ledger_seq.
|
-- ledger table cascade here based on ledger_seq.
|
||||||
@@ -791,7 +791,7 @@ CREATE TABLE IF NOT EXISTS account_transactions (
|
|||||||
ledger_seq bigint NOT NULL ,
|
ledger_seq bigint NOT NULL ,
|
||||||
transaction_index bigint NOT NULL,
|
transaction_index bigint NOT NULL,
|
||||||
hash bytea NOT NULL,
|
hash bytea NOT NULL,
|
||||||
PRIMARY KEY (account, ledger_seq, transaction_index)
|
PRIMARY KEY (account, ledger_seq, transaction_index, hash)
|
||||||
) PARTITION BY RANGE (ledger_seq);
|
) PARTITION BY RANGE (ledger_seq);
|
||||||
create table if not exists account_transactions1 partition of account_transactions for values from (0) to (10000000);
|
create table if not exists account_transactions1 partition of account_transactions for values from (0) to (10000000);
|
||||||
create table if not exists account_transactions2 partition of account_transactions for values from (10000000) to (20000000);
|
create table if not exists account_transactions2 partition of account_transactions for values from (10000000) to (20000000);
|
||||||
@@ -839,10 +839,13 @@ CREATE TABLE IF NOT EXISTS books (
|
|||||||
-- To reiterate:
|
-- To reiterate:
|
||||||
-- JSON input field 'ledger' corresponds to _in_marker_seq
|
-- JSON input field 'ledger' corresponds to _in_marker_seq
|
||||||
-- JSON input field 'seq' corresponds to _in_marker_index
|
-- JSON input field 'seq' corresponds to _in_marker_index
|
||||||
CREATE OR REPLACE FUNCTION account_tx(_in_account_id bytea, _in_limit bigint, _in_marker_seq bigint DEFAULT NULL::bigint, _in_marker_index bigint DEFAULT NULL::bigint)
|
CREATE OR REPLACE FUNCTION account_tx(
|
||||||
RETURNS jsonb
|
_in_account_id bytea,
|
||||||
LANGUAGE plpgsql
|
_in_limit bigint,
|
||||||
AS $function$
|
_in_marker_seq bigint DEFAULT NULL::bigint,
|
||||||
|
_in_marker_index bigint DEFAULT NULL::bigint)
|
||||||
|
RETURNS jsonb
|
||||||
|
AS $$
|
||||||
DECLARE
|
DECLARE
|
||||||
_min bigint;
|
_min bigint;
|
||||||
_max bigint;
|
_max bigint;
|
||||||
@@ -878,7 +881,7 @@ BEGIN
|
|||||||
|
|
||||||
|
|
||||||
_sql := format('SELECT hash, ledger_seq, transaction_index FROM account_transactions WHERE account = $1
|
_sql := format('SELECT hash, ledger_seq, transaction_index FROM account_transactions WHERE account = $1
|
||||||
AND ledger_seq BETWEEN $2 AND $3 ORDER BY ledger_seq, transaction_index');
|
AND ledger_seq BETWEEN $2 AND $3 ORDER BY ledger_seq DESC, transaction_index DESC');
|
||||||
|
|
||||||
OPEN _cursor FOR EXECUTE _sql USING _in_account_id, _between_min, _between_max;
|
OPEN _cursor FOR EXECUTE _sql USING _in_account_id, _between_min, _between_max;
|
||||||
LOOP
|
LOOP
|
||||||
@@ -886,14 +889,8 @@ BEGIN
|
|||||||
IF _record IS NULL THEN EXIT; END IF;
|
IF _record IS NULL THEN EXIT; END IF;
|
||||||
IF _marker IS TRUE THEN
|
IF _marker IS TRUE THEN
|
||||||
IF _in_marker_seq = _record.ledger_seq THEN
|
IF _in_marker_seq = _record.ledger_seq THEN
|
||||||
IF _in_forward IS TRUE THEN
|
IF _in_marker_index < _record.transaction_index THEN
|
||||||
IF _in_marker_index > _record.transaction_index THEN
|
CONTINUE;
|
||||||
CONTINUE;
|
|
||||||
END IF;
|
|
||||||
ELSE
|
|
||||||
IF _in_marker_index < _record.transaction_index THEN
|
|
||||||
CONTINUE;
|
|
||||||
END IF;
|
|
||||||
END IF;
|
END IF;
|
||||||
END IF;
|
END IF;
|
||||||
_marker := FALSE;
|
_marker := FALSE;
|
||||||
|
|||||||
Reference in New Issue
Block a user