URL: https://linuxfr.org/forums/programmationautre/posts/optimisation-dune-requ%C3%AAte-sql-ou-choix-dun-bon-sgbd Title: Optimisation d'une requête SQL ou choix d'un bon SGBD Authors: Ontologia Date: 2004年09月23日T14:37:25+02:00 Tags: Score: 0 Bonjour, à fin de statistiques je cherche à exécuter des requêtes pour statistiques de ventes. Pour cela, plutôt que d'écrire un logiciel traitant les données à partir de requêtes simples, je me suis dit, après lecture du site sqlpro (merci à son auteur) qu'il était plus intelligent et plus rapide de se creuser la tête afin d'écrire LA requête qui me donnera les résultats escomptés. Ca m'a d'ailleurs permis d'apprendre à faire du SQL évolué qui se limitait jusque là à "select from where". J'ai donc conçu cette requête. J'ai deux possibilités : soit faire générer le résultat par access sur un fichier fixe, et là je doute (voir la requête) qu'Access soit suffisament solide pour cela, soit l'envoyer au serveur Pervasive SQL2000i qui gère ici une 15aine d'utilisateurs et une petite base de 2 Go sur un PIII 1 Ghz qui ne sert qu'a ça, donc pas franchement débordé( je le vois rarement monter à plus de 30% de cpu). Lorsque j'utilise pervasive j'ai choisi de requêter sur une base copiée chaque nuit, ça évite les conflits. Problème : cette requête est affreusement lente (au bout de 2h, je n'ai toujours rien), j'aimerai avoir un espoir d'avoir un résultat quitte à ce qu'elle mette une heure à calculer, ce n'est pas grave. la requête est la suivante (explication plus loin): SELECT "COMMANDE"."date_creat","FACTURE_ELEMENT"."REF_ELEMENT", FACTURE_ELEMENT."desi_element","FACTURE_ELEMENT"."quantite", "FACTURE_ELEMENT"."prix_u"*"FACTURE_ELEMENT"."quantite" AS "Prix Total", "CLIENT"."Raison_sociale", "BON_DE_LIVRAISON"."date_emission"-"COMMANDE"."date_creat" AS "Délai" FROM FACTURE_ELEMENT , BON_DE_LIVRAISON ,COMMANDE , CLIENT WHERE FACTURE_ELEMENT.REF_ELEMENT In (SELECT FACTURE_ELEMENT.REF_ELEMENT from FACTURE_ELEMENT where FACTURE_ELEMENT.FAC > 10000000 and FACTURE_ELEMENT.bl not in ( select FACTURE_ELEMENT.bl from FACTURE_ELEMENT where FACTURE_ELEMENT.fac < 3000000) ) and FACTURE_ELEMENT.affaire = BON_DE_LIVRAISON.affaire and FACTURE_ELEMENT.bl = BON_DE_LIVRAISON.num and FACTURE_ELEMENT.affaire = COMMANDE.Affaire and COMMANDE.code_cl = CLIENT.Code_client And (FACTURE_ELEMENT.REF_ELEMENT) Not Like 'Z%' And (FACTURE_ELEMENT.REF_ELEMENT) Not Like '5E%' And (FACTURE_ELEMENT.REF_ELEMENT) Not Like '5P%' And (FACTURE_ELEMENT.REF_ELEMENT) Not Like '5W%' And (FACTURE_ELEMENT.REF_ELEMENT) Not Like '5X%' AND ("FACTURE_ELEMENT"."prix_u")>0.4 ORDER BY "FACTURE_ELEMENT"."REF_ELEMENT" Nota : Facture_element "pèse" 51000 lignes, commande 22000, client 2300, Bon_de_livraison 25000 Hors les conditions habituelles de discrimination sur critère simple, sur lien avec d'autre bases, la seule difficulté est la suivante : WHERE FACTURE_ELEMENT.REF_ELEMENT In (SELECT FACTURE_ELEMENT.REF_ELEMENT from FACTURE_ELEMENT where FACTURE_ELEMENT.FAC > 10000000 and FACTURE_ELEMENT.bl not in ( select FACTURE_ELEMENT.bl from FACTURE_ELEMENT where FACTURE_ELEMENT.fac < 3000000) ) en gros je lui demande de me sélectionner uniquement les références - postérieur au 1/1/2000 ( le > 10000000) - et dont le BL n'est pas un BL d'un avoir (pour la petite histoire, je dois éliminer les références qui ont été facturés mais renvoyées par le client et pour lesquels on a crée un avoir (numéro de facture < 3000000, le seul lien étant le bon de livraison) Y a t il un moyen d'améliorer cette requête ? Dois-je utiliser un autre SGBD, plus solide (sachant qu'il ne sera utilisé que par moi, sur une base de 2 Go, et quasiment qu'en lecture, et que mon souçi de performances se mesure en dizaines de minutes) ? merci d'avance, Smile !

AltStyle によって変換されたページ (->オリジナル) /