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
PostgreSQL
| 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 = 0vm.nr_overcommit_hugepages=xhuge_pages=on|off|trymin_wal_size et max_wal_size à partir de la version 9.5Python, par Greg Smith
Ruby par Alexey VasilievSELECT only, UPDATE only ou TPC-Bseq_page_cost, random_page_cost, effective_io_concurrencyPerl 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 !
PostgreSQL
WHERECette 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 reltuplesNULL)pg_statistic
pg_statspg_class
relpages et reltuplesCREATE STATISTICSdefault_statistics_target = 100Configurable 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=1c1=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 msSELECT 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 BYPrédicat incluant une transformation :
WHERE col1 + 2 > 5Opérateur non-supporté par l'index :
WHERE col1 <> 'valeur';effective_cache_sizeNOT IN avec une sous-requête
NOT EXISTSUNION au lieu de UNION ALL
SELECT
LATERALN'hésitez pas, c'est le moment !
SELECT c1 FROM t1 WHERE c1<10SELECT pg_class.relname, pg_class.reltuples
FROM pg_class
LEFT JOIN pg_namespace
       ON pg_class.relnamespace=pg_namespace.oid;PostgreSQL
ps est l’outil de base pour les processusps auxps -ef | grep postgres%CPU et %MEMCPUatop, htop, topas%IOiowaitps et grep en une commandesysstatIDLE IN TRANSACTIONpg_cancel_backend (pid int)pg_terminate_backend(pid int)log_lock_waits à onlog_connections et log_disconnectionspg_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_pgactivitypgstattuplelog_min_duration_statements = 0 permet de tracer toutes les requêteslog_temp_files = <taille minimale>
0 trace tous les fichiers temporairespg_stat_statementsMétriques intéressantes :
total_timemin_time/max_time (9.5+)stddev_time (9.5+)mean_time (9.5+)rowsshared_blks_hit/read/dirtied/writtenlocal_blks_hit/read/dirtied/writtentemp_blks_read/writtenblk_read_time/blk_write_timepg_stat_activity
wait_event et wait_event_typepg_locks
grantedpg_blocking_pidsVACUUMlog_checkpoints = oncheckpointpg_activitypgbadgerpgCluu, OPMpg_stat_statements, PoWAtop pour PostgreSQLopm/demopg_stat_statements