Development #9553
requêtes SQL pour les graphes des stats globales
0%
Description
duration: 4450.041 ms statement: SELECT DATE_TRUNC('month', receipt_time) AS month, COUNT(*) FROM wcs_all_forms WHERE receipt_time IS NOT NULL GROUP BY month ORDER BY month duration: 4651.421 ms statement: SELECT DATE_TRUNC('year', receipt_time) AS year, COUNT(*) FROM wcs_all_forms WHERE receipt_time IS NOT NULL GROUP BY year ORDER BY year duration: 4481.625 ms statement: SELECT DATE_PART('dow', receipt_time) AS weekday, COUNT(*) FROM wcs_all_forms WHERE receipt_time IS NOT NULL GROUP BY weekday ORDER BY weekday duration: 4569.341 ms statement: SELECT DATE_PART('hour', receipt_time) AS hour, COUNT(*) FROM wcs_all_forms WHERE receipt_time IS NOT NULL GROUP BY hour ORDER BY hour
De ce que j'ai pu lire, la bonne manière pour optimiser ça c'est d'utiliser des "Materialized Views" (http://www.postgresql.org/docs/9.4/static/rules-materializedviews.html), sur lesquelles il sera possible de poser des index sur les différents morceaux de la date.
Avec sur le côté, de manière régulière un REFRESH MATERIALIZED VIEW CONCURRENTLY (http://www.postgresql.org/docs/9.4/static/sql-refreshmaterializedview.html).
Ça devrait sans doute exister en parallèle de l'actuel wcs_all_forms car on a besoin de données à jour pour la vue globale.
(ça doit de toute façon attendre qu'on puisse utiliser postgresql 9.4)
Fichiers
Demandes liées
Révisions associées
sql: don't use 'IF NOT EXISTS' when creating materialized view (#9553)
(it requires postgresql 9.5)
Historique
Mis à jour par Benjamin Dauvergne il y a plus de 8 ans
À noter aussi qu'avec 9.5 on pourra en plus calculer toute sorte d'aggrégats en une seule requête1.
1 http://www.depesz.com/2015/05/24/waiting-for-9-5-support-grouping-sets-cube-and-rollup/
Mis à jour par Frédéric Péters il y a plus de 8 ans
J'ai tenté différentes choses alternatives, quand même :
- créer un index sur le receipt_time
- créer un index sur le date_trunc('xxx', receipt_time) sur chacune des tables
- créer une colonne receipt_month qui soit le date_trunc(...) sur chacune des vues
Mais non, postgresql ne trouve pas comment utiliser ça pour optimiser sa requête; toujours il assemble d'abord toutes les lignes de toutes les tables.
Mis à jour par Benjamin Dauvergne il y a plus de 8 ans
Même en créant l'index sur la vue matérialisée ?
Mis à jour par Frédéric Péters il y a plus de 8 ans
Il n'y a pas encore du vue matérialisée, nos serveurs sont encore en 9.1.
Mis à jour par Frédéric Péters il y a environ 8 ans
- Dupliqué par Bug #10174: longues requetes SQL → 504 Gateway Time-out ajouté
Mis à jour par Thomas Noël il y a environ 8 ans
à noter que postgresql 9.4 est dans wheezy-backports
Mis à jour par Frédéric Péters il y a environ 8 ans
- Fichier 0001-sql-use-materialized-views-if-available-for-statisti.patch 0001-sql-use-materialized-views-if-available-for-statisti.patch ajouté
- Statut changé de Nouveau à En cours
- Patch proposed changé de Non à Oui
Patch qui regarde au runtime la version de postgresql. Testé en local sur les données de Vincennes, il n'y a pas besoin de fixer d'index pour que ça soit tout de suite très performant.
Mis à jour par Frédéric Péters il y a environ 8 ans
- Statut changé de En cours à Résolu (à déployer)
commit 98ae3b0581dea73a171a7f81e671b45a7e963f35 Author: Frédéric Péters <fpeters@entrouvert.com> Date: Thu Mar 3 18:33:07 2016 +0100 sql: use materialized views if available, for statistics (#9553)
Mis à jour par Frédéric Péters il y a environ 8 ans
Mis à jour par Thomas Noël il y a environ 8 ans
J'aurais bien vu un "if pg_version >= 95000: ajouter if not exists"
Mis à jour par Frédéric Péters il y a environ 8 ans
commit 2e130848b7c2efe21d38085d2592566b4ceabf87 Author: Frédéric Péters <fpeters@entrouvert.com> Date: Fri Mar 4 15:48:04 2016 +0100 sql: don't use 'IF NOT EXISTS' when creating materialized view (#9553) (it requires postgresql 9.5)
sql: use materialized views if available, for statistics (#9553)