Bonjour
Encore une fois tu m'impressionnes par tes explications... ;-)
Petite question :
Et si on spécifiait la jointure directement dans la clause WHERE,
qu'est ce que ça donnerait en terme de performance ???
Genre :
SELECT MARA.MATNR AS Article,
MAKTX AS Designation,
MTART AS Type,
MATKL AS GM,
BISMT AS Ancien_No,
MFRPN AS Reference,
MFRNR AS Fab_Frs,
BWKEY AS Division,
BKLAS AS CV
FROM MARA, MAKT, MBEW
WHERE MARA.MATNR = MAKT.MATNR AND
MARA.MATNR = MBEW.MATNR AND
(MAKTX Like [Critere] OR MFRPN Like [Critere]);
@+
Jessy Sempere - Access MVP
------------------------------------
Site @ccess : http://access.jessy.free.fr/
Pour l'efficacité de tous :
http://users.skynet.be/mpfa/
------------------------------------
"Michel Walsh" a écrit dans le
message news:
eh$$Salut,
La raison du problème semble toute simple. La jointure est effectuée
AVANT
le where. Donc, il y a comparaisons entre plusieurs champs,
"l'explosion" du
join (une possibilité de 400 000 au carré, j'apelle cela une
explosion)
est emmagasinée temporairement, et de cette explosion, établie, on ne
conserve, par sélection de critère WHERE, que quelques individus.
Ressources
mal utilisées!
Il serait plus astucieux, dans ce cas, de faire le critère AVANT la
jointure:
SELECT * FROM makt WHERE maktx LIKE [Critere]
dans une requête, S1, pareil pour mfrpn LIKE [Critere], dans une
requête
S2 (ou la même requête S1, si c'est de la même table). Cette requête
implique maitenant beaucoup MOINS que 400 000 enregistrement,
probablement
100 000, non (mon estimé est basé sur des hypothèses un peu farfelues,
mais
également de par les chiffres que tu avances: 100k = 400k * ( 170 /
(18*0.5) ) ^0.5) ?
Utiliser S1 ( et S2 si applicable) au lieu des tables originales, avec
une
syntaxe voisine de la première requête, sans sa condition WHERE
maintenant
inutile, devrait alors redonner un temps d'exécution d'une dizaine de
secondes (deux fois moins long que la requête UNION), voire mieux
(surtout
si les requêtes S1 et S2 retournent en deça de 100k-enregistrements).
Si tu utilises MS SQL Server, tu peux faire remonter le critère du
genre:
champ=constante
DANS la clause ON appropriée du join, cela aura le même effet. Avec Jet,
on
ne peut pas, car Jet repasse derrière nous et redescend ce critère dans
le
WHERE, à moins de procéder par requêtes cascadées, comme proposé, ou par
tables virtuelles (ce qui est la même chose, dans le fond).
Espérant être utile,
Vanderghast, Access MVP
"Arnaud [lwa]" wrote in message
news:2bc2301c468b9$873f7d60$
oups désolé message parti trop vite avec l'interface
WEB....et avant qu'elle apparaisse ....
je continue donc :
alors que la requête UNION ci-dessous
retourne le même résultat en 18 secondes au lieu de 170.
SELECT MARA.MATNR AS Article,
MAKTX AS Designation,
MTART AS Type,
MATKL AS GM,
BISMT AS Ancien_No,
MFRPN AS Reference,
MFRNR AS Fab_Frs,
BWKEY AS Division,
BKLAS AS CV
FROM (MARA INNER JOIN MAKT
ON MARA.MATNR = MAKT.MATNR)
INNER JOIN MBEW
ON MARA.MATNR = MBEW.MATNR
WHERE MAKTX Like [Critere]
UNION SELECT MARA.MATNR AS Article,
MAKTX AS Designation,
MTART AS Type,
MATKL AS GM,
BISMT AS Ancien_No,
MFRPN AS Reference,
MFRNR AS Fab_Frs,
BWKEY AS Division,
BKLAS AS CV
FROM (MARA INNER JOIN MAKT
ON MARA.MATNR = MAKT.MATNR)
INNER JOIN MBEW
ON MARA.MATNR = MBEW.MATNR
WHERE MFRPN Like [Critere];
ps : DISTINCT inutile dans une requête UNION,
mais pas de différence notoire entre les temps dexécution
d'un SELECT et par rapport à un SELECT DISTINCT.
--
Bonne journée
Arnaud
http://memoaccess.free.fr-----Message d'origine-----
Bonjour,
Une constatation simple sur 2 requêtes impliquant pour
l'exemple 1 table de 700000 enregistrements et 2 tables
de400000 enregeistrements :
Résultat obtenu au bout de 170 Secondes
SELECT MARA.MATNR AS Article,
MAKTX AS Designation,
MTART AS Type,
MATKL AS GM,
BISMT AS Ancien_No,
MFRPN AS Reference,
MFRNR AS Fab_Frs,
BWKEY AS Division,
BKLAS AS CV
FROM (MARA INNER JOIN MAKT
ON MARA.MATNR = MAKT.MATNR)
INNER JOIN MBEW
ON MARA.MATNR > > >MBEW.MATNR
WHERE MAKTX Like [Critere]
or MFRPN Like [Critere];
.
Bonjour
Encore une fois tu m'impressionnes par tes explications... ;-)
Petite question :
Et si on spécifiait la jointure directement dans la clause WHERE,
qu'est ce que ça donnerait en terme de performance ???
Genre :
SELECT MARA.MATNR AS Article,
MAKTX AS Designation,
MTART AS Type,
MATKL AS GM,
BISMT AS Ancien_No,
MFRPN AS Reference,
MFRNR AS Fab_Frs,
BWKEY AS Division,
BKLAS AS CV
FROM MARA, MAKT, MBEW
WHERE MARA.MATNR = MAKT.MATNR AND
MARA.MATNR = MBEW.MATNR AND
(MAKTX Like [Critere] OR MFRPN Like [Critere]);
@+
Jessy Sempere - Access MVP
news@access.fr.vu
------------------------------------
Site @ccess : http://access.jessy.free.fr/
Pour l'efficacité de tous :
http://users.skynet.be/mpfa/
------------------------------------
"Michel Walsh" <vanderghast@VirusAreFunnierThanSpam> a écrit dans le
message news:
eh$$BXNaEHA.3804@TK2MSFTNGP10.phx.gbl...
Salut,
La raison du problème semble toute simple. La jointure est effectuée
AVANT
le where. Donc, il y a comparaisons entre plusieurs champs,
"l'explosion" du
join (une possibilité de 400 000 au carré, j'apelle cela une
explosion)
est emmagasinée temporairement, et de cette explosion, établie, on ne
conserve, par sélection de critère WHERE, que quelques individus.
Ressources
mal utilisées!
Il serait plus astucieux, dans ce cas, de faire le critère AVANT la
jointure:
SELECT * FROM makt WHERE maktx LIKE [Critere]
dans une requête, S1, pareil pour mfrpn LIKE [Critere], dans une
requête
S2 (ou la même requête S1, si c'est de la même table). Cette requête
implique maitenant beaucoup MOINS que 400 000 enregistrement,
probablement
100 000, non (mon estimé est basé sur des hypothèses un peu farfelues,
mais
également de par les chiffres que tu avances: 100k = 400k * ( 170 /
(18*0.5) ) ^0.5) ?
Utiliser S1 ( et S2 si applicable) au lieu des tables originales, avec
une
syntaxe voisine de la première requête, sans sa condition WHERE
maintenant
inutile, devrait alors redonner un temps d'exécution d'une dizaine de
secondes (deux fois moins long que la requête UNION), voire mieux
(surtout
si les requêtes S1 et S2 retournent en deça de 100k-enregistrements).
Si tu utilises MS SQL Server, tu peux faire remonter le critère du
genre:
champ=constante
DANS la clause ON appropriée du join, cela aura le même effet. Avec Jet,
on
ne peut pas, car Jet repasse derrière nous et redescend ce critère dans
le
WHERE, à moins de procéder par requêtes cascadées, comme proposé, ou par
tables virtuelles (ce qui est la même chose, dans le fond).
Espérant être utile,
Vanderghast, Access MVP
"Arnaud [lwa]" <anonymous@discussions.microsoft.com> wrote in message
news:2bc2301c468b9$873f7d60$a401280a@phx.gbl...
oups désolé message parti trop vite avec l'interface
WEB....et avant qu'elle apparaisse ....
je continue donc :
alors que la requête UNION ci-dessous
retourne le même résultat en 18 secondes au lieu de 170.
SELECT MARA.MATNR AS Article,
MAKTX AS Designation,
MTART AS Type,
MATKL AS GM,
BISMT AS Ancien_No,
MFRPN AS Reference,
MFRNR AS Fab_Frs,
BWKEY AS Division,
BKLAS AS CV
FROM (MARA INNER JOIN MAKT
ON MARA.MATNR = MAKT.MATNR)
INNER JOIN MBEW
ON MARA.MATNR = MBEW.MATNR
WHERE MAKTX Like [Critere]
UNION SELECT MARA.MATNR AS Article,
MAKTX AS Designation,
MTART AS Type,
MATKL AS GM,
BISMT AS Ancien_No,
MFRPN AS Reference,
MFRNR AS Fab_Frs,
BWKEY AS Division,
BKLAS AS CV
FROM (MARA INNER JOIN MAKT
ON MARA.MATNR = MAKT.MATNR)
INNER JOIN MBEW
ON MARA.MATNR = MBEW.MATNR
WHERE MFRPN Like [Critere];
ps : DISTINCT inutile dans une requête UNION,
mais pas de différence notoire entre les temps dexécution
d'un SELECT et par rapport à un SELECT DISTINCT.
--
Bonne journée
Arnaud
http://memoaccess.free.fr
-----Message d'origine-----
Bonjour,
Une constatation simple sur 2 requêtes impliquant pour
l'exemple 1 table de 700000 enregistrements et 2 tables
de
400000 enregeistrements :
Résultat obtenu au bout de 170 Secondes
SELECT MARA.MATNR AS Article,
MAKTX AS Designation,
MTART AS Type,
MATKL AS GM,
BISMT AS Ancien_No,
MFRPN AS Reference,
MFRNR AS Fab_Frs,
BWKEY AS Division,
BKLAS AS CV
FROM (MARA INNER JOIN MAKT
ON MARA.MATNR = MAKT.MATNR)
INNER JOIN MBEW
ON MARA.MATNR > > >MBEW.MATNR
WHERE MAKTX Like [Critere]
or MFRPN Like [Critere];
.
Bonjour
Encore une fois tu m'impressionnes par tes explications... ;-)
Petite question :
Et si on spécifiait la jointure directement dans la clause WHERE,
qu'est ce que ça donnerait en terme de performance ???
Genre :
SELECT MARA.MATNR AS Article,
MAKTX AS Designation,
MTART AS Type,
MATKL AS GM,
BISMT AS Ancien_No,
MFRPN AS Reference,
MFRNR AS Fab_Frs,
BWKEY AS Division,
BKLAS AS CV
FROM MARA, MAKT, MBEW
WHERE MARA.MATNR = MAKT.MATNR AND
MARA.MATNR = MBEW.MATNR AND
(MAKTX Like [Critere] OR MFRPN Like [Critere]);
@+
Jessy Sempere - Access MVP
------------------------------------
Site @ccess : http://access.jessy.free.fr/
Pour l'efficacité de tous :
http://users.skynet.be/mpfa/
------------------------------------
"Michel Walsh" a écrit dans le
message news:
eh$$Salut,
La raison du problème semble toute simple. La jointure est effectuée
AVANT
le where. Donc, il y a comparaisons entre plusieurs champs,
"l'explosion" du
join (une possibilité de 400 000 au carré, j'apelle cela une
explosion)
est emmagasinée temporairement, et de cette explosion, établie, on ne
conserve, par sélection de critère WHERE, que quelques individus.
Ressources
mal utilisées!
Il serait plus astucieux, dans ce cas, de faire le critère AVANT la
jointure:
SELECT * FROM makt WHERE maktx LIKE [Critere]
dans une requête, S1, pareil pour mfrpn LIKE [Critere], dans une
requête
S2 (ou la même requête S1, si c'est de la même table). Cette requête
implique maitenant beaucoup MOINS que 400 000 enregistrement,
probablement
100 000, non (mon estimé est basé sur des hypothèses un peu farfelues,
mais
également de par les chiffres que tu avances: 100k = 400k * ( 170 /
(18*0.5) ) ^0.5) ?
Utiliser S1 ( et S2 si applicable) au lieu des tables originales, avec
une
syntaxe voisine de la première requête, sans sa condition WHERE
maintenant
inutile, devrait alors redonner un temps d'exécution d'une dizaine de
secondes (deux fois moins long que la requête UNION), voire mieux
(surtout
si les requêtes S1 et S2 retournent en deça de 100k-enregistrements).
Si tu utilises MS SQL Server, tu peux faire remonter le critère du
genre:
champ=constante
DANS la clause ON appropriée du join, cela aura le même effet. Avec Jet,
on
ne peut pas, car Jet repasse derrière nous et redescend ce critère dans
le
WHERE, à moins de procéder par requêtes cascadées, comme proposé, ou par
tables virtuelles (ce qui est la même chose, dans le fond).
Espérant être utile,
Vanderghast, Access MVP
"Arnaud [lwa]" wrote in message
news:2bc2301c468b9$873f7d60$
oups désolé message parti trop vite avec l'interface
WEB....et avant qu'elle apparaisse ....
je continue donc :
alors que la requête UNION ci-dessous
retourne le même résultat en 18 secondes au lieu de 170.
SELECT MARA.MATNR AS Article,
MAKTX AS Designation,
MTART AS Type,
MATKL AS GM,
BISMT AS Ancien_No,
MFRPN AS Reference,
MFRNR AS Fab_Frs,
BWKEY AS Division,
BKLAS AS CV
FROM (MARA INNER JOIN MAKT
ON MARA.MATNR = MAKT.MATNR)
INNER JOIN MBEW
ON MARA.MATNR = MBEW.MATNR
WHERE MAKTX Like [Critere]
UNION SELECT MARA.MATNR AS Article,
MAKTX AS Designation,
MTART AS Type,
MATKL AS GM,
BISMT AS Ancien_No,
MFRPN AS Reference,
MFRNR AS Fab_Frs,
BWKEY AS Division,
BKLAS AS CV
FROM (MARA INNER JOIN MAKT
ON MARA.MATNR = MAKT.MATNR)
INNER JOIN MBEW
ON MARA.MATNR = MBEW.MATNR
WHERE MFRPN Like [Critere];
ps : DISTINCT inutile dans une requête UNION,
mais pas de différence notoire entre les temps dexécution
d'un SELECT et par rapport à un SELECT DISTINCT.
--
Bonne journée
Arnaud
http://memoaccess.free.fr-----Message d'origine-----
Bonjour,
Une constatation simple sur 2 requêtes impliquant pour
l'exemple 1 table de 700000 enregistrements et 2 tables
de400000 enregeistrements :
Résultat obtenu au bout de 170 Secondes
SELECT MARA.MATNR AS Article,
MAKTX AS Designation,
MTART AS Type,
MATKL AS GM,
BISMT AS Ancien_No,
MFRPN AS Reference,
MFRNR AS Fab_Frs,
BWKEY AS Division,
BKLAS AS CV
FROM (MARA INNER JOIN MAKT
ON MARA.MATNR = MAKT.MATNR)
INNER JOIN MBEW
ON MARA.MATNR > > >MBEW.MATNR
WHERE MAKTX Like [Critere]
or MFRPN Like [Critere];
.