Domanda

C'è un modo sistematico per forzare PostgreSQL per caricare una tabella specifica in memoria, o almeno letta dal disco in modo che sarà memorizzata nella cache dal sistema?

È stato utile?

Soluzione

Si può essere interessavano in uno dei mailing list tematiche , è answerd da Tom Lane (dev core):

[..] Ma la mia opinione è che le persone che pensano di essere più intelligente di un LRU algoritmo di caching sono tipicamente sbaglia. Se la tabella è tutto ciò che molto utilizzato, che rimarrà nella memoria va bene. Se non è sufficientemente pesantemente utilizzato per rimanere in memoria secondo un algoritmo LRU, forse lo spazio di memoria in realtà dovrebbe essere spesi per qualcos'altro. [..]

Si potrebbe anche essere interessavano in una questione SO: https://stackoverflow.com/questions/486154/postgresql -temporary-tavoli e forse più suiteable https://stackoverflow.com/questions/407006/need-to-load-the-whole-postgresql-database-into-the-ram

Altri suggerimenti

Postgres 9.4 , infine, aggiunto una proroga per dati precaricati dalle relazioni nella cache buffer di sistema operativo o database (a scelta):

pg_prewarm

Questo permette di raggiungere performance operativa pieno più rapidamente.

Esegui una volta nel database (istruzioni dettagliate qui ):

CREATE EXTENSION pg_prewarm;

Poi è semplice da precaricare qualsiasi relazione. Esempio di base:

SELECT pg_prewarm('my_tbl');

Trova il primo tabella denominata my_tbl nel percorso di ricerca e lo carica alle Postgres buffer della cache

o

SELECT pg_prewarm('my_schema.my_tbl', 'prefetch');

problemi prefetch richieste di prefetch asincrona al funzionamento sistema, se supportato, o genera un errore altrimenti. read si legge la gamma di blocchi richiesto; a differenza prefetch, questo è sincrono e supportato su tutte le piattaforme e costruisce, ma può essere Più lentamente. buffer legge la gamma di blocchi richiesto nel database tampone cache.

L'impostazione predefinita è buffer, che ha il maggiore impatto (costi più elevati, migliore effetto).

Leggi il manuale per maggiori dettagli , citazioni ci sono da.
Depesz Blogged su di esso, anche.

Nel caso generale, se avete abbastanza RAM si può generalmente fidare del servizio di database per fare un buon lavoro di mantenere le cose che usate regolarmente in RAM. Alcuni sistemi consentono di suggerimento che il tavolo deve sempre essere tenuto in RAM (che è utile per le tabelle piuttosto piccolo che non vengono utilizzati spesso, ma quando sono utilizzati, è importante che essi rispondono più rapidamente possibile), ma se pgsql ha tali hint di tabella è necessario essere molto attenti a servirsi di esse come si stanno riducendo la quantità di memoria disponibile per la memorizzazione nella cache qualsiasi altra cosa per cui si potrebbe rallentare l'applicazione generale.

Se stai cercando di primo cache della pagina della banca dati all'avvio (per esempio dopo un riavvio o altra operazione ha impiegato che fa sì che il DB di dimenticare tutto ciò che è memorizzato nella cache) e poi scrivere uno script che esegue le operazioni seguenti:

SELECT * FROM <table>
SELECT <primary key fields> FROM <table> ORDER BY <primary key fields>
SELECT <indexed fields> FROM <table> ORDER BY <indexed fields>

(che ultimo passo ripetuto per ciascun indice, o corso, e fare attenzione ad avere i campi nella clausola ORDER BY nel giusto ordine)

Dopo aver eseguito il sopra di ogni pagina di dati e l'indice avrebbe dovuto essere letto e così sarà nella cache di pagina RAM (per ora almeno). Abbiamo script come questo per i nostri database dell'applicazione, che sono gestiti dopo il riavvio in modo che i primi utenti che accedono al sistema poi non si verificano più lento di risposta. Si sta meglio tale sceneggiatura, invece di scansione delle tabelle di definizione db (come sys.objects / sys.indexes / sys.columns in MSSQL), quindi è possibile eseguire la scansione in modo selettivo gli indici che sono più comunemente utilizzati, piuttosto che la scansione tutto che avrà più.

Ho avuto problemi simili:
Dopo aver riavviato il servizio di server e tutti i dati incassati caduto, molte query chiamati prima volta in cui davvero molto lento, causa specifica complessità delle query, fino a quando tutti gli indici ei dati necessari è stato incassato. che significa, ad esempio gli utenti devono colpire una volta ogni "voce" (1-3 sec tempo exec) ei relativi dati da 50 milioni di righe, quindi gli utenti non avrebbero esperienza più eventuali ritardi indesiderati. Ci vogliono prime 3 ore per gli utenti di sperimentare si blocca fastidioso, finché la maggior parte dei dati utilizzato è incassato e programmi stanno rovinando prim'ordine con performance di produzione, fine anche in questo caso, 2 giorni alcuni improvvisi brevi ritardi, quando colpisce i dati a cui si accede meno prima volta ... , per i dati statistici, ecc.

Per risolvere questo problema, ha scritto un piccolo script python che fa eseguire seleziona il più pesanti tavole usate con grandi indici. Ci sono voluti 15 minuti per correre, e senza ritardi delle prestazioni.

Hmmm, può essere comando COPY aiuterebbe. Basta eseguire COPIA per stdout e leggere da esso. E 'possibile farlo utilizzando pg_dump:

pg_dump -U <user> -t <table> <database> > /dev/null

Un altro modo è quello di trovare tutti i file da tavolo e cat <files> > /dev/null periodo.

Ecco l'esempio su come ottenere i nomi dei file di tabella:

# SELECT oid, datname FROM pg_database ;
  oid  |  datname  
-------+-----------                                                                                                                                          
<...>
 16384 | test
-- out of database is 16384
# SELECT oid, relname FROM pg_class WHERE relname like 'fn%';
  oid  | relname 
-------+---------
 24576 | fn
(1 row)
-- oid of our table is 24576

così, il file di tabella (s) è / path / to / pgsql / data / base / 16384/24576 *

È migth vuole leggere indici e tabelle pane tostato così, mettere le OID nello stesso modo.

A proposito, perché avete bisogno? Credo PostgreSQL e OS è abbastanza intelligente per memorizzare nella cache i dati più calde e mantenere una buona. cache di efficienza.

RAMDrive da QSoft, che era parametro di riferimento come ramdisk più veloce per Windows. Ho appena usato

initdb -D e:\data

dove e:. \ È il luogo del ramdisk

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a dba.stackexchange
scroll top