[PostgresSQL] ! ! requette sql trop complexe ? - requette trop longue a traiter !

je travaille sur une base PostgresSQL

j’ai voulu créé une vue simple. pas de problème.

apres j’ai voulu créé une autre vue avec un peut plusde condition, mais la , impossible de faire de SELECT sur la vue, le serveur est dans les choux des que le fait unerequette sur cette vue.

apres j’ai fait la requette de la vue directement, même problème.

dès l’execution de la requette, le service postgresql est a 100% de cpu et impossible de comuniqué avec la base !!

voici la requette :


SELECT
 id,id_type_doc,num_doc,titre,commentaire,id_auteur,etat,num_edit,date,num_rev,id_user
 FROM document,vie_doc
 WHERE (

  (id_doc=document.id)
  AND
  (
num_rev=(SELECT max(num_rev) FROM vie_doc WHERE id_doc= document.id LIMIT 1)
 )
  AND
  (
num_edit=(SELECT max(num_edit) FROM vie_doc WHERE id_doc=document.id LIMIT 1)
)
  )
 ORDER by vie_doc.date DESC

la base tourne sous debian. mais ca n’importe pas beaucoup je pense.

la requette suivant sans ce qui est en rouge focntionne par contre


SELECT
 id,id_type_doc,num_doc,titre,commentaire,id_auteur,etat,num_edit,date,num_rev,id_user
 FROM document,vie_doc
 WHERE (
  (id_doc=document.id)
  AND
  (num_rev=(SELECT max(num_rev) FROM vie_doc WHERE id_doc= document.id LIMIT 1) )
  AND
  (num_edit=(SELECT max(num_edit) FROM vie_doc WHERE id_doc=document.id LIMIT 1))
  )
[COLOR=red]ORDER by vie_doc.date DESC[/COLOR]

up

Change ton topic et met que mySQL ownz pgSQL, benj viendra te répondre, j’en suis sûr :smiley:

Peux tu préciser le schéma de tes tables? Histoire qu’on puisse au besoin simplifier la requête?

Et as tu testé un ANALYZE (et surtout l’équivalent sous pgSQL) pour voir ce qu’il va te faire avec ta requête?

:o j’ai mordu à l’ameçon, merde [:kurdent]

maintenant je penche pour une requete mal écrite, tu passes trois fois dans la meme table, tu fais des trucs incohérents du genre max et limit 1 dans la meme requete alors que max par définition ne retourne qu’une ligne.

ne pourrais tu pas virer

AND
(num_rev=(SELECT max(num_rev) FROM vie_doc WHERE id_doc= document.id LIMIT 1) )
AND
(num_edit=(SELECT max(num_edit) FROM vie_doc WHERE id_doc=document.id LIMIT 1))
)

et remplacer tout ca par deux order by et un limit 1 ?

et puis au lieu de faire un where id_doc=document.id fais un inner join :wink:

regarde un peu dans cette direction et dis nous si cela fonctionne mieux. si ce n’est pas le cas, il faudrait que l’on regarde du coté de la config de pg parce que par défaut il est configuré pour une utilisqtion lambda et les requetes imbriquées sont hyper gourmandes …

donne nous des infos :wink: