11 Replies Latest reply: Jul 4, 2014 3:12 AM by Ulrich COUEGNOUX RSS

    Optimisation chargement Where

    Ulrich COUEGNOUX

      Bonjour tout le monde,

       

      Dans mon script, je souhaite filtrer mes données, et je m'interroge sur l'optimisation : est il préférable de mettre une clause WHERE directement dans la requête SQL, ou plutôt WHERE EXISTS (xxx) dans le LOAD ?

       

      J'obtiendrai le même résultat, mais je ne veux pas d'un temps de chargement trop long.

       

      Merci,

      Ulrich

        • Re: Optimisation chargement Where
          Bruno Souza

          Bonjour, Ulrich.

           

          Il est préférable de mettre une clause WHERE dans la raquête SQL parce que il y a moins de données à traiter.

           

          Bonne journée.

            • Re: Optimisation chargement Where
              Ulrich COUEGNOUX

              Bonjour Bruno

               

              Merci pour ta réponse.

               

              Donc, pour résumer, mettre les filtres directement dans la clause WHERE de la requête remontera moins de données, alors qu'un WHERE EXISTS fera lire toute la table, le filtre s'appliquera après.

               

              A+

                • Re: Optimisation chargement Where
                  Philippe Vivier

                  il n'y a pas qu'une seule véritée, dans le cas ou tu charges beaucoup de données dans plusieurs QVD, il est parfois préférable de faire le where exists directement sur la table chargée (j'ai pas les stats mais en terme de chargement ca nous a un peu changé les rechargements)

                    • Re: Optimisation chargement Where
                      Ulrich COUEGNOUX

                      Bonjour Philippe

                       

                      Je suis d'accord, c'est tout l'intérêt de Qlikview d'ailleurs : il n'y a pas qu'un chemin pour arriver à destination

                       

                      Je n'utilise pas de QVD, accès direct à un entrepôt de données sous SQL Serveur.

                      L'idée ici est de diminuer le volume de données, le temps de chargement n'est pas (encore) une contrainte.

                      La clause Where dans la requête me permet de ne charger que les données voulue.

                      La clause Where dans le Load filtre les données voulues, sur l'ensemble des données chargées : cet ensemble, ces données "non désirées", sont elles un frein à l'utilisation ou sont elles simplement supprimées de la mémoire ?

                       

                      A+

                        • Re: Optimisation chargement Where
                          Philippe Vivier

                          je pense qu'en terme de perf tu iras plus vite en chargeant tout puis en appliquant un were exists,

                           

                          -> T1: load base

                          -> T2: load resident T1 where exist

                          -> drop T1

                           

                          dans ce cas d'usage  tu n'auras plus les données en mémoire, et tu aura une lecture plus rapide de ta base

                            • Re: Optimisation chargement Where
                              Ulrich COUEGNOUX

                              Ah mais oui !!!

                              Quel idiot je suis (non, inutile de répondre à cette remarque )

                              Merci Philippe, je vais appliquer cette solution

                              • Re: Optimisation chargement Where
                                Ulrich COUEGNOUX

                                Bon, je dois être une nouille cet après midi : je n'arrive pas à utiliser cette syntaxe.

                                 

                                Je charge ma table, avec le filtre dans la clause where sql.

                                T1 : SQL Select * from Sites where Client="C1234";

                                T2 : LOAD * RESIDENT T1 where exists(IDENT_CLI) ;

                                 

                                Lors du chargement, ma table T1 existe, mais pas la T2.

                                J'avais mis le DROP table T1, du coup je n'avais plus de table du tout.

                                 

                                Pourquoi ma T2 n'existe pas ?

                                  • Re: Optimisation chargement Where

                                    Bonjour, tu dois faire:

                                     

                                    T1 : SQL Select * from Sites where Client="C1234";

                                    noconcatenate T2 : LOAD * RESIDENT T1 where exists(IDENT_CLI) ;

                                     

                                    DROP table T1;


                                    En fait quand tu recharges une table avec exactement les mêmes nombre de champ qui ont le même nom, QlikView les concatènes par défaut. Tu dois donc préciser "noconcatenate" pour dire à QlikView de ne pas les concaténer et au contraire de créer une nouvelle table.


                                    Augustin

                                      • Re: Optimisation chargement Where
                                        Ulrich COUEGNOUX

                                        Effectivement, je n'ai plus ma table 1, et j'ai la table 2

                                        Sauf que la clause Where Exists n'est pas prise en compte, j'ai tous les enregistrements...

                                         

                                        C'est à devenir fou : je comprends le fonctionnement, mais le script ne veut pas.

                                          • Re: Optimisation chargement Where

                                            Qu'est ce que tu veux faire avec ton Exists?

                                             

                                            Si c'est pour éviter d'avoir 2 fois la même valeur sur une colonne ça serait plutôt "Where not exists(IDENT_CLI)"

                                              • Re: Optimisation chargement Where
                                                Ulrich COUEGNOUX

                                                Bonjour

                                                 

                                                Je souhaite filtre mes données, tout en limitant l'utilisation de la mémoire.

                                                J'ai une table client, dont l'identifiant est IDENT_CLI, pour laquelle je ne charge qu'une partie des données, avec un filtre dans la clause where de la requête : je sais quels clients je veux, j'ai un filtre simple.

                                                Je charge ensuite la table des sites qui sont liés à ces clients : je ne peux pas utiliser le même filtre, et je veux avoir 2 tables (oui, je sais que je pourrait tout charger dans une seule table, mais... non, je préfère séparer).

                                                 

                                                Dans un premier temps, j'utilisais un Where Exists(IDENT_CLI) dans le load, vu que ma table client est déjà chargée, je ne prend ainsi que les sites de ces clients, mais ça signifie que je lis et charge toute la table des sites, pour ensuite la filtrer.

                                                 

                                                La piste de Philippe me plait : je charge toute la table Site (T1) sans filtre, puis je crée une table T2, issu de T1, en filtrant, et enfin je supprime T1 : j'aurai tous mes sites, pour mes clients chargés, tout en limitant l'utilisation de la mémoire.

                                                Et là, c'est le drame...

                                                 

                                                A+