Я смотрю на Range Partition одной из моих таблиц (т. Е. TransactionLog) в PostgreSQL 11.
При оценке производительности запросов между однораздельной и многораздельной таблицами я получаю огромную разницу во времени планирования. Время планирования в многораздельной таблице очень велико.
Аналогично, когда я запрашиваю, указав имя раздела непосредственно в запросе, время планирования намного меньше 0,081 мс по сравнению с тем, когда я запрашиваю на основе таблицы разделов (родительская таблица). ) имя в запросе, где время планирования 6,231 мс (примеры ниже).
Дайте мне знать, как улучшить производительность запроса для многораздельной таблицы.
Ниже приведена схема
CREATE TABLE TransactionLog (
txid character varying(36) NOT NULL,
txnDetails character varying(64),
loggingtime timestamp(6) without time zone DEFAULT LOCALTIMESTAMP,
) PARTITION BY RANGE(loggingtime);
CREATE TABLE IF NOT EXISTS TransactionLog_20200223 PARTITION OF TransactionLog FOR VALUES FROM ('2020-02-23') TO ('2020-02-24');
CREATE UNIQUE INDEX TransactionLog_20200223_UnqTxId ON TransactionLog_20200223 (txnid);
Ниже приводится объяснение результатов анализа при запросе непосредственно в разделе. Время планирования ~ 0,080 мс (среднее из 10 выполнений)
postgres=> EXPLAIN (ANALYZE,VERBOSE,COSTS,BUFFERS,TIMING,SUMMARY) select txnDetails FROM mra_part.TransactionLog_20200223 WHERE txnid = 'febd139d-1b7f-4564-a004-1b3474e51756';
QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
Index Scan using TransactionLog_20200223_UnqTxId on TransactionLog_20200223 (cost=0.57..4.61 rows=1 width=10) (actual time=0.039..0.040 rows=1 loops=1)
Output: txnDetails
Index Cond: ((TransactionLog_20200223.txnid)::text = 'febd139d-1b7f-4564-a004-1b3474e51756'::text)
Buffers: shared hit=5
**Planning Time: 0.081 ms**
Execution Time: 0.056 ms
(6 rows)
Ниже приводится объяснение результатов анализа при запросе по родительской таблице. Время планирования ~ 6,198 мс (среднее из 10 выполнений)
postgres=> EXPLAIN (ANALYZE,VERBOSE,COSTS,BUFFERS,TIMING,SUMMARY) select txnDetails FROM mtdauthlog WHERE txnid = 'febd139d-1b7f-4564-a004-1b3474e51756' AND loggingtime >= '2020-02-23'::timestamp without time zone AND loggingtime < '2020-02-24'::timestamp without time zone;
QUERY PLAN
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Append (cost=0.57..4.62 rows=1 width=10) (actual time=0.036..0.037 rows=1 loops=1)
Buffers: shared hit=5
-> Index Scan using TransactionLog_20200223_UnqTxId on TransactionLog_20200223 (cost=0.57..4.61 rows=1 width=10) (actual time=0.035..0.036 rows=1 loops=1)
Output: TransactionLog_20200223.txnDetails
Index Cond: ((TransactionLog_20200223.txnid)::text = 'febd139d-1b7f-4564-a004-1b3474e51756'::text)
Filter: ((TransactionLog_20200223.loggingtime >= '2020-02-23 00:00:00'::timestamp without time zone) AND (TransactionLog_20200223.loggingtime < '2020-02-24 00:00:00'::timestamp without time zone))
Buffers: shared hit=5
**Planning Time: 6.231 ms**
Execution Time: 0.076 ms
(9 rows)
PostgreSQL Версия: PostgreSQL 11,7 на x86_64-p c - linux - GNU, скомпилированный g cc (G CC) 4.8.5 20150623 (Red Hat 4.8.5-39), 64-битный