Project

General

Profile

Actions

Bug #4252

closed

Slow queries for list precalculation (heavy parallel sequential scan 8-20 sec per each 10 mins)

Added by Pavel Kácha over 5 years ago. Updated about 5 years ago.

Status:
Closed
Priority:
Normal
Assignee:
Category:
Development - Core
Target version:
Start date:
10/05/2018
Due date:
% Done:

100%

Estimated time:
(Total: 0.00 h)
To be discussed:

Description

Date: Mon, 28 May 2018 14:17:49 +0200
From: Radko Krkoš <>
Subject: [Mentat] O optimalizácii dotazov pre číselníky

Zdravím páni,
najčastejším typom dotazu nad 2 s je získanie zoznamu unikátnych hodnôt
pre číselníky, ktoré sa opakuje každých 10 minút pre stĺpce category,
source_type, target_type, node_name, node_type, protocol,
cesnet_resolvedabuses, cesnet_eventclass a cesnet_eventseverity.

Aktuálne sa používa parlelný sekvenčný scan na 9 vlákien a každý dotaz
trvá 4 - 10 s. Dotaz je:

SELECT unnest(col) AS data FROM events GROUP BY data ORDER BY data;

pre polia, či:

SELECT col AS data FROM events GROUP BY data ORDER BY data;

pre položky typu text, t.j. cesnet_eventclass a cesnet_eventseverity.

Takýto dotaz viac nezoptimalizujeme, na unnest() index použiť nejde a
inak je sekvenčný scan aj tak najlepšia voľba.

Špecifikom týchto stĺpcov je, že pomer počtu unikátnych hodnôt k
celkovému počtu riadkov je veľmi malé číslo. Riešením by bol rekurzívny
dotaz s postupným hľadaním minima. Príklad (pre psql):

\set col cesnet_eventseverity
WITH RECURSIVE t AS (
SELECT MIN AS col FROM events
UNION ALL
SELECT (SELECT MIN FROM events WHERE :col > t.col) FROM t
WHERE t.col IS NOT NULL
)
SELECT col FROM t;

alebo pre polia (rozdiel len v poslednom riadku):

\set col protocol
WITH RECURSIVE t AS (
SELECT MIN AS col FROM events
UNION ALL
SELECT (SELECT MIN FROM events WHERE :col > t.col) FROM t
WHERE t.col IS NOT NULL
)
SELECT unnest(col) as data FROM t GROUP BY data ORDER BY data;

kde tieto sú schopné využiť veľmi rýchly Index Only Scan nad indexom
typu BTREE či lepšie s podmienkou WHERE col IS NOT NULL (menší
index). Dotaz beží jednotky ms, teda vidíme zlepšenie o 3 rády.
Problémom je že takýto index máme štandardne vytvorený len na
cesnet_eventseverity. Pre iné polia by ho bolo nutné pridať, bavíme sa o
1,5 - 3,5 GB na index teda dokopy takmer 20 GB indexov. Všetky naraz som
ich neskúšal ale začínajú sa nám objavovať volania INSERT či COMMIT
ktoré sa dostanú nad 2 s. Zatiaľ to asi problém nerobí ale nerád by som
sa dostal k zahlteniu skôr ako je nutné.*
Pre prípadné vaše odskúšanie som vytvoril index nad protocol.
Čo si o tom myslíte? Ja si nie som istý, či to nakoniec za to stojí. Ale
je to nahradenie dotazov a vytvorenie nových indexov ako sme sa bavili.


Subtasks 2 (0 open2 closed)

Bug #4350: Enum table not populated for cesnet_inspectionerrorsClosedRadko Krkoš10/05/2018

Actions
Bug #4367: Enumeration tables not consistent for non array columns that can contain NULLClosedPavel Kácha10/15/2018

Actions
Actions

Also available in: Atom PDF