Vous êtes libres de redistribuer et/ou modifier cette création selon les conditions suivantes :
Paternité
Pas d'utilisation commerciale
Partage des conditions initiales à l'identique
Technologie | Temps d'accès | Débit en lecture |
---|---|---|
RAM |
|
|
Fusion IO |
|
|
SSD |
|
|
SCSI 15ktpm |
|
|
SATA |
|
|
Thick Provisionning
»*_flush_after
)kernel.sched_migration_cost_ns = 5000000
(sched_migration_cost
pour les noyaux <3.6)kernel.sched_autogroup_enabled = 0
vm.nr_overcommit_hugepages=x
huge_pages=on|off|try
min_wal_size
et max_wal_size
à partir de la version 9.5Python
, par Greg Smith
Ruby
par Alexey VasilievSELECT only
, UPDATE only
ou TPC-B
seq_page_cost
, random_page_cost
, effective_io_concurrency
Perl
par Julien FrancozPostgreSQL propose de nombreuses voies d'optimisation.
Cela passe en priorité par un bon choix des composants matériels et par une configuration pointilleuse. Mais ceci ne peut se faire qu'en connaissance de l'ensemble du système, et notamment des applications utilisant les bases de l'instance.
N'hésitez pas, c'est le moment !
WHERE
Cette requête d'exemple :
SELECT matricule, nom, prenom, nom_service, fonction, localisation
FROM employes emp
JOIN services ser ON (emp.num_service = ser.num_service)
WHERE ser.localisation = 'Nantes';
L'objet de ce module est de comprendre son plan d'exécution :
Hash Join (cost=1.06..2.29 rows=4 width=48)
Hash Cond: (emp.num_service = ser.num_service)
-> Seq Scan on employes emp (cost=0.00..1.14 rows=14 width=35)
-> Hash (cost=1.05..1.05 rows=1 width=21)
-> Seq Scan on services ser (cost=0.00..1.05 rows=1 width=21)
Filter: ((localisation)::text = 'Nantes'::text)
pg_class
relpages
et reltuples
NULL
)pg_statistic
pg_stats
pg_class
relpages
et reltuples
CREATE STATISTICS
default_statistics_target = 100
Configurable par colonne
ALTER TABLE nom ALTER [ COLUMN ] colonne SET STATISTICS valeur;
300 * default_statistics_target
EXISTS
, IN
et certaines jointures externes :
PostgreSQL dispose de la parallélisation depuis la version 9.6. Cela ne concernait que les jointures de type Nested Loop et Hash Join. Quant au Merge Join, il a fallu attendre la version 10 pour que la parallélisation soit supportée.
SELECT * FROM t1 WHERE c1=1 AND c2=1
c1=1
est vrai pour 20% des lignesc2=1
est vrai pour 10% des lignesCREATE STATISTICS
pour des statistiques multi-colonnesSELECT *
FROM commandes
WHERE extract('year' from date_commande) = 2014;
extract
SELECT * FROM t1 WHERE c2 LIKE 'x%';
Delete (actual time=111.251..111.251 rows=0 loops=1)
-> Hash Join (actual time=1.094..21.402 rows=9347 loops=1)
-> Seq Scan on lot_a30_descr_lot
(actual time=0.007..11.248 rows=34934 loops=1)
-> Hash (actual time=0.501..0.501 rows=561 loops=1)
-> Bitmap Heap Scan on lot_a10_pdl
(actual time=0.121..0.326 rows=561 loops=1)
Recheck Cond: (id_fantoir_commune = 320013)
-> Bitmap Index Scan on...
(actual time=0.101..0.101 rows=561 loops=1)
Index Cond: (id_fantoir_commune = 320013)
Trigger for constraint fk_lotlocal_lota30descrlot:
time=1010.358 calls=9347
Trigger for constraint fk_nonbatia21descrsuf_lota30descrlot:
time=2311695.025 calls=9347
Total runtime: 2312835.032 ms
SELECT DISTINCT t1.* FROM t1 JOIN t2 ON (t1.id=t2.t1_id);
DISTINCT
est souvent utilisé pour dédoublonner les lignes de t1
GROUP BY
est plus rapideGROUP BY
Prédicat incluant une transformation :
WHERE col1 + 2 > 5
Opérateur non-supporté par l'index :
WHERE col1 <> 'valeur';
effective_cache_size
NOT IN
avec une sous-requête
NOT EXISTS
UNION
au lieu de UNION ALL
SELECT
LATERAL
N'hésitez pas, c'est le moment !
SELECT c1 FROM t1 WHERE c1<10
SELECT pg_class.relname, pg_class.reltuples
FROM pg_class
LEFT JOIN pg_namespace
ON pg_class.relnamespace=pg_namespace.oid;
ps
est l’outil de base pour les processusps aux
ps -ef | grep postgres
%CPU
et %MEM
CPU
atop
, htop
, topas
%IO
iowait
ps
et grep
en une commandesysstat
IDLE IN TRANSACTION
pg_cancel_backend (pid int)
pg_terminate_backend(pid int)
log_lock_waits
à on
log_connections
et log_disconnections
pg_relation_size(relation name)
pg_total_relation_size(relation name)
pg_table_size(table name)
pg_indexes_size(table name)
pg_size_pretty(size bigint)
check_pgactivity
pgstattuple
log_min_duration_statements
= 0
permet de tracer toutes les requêteslog_temp_files = <taille minimale>
0
trace tous les fichiers temporairespg_stat_statements
Métriques intéressantes :
total_time
min_time
/max_time
(9.5+)stddev_time
(9.5+)mean_time
(9.5+)rows
shared_blks_hit/read/dirtied/written
local_blks_hit/read/dirtied/written
temp_blks_read/written
blk_read_time/blk_write_time
pg_stat_activity
wait_event
et wait_event_type
pg_locks
granted
pg_blocking_pids
VACUUM
log_checkpoints = on
checkpoint
pg_activity
pgbadger
pgCluu
, OPM
pg_stat_statements
, PoWA
top
pour PostgreSQLopm
/demo
pg_stat_statements