Dans mon tableau plin_korisnik, j'ai le champ actif qui est défini comme type booléen.Postgres SQL - problème de performance avec champ booléen
Je suis en train d'exécuter cette requête pour extraire des données de cette table et deux autres tables:
SELECT
pk.omm AS omm,
pk.br_plin AS br_plin,
pk.naziv AS naziv,
pk.ulica||' '||pk.kbr AS adresa,
pk.pu||' - '||pk.naziv_pu AS mjesto,
po.datum AS datum,
CASE WHEN po.stanje >= 999999 THEN NULL ELSE po.stanje END AS stanje,
po.napomena AS napomena,
po.plin_postar AS laus,
pp.ime||' '||pp.prezime AS postar
FROM plin_korisnik pk
INNER JOIN
plin_ocitanje po ON pk.omm = po.omm
INNER JOIN plin_postar pp ON pp.laus = po.plin_postar
WHERE po.datum>='2017-01-26'
AND po.datum<='2017-01-26'
AND pk.tip='p'
AND pk.active = TRUE
ORDER BY po.datum, pk.naziv
mais requête prend beaucoup de temps à (comme toujours, j'interrompu après une demi-heure), mais lorsque je supprime le test pk.active = TRUE de la clause WHERE, la requête s'exécute avec la vitesse attendue. J'ai essayé de convertir le type booléen en entier, mais le problème persiste.
Je vous serais reconnaissant si quelqu'un pourrait expliquer comment utiliser un champ booléen dans cette requête et similaires. actif Le champ n'est pas indexé, peut-être que cela devrait l'être, s'il vous plaît, aidez-nous.
EDIT: Après quelques heures de réflexion, je suis sorti avec cette solution utilisant la clause WITH:
WITH pk AS (
SELECT * FROM plin_korisnik WHERE active AND tip='p'
)
SELECT
pk.omm AS omm,
pk.br_plin AS br_plin,
pk.naziv AS naziv,
pk.ulica||' '||pk.kbr AS adresa,
pk.pu||' - '||pk.naziv_pu AS mjesto,
po.datum AS datum,
CASE WHEN po.stanje >= 999999 THEN NULL ELSE po.stanje END AS stanje,
po.napomena AS napomena,
po.plin_postar AS laus,
pp.ime||' '||pp.prezime AS postar
FROM pk
INNER JOIN
plin_ocitanje po ON pk.omm = po.omm
INNER JOIN plin_postar pp ON pp.laus = po.plin_postar
WHERE po.datum>='2017-01-26'
AND po.datum<='2017-01-26'
ORDER BY po.datum, pk.naziv;
Pourquoi ne pas ajouter un index 'active'? –
Please ** [EDIT] ** votre question et ajoutez le plan d'exécution généré en utilisant ** 'explain (analyser, verbose)' ** pour la requête rapide et un simple 'explain' pour la requête que vous avez annulée. [** Texte formaté **] (http://stackoverflow.com/help/formatting) s'il vous plaît, [aucune capture d'écran] (http://meta.stackoverflow.com/questions/285551/why-may-i-not -upload-images-de-code-sur-alors-quand-pose-une-question/285557 # 285557) –
Que vous @TimBiegeleisen. J'ai créé l'index sur la colonne "active", et la requête se termine maintenant après 13sec, ce qui est acceptable. La plupart des références sur Internet disent qu'il ne sert à rien de faire index sur une colonne booléenne. La table n'est pas si grande 250.000+ rangées dont 12.000+ lignes sont "actives". –