Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
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
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
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.
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+
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)
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+
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
Ah mais oui !!!
Quel idiot je suis (non, inutile de répondre à cette remarque )
Merci Philippe, je vais appliquer cette solution
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 ?
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
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.