Ho appena ristrutturato il mio database per utilizzare partitioning in Postgres 8.2. Ora ho un problema con le prestazioni delle query:Interrogazione efficiente della tabella Postgres multi-partizione
SELECT *
FROM my_table
WHERE time_stamp >= '2010-02-10' and time_stamp < '2010-02-11'
ORDER BY id DESC
LIMIT 100;
Ci sono 45 milioni di righe nella tabella. Prima del partizionamento, questo utilizza una scansione dell'indice inverso e si interrompe non appena raggiunge il limite.
Dopo il partizionamento (su intervalli time_stamp), Postgres esegue una scansione dell'indice completa della tabella principale e della partizione pertinente e unisce i risultati, li ordina, quindi applica il limite. Questo richiede troppo tempo.
posso risolvere il problema con:
SELECT * FROM (
SELECT *
FROM my_table_part_a
WHERE time_stamp >= '2010-02-10' and time_stamp < '2010-02-11'
ORDER BY id DESC
LIMIT 100) t
UNION ALL
SELECT * FROM (
SELECT *
FROM my_table_part_b
WHERE time_stamp >= '2010-02-10' and time_stamp < '2010-02-11'
ORDER BY id DESC
LIMIT 100) t
UNION ALL
... and so on ...
ORDER BY id DESC
LIMIT 100
Questa corre rapidamente. Le partizioni in cui i timestamp sono fuori intervallo non sono nemmeno incluse nel piano di query.
La mia domanda è: Esiste qualche suggerimento o sintassi che posso utilizzare in Postgres 8.2 per impedire a query-planner di eseguire la scansione dell'intera tabella ma utilizzando ancora una sintassi semplice che si riferisce solo alla tabella principale?
In sostanza, è possibile evitare il fastidio di creare dinamicamente la grande query UNION su ogni partizione che si verifica attualmente?
EDIT: ho constraint_exclusion abilitato (grazie @Vinko Vrsalovic)
8.2? veramente? Prima di fare qualsiasi altra cosa si dovrebbe prendere in considerazione l'aggiornamento a una versione supportata (e corrente) di Postgres (9.2 è quella attuale) –