Project

General

Profile

Development #68413

SQL: exploiter la connaissance des options possibles dans FormPage.get_item_filter_options

Added by Pierre Ducroquet 5 months ago. Updated 5 months ago.

Status:
Nouveau
Priority:
Normal
Assignee:
-
Target version:
-
Start date:
25 August 2022
Due date:
% Done:

0%

Estimated time:
Patch proposed:
No
Planning:
No

Description

Aujourd'hui, la fonction FormPage.get_item_filter_options() exécute la requête SQL suivante pour lister les valeurs utilisées dans la base, y compris pour les champs où la liste des valeurs possibles est connue :

SELECT DISTINCT ON (fbofd87dd65) fbofd87dd65, fbofd87dd65_display FROM formdata_101 WHERE anonymised IS NULL AND status != 'draft' AND fbofd87dd65 IS NOT NULL ORDER BY fbofd87dd65;

Or, quand la liste des valeurs possibles, une autre écriture est envisageable.
SELECT x, x FROM (VALUES('X1'), ('X2')) AS v(x) WHERE EXISTS(SELECT 1 FROM formdata_101 WHERE fbofd87dd65 = v.x AND anonymised IS NULL AND status != 'draft');

Sur au moins un client, la première requête prend plus de 400ms alors que la deuxième ne va prendre qu'une milliseconde.
Le seul cas où cette écriture va dégénérer est le cas où l'optimiseur déciderait de scanner une fois la table par valeur listée, et si ces valeurs sont toutes absentes. Mais même dans le cas d'une longue liste d'options, l'optimiseur choisirait alors de n'effectuer qu'un seul scan de la table et de faire un hash, retombant alors sur les performances du select distinct actuel.

Autre solution, plus simple éventuellement mais impactant l'interface : aujourd'hui, les filtres ne listent pour ces champs que les options réellement utilisées, et donc extraites du SQL. Pourrait-on dans certains cas lister toutes les options et donc n'effectuer aucune requête SQL ?

History

#1

Updated by Frédéric Péters 5 months ago

lister toutes les options et donc n'effectuer aucune requête SQL

Non. (par exemple les options peuvent venir de réservations d'événements et ces événements ne sont plus listés une fois la date limite de réservation atteinte).

#2

Updated by Pierre Ducroquet 5 months ago

Autre possibilité, exploiter les statistiques de PostgreSQL.
Par exemple :

# select most_common_vals from pg_stats where attname = 'fbofd87dd65' and tablename = 'formdata_101';
 most_common_vals 
------------------
 {X1,X2}
(1 ligne)

Si toutes les valeurs possibles sont listées ici, alors il n'est pas nécessaire d'aller consulter la table pour vérifier leur présence.

Also available in: Atom PDF