Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
937 connectés 

 


 Mot :   Pseudo :  
 
 Page :   1  2  3
Page Suivante
Auteur Sujet :

[SQL] un coup de main pour rouler mon join?

n°1271055
joce
Architecte / Développeur principal
"BugHunter"
Posté le 21-12-2005 à 10:00:35  profilanswer
 

Reprise du message précédent :
Requète 1 :
 

+-------+------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Level | Code | Message                                                                                                                                                                                                                                                                                                                                                  |
+-------+------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Note  | 1276 | Field or reference 'p.id' of SELECT #2 was resolved in SELECT #1                                                                                                                                                                                                                                                                                         |
| Note  | 1003 | select `test`.`a`.`nom` AS `nom`,`test`.`a`.`adresse` AS `adresse`,`test`.`p`.`prix` AS `prix` from `test`.`Adresses` `a` join `test`.`Prix` `p` where ((`test`.`p`.`id` = `test`.`a`.`id`) and (`test`.`p`.`datetime` = (select max(`test`.`p1`.`datetime`) AS `max(p1.datetime)` from `test`.`prix` `p1` where (`test`.`p1`.`id` = `test`.`p`.`id`)))) |
+-------+------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)


 
Requete 2 :
 

| Note  | 1276 | Field or reference 'p.id' of SELECT #2 was resolved in SELECT #1                                                                                                                                                                                                                                                                                                                                                                                                             |
| Note  | 1003 | select `test`.`a`.`id` AS `id`,`test`.`a`.`nom` AS `nom`,`test`.`a`.`adresse` AS `adresse`,`test`.`p`.`id` AS `id`,`test`.`p`.`datetime` AS `datetime`,`test`.`p`.`prix` AS `prix` from `test`.`Adresses` `a` join `test`.`Prix` `p` where ((`test`.`p`.`id` = `test`.`a`.`id`) and (`test`.`p`.`datetime` = (select `test`.`p1`.`datetime` AS `datetime` from `test`.`Prix` `p1` where (`test`.`p1`.`id` = `test`.`p`.`id`) order by `test`.`p1`.`datetime` desc limit 1))) |


 
Requète 3 :
 

| Note  | 1003 | select `test`.`Adresses`.`id` AS `id`,`test`.`Adresses`.`nom` AS `nom`,`test`.`Adresses`.`adresse` AS `adresse`,`test`.`Prix`.`prix` AS `prix` from `test`.`Adresses` join `test`.`Prix` where ((`test`.`Prix`.`id` = `test`.`Adresses`.`id`) and <in_optimizer>((`test`.`Adresses`.`id`,`test`.`Prix`.`datetime`),<exists>(select `test`.`Prix`.`id` AS `id`,max(`test`.`Prix`.`datetime`) AS `dt_max` from `test`.`Prix` group by `test`.`Prix`.`id` having (((<cache>(`test`.`Prix`.`id`) = `test`.`Prix`.`id`) or isnull(`test`.`Prix`.`id`)) and ((<cache>(`test`.`Prix`.`datetime`) = max(`test`.`Prix`.`datetime`)) or isnull(max(`test`.`Prix`.`datetime`))) and <is_not_null_test>(`test`.`Prix`.`id`) and <is_not_null_test>(max(`test`.`Prix`.`datetime`)))))) |


 
J'ai été mauvaise langue, y a que la 3 qui est réécrite en type EXISTS

mood
Publicité
Posté le 21-12-2005 à 10:00:35  profilanswer
 

n°1271057
joce
Architecte / Développeur principal
&#034;BugHunter&#034;
Posté le 21-12-2005 à 10:02:06  profilanswer
 

la façon dont la 3 est réécrite, ca tire bien la gueule quand même [:ddr555]

n°1271066
mrbebert
Posté le 21-12-2005 à 10:23:58  profilanswer
 

C'est quoi ces informations ? Comment on les obtient :??:

n°1271069
cinocks
Posté le 21-12-2005 à 10:29:37  profilanswer
 

Punaise elle fait mal la 3.
 
Pour la 1, il me semblerait logique que l'outils execute la sous-requete une seule fois pour definir les differents max puisqu'il sait que la contrainte se fait sur l'id.


---------------
MZP est de retour
n°1271369
avander
Posté le 21-12-2005 à 16:07:32  profilanswer
 

C'est mon premier topic qui fait 3 pages  :whistle:, je vois qu'on s'éclate ici!  

n°1271370
joce
Architecte / Développeur principal
&#034;BugHunter&#034;
Posté le 21-12-2005 à 16:08:38  profilanswer
 

oui d'ailleurs il specifie bien Field or reference 'p.id' of SELECT #2 was resolved in SELECT #1.
 
Ca m'etonne que recuperer un MAX prenne plus de temps qu'un ORDER BY desc. Ou alors c'est que l'index est tres mal positionne :D

n°1271430
Arjuna
Aircraft Ident.: F-MBSD
Posté le 21-12-2005 à 17:35:23  profilanswer
 

En tout cas, sous Oracle, les trucs bien plus gore sont plus rapide que des prises de tête pas croyable :D
 

Code :
  1. CREATE OR REPLACE function CONVDEV2(p_codsoc  in number,
  2.                                    p_dateve  in varchar2,
  3.                                    p_dev1    in varchar2,
  4.                                    p_dev2    in varchar2,
  5.                                    p_natdev  in varchar2,
  6.                                    p_montant in number)
  7. return number is
  8. /*
  9.    Fonction stockee de conversion de devises monetaires (arrondi a 2 decimales)
  10.    Créée par ROA le 11-10-1999
  11.    Modifiée par DUJ le 27-08-2002 :
  12.             - ne gère plus la conversion des devises in via l'Euro
  13.             - recherche le cours inverse si le cours demandé n'est pas trouvé
  14.             - ajout du paramètre Nature de devise plutôt que de l'écrire en dur dans la requête
  15.    UTILISATION : CONVDEV(codsoc,date,dev1,dev2,montant) => montant en devise dev2
  16.                  codsoc  = code societe
  17.                  date    = conversion par rapport a une date donnee
  18.                  dev1    = devise du montant à convertir
  19.                  dev2    = devise de conversion
  20.                  natdev  = nature de devise
  21.                  montant = montant a convertir
  22. */
  23.   mont_con     number;
  24. begin
  25.   if (p_dev1<>p_dev2) then -- Les 2 devises sont différentes, conversion
  26.     begin
  27.          select p_montant*cours
  28.          into   mont_con
  29.          from   dem dem2
  30.          where  dem2.codsoc  = p_codsoc
  31.          and    dem2.coddev  = p_dev1
  32.          and    dem2.coddev2 = p_dev2
  33.          and    dem2.natdev  = p_natdev
  34.          and    dem2.datdeb  = (select max(datdeb)
  35.                                 from   dem
  36.                                 where  dem.codsoc  =  dem2.codsoc
  37.                                 and    dem.coddev  =  dem2.coddev
  38.                                 and    dem.coddev2 =  dem2.coddev2
  39.                                 and    dem.natdev  =  dem2.natdev
  40.                                 and    dem.datdeb  <= p_dateve);
  41.          exception
  42.                   when no_data_found then
  43.                        -- Pas de cours trouvé, on recherche si le cours inverse existe
  44.                        select decode(cours,0,0,p_montant/cours)
  45.                        into   mont_con
  46.                        from   dem dem2
  47.                        where  dem2.codsoc  = p_codsoc
  48.                        and    dem2.coddev  = p_dev2
  49.                        and    dem2.coddev2 = p_dev1
  50.                        and    dem2.natdev  = p_natdev
  51.                        and    dem2.datdeb  = (select max(datdeb)
  52.                                               from   dem
  53.                                               where  dem.codsoc  =  dem2.codsoc
  54.                                               and    dem.coddev  =  dem2.coddev
  55.                                               and    dem.coddev2 =  dem2.coddev2
  56.                                               and    dem.natdev  =  dem2.natdev
  57.                                               and    dem.datdeb  <= p_dateve);
  58.     end;
  59.     return round(mont_con,2);
  60.   else -- Les 2 devises sont les memes, pas de conversion
  61.     return p_montant;
  62.   end if;
  63. exception
  64.   when others then
  65.        return 0;
  66. end;
  67. /
  68. CREATE OR REPLACE function getTSC(p_codsoc tsc.codsoc%type,
  69.           p_achvte tsc.achvte%type,
  70.        p_sigtie tsc.sigtie%type,
  71.        p_codpro tsc.codpro%type,
  72.        p_coddev tsc.coddev%type,
  73.        p_datval tsc.datdeb%type)
  74. return number is
  75.     -- SD : 20051221
  76. -- Fonction retournant le tarif du type choisi applicable en fonction des paramètres
  77. -- Membres de la clé primaire qui ne sont pas passés en paramètre.
  78. -- Ils sont gérés en Variables, afin de pouvoir simplement
  79. -- les rajouter en paramètre si besoin.
  80. v_codreg tsc.codreg%type;
  81. v_codetb tsc.codetb%type;
  82. v_codbar tsc.codbar%type;
  83. v_codvar tsc.codvar%type;
  84. -- Variable de retour
  85. r_tscprx tsc.prxtar%type;
  86. -- Variables locales
  87. v_coddev tsc.coddev%type;
  88. begin
  89. v_codreg := ' ';
  90. v_codetb := ' ';
  91. v_codbar := ' ';
  92. v_codvar := ' ';
  93.     if p_achvte = 'R' then
  94.    select para1
  95.    into v_coddev
  96.    from parav
  97.    where codsoc = p_codsoc
  98.    and codpar = 'DEVNAT'
  99.    and codfct = ' ';
  100. else
  101.    v_coddev := p_coddev;
  102. end if;
  103. select decode(p_achvte, 'R', prxrev, prxtar)
  104. into r_tscprx
  105. from tsc
  106. where
  107.     codsoc = p_codsoc
  108. and achvte = p_achvte
  109. and sigtie = p_sigtie
  110. and codpro = p_codpro
  111. and codreg = v_codreg
  112. and codetb = v_codetb
  113. and coddev = v_coddev
  114. and codbar = v_codbar
  115. and codvar = v_codvar
  116. and datdeb = (
  117.  select min(datdeb)
  118.  from tsc tsc2
  119.  where tsc2.codsoc = tsc.codsoc
  120.  and tsc2.achvte = tsc.achvte
  121.  and tsc2.sigtie = tsc.sigtie
  122.  and tsc2.codpro = tsc.codpro
  123.  and tsc2.codreg = tsc.codreg
  124.  and tsc2.codetb = tsc.codetb
  125.  and tsc2.coddev = tsc.coddev
  126.  and tsc2.codbar = tsc.codbar
  127.  and tsc2.codvar = tsc.codvar
  128.  and p_datval between tsc2.datdeb and decode(tsc2.datfin, ' ', to_char(sysdate, 'YYYYMMDD'), tsc2.datfin));
  129.     return r_tscprx;
  130.     exception
  131. when no_data_found then return -1;
  132. end;
  133. /
  134. CREATE OR REPLACE FORCE VIEW SOC1.WV_STKCPT
  135. (CODSOC, LIB1, LIB2, LIB3, LIB4,
  136. LIB5, LIB6, LIB7, LIB8, LIB9,
  137. LIB10, LIB11, LIB12, LIB13, LIB14,
  138. LIB15, LIB16, LIB17, LIB18, LIB19,
  139. LIB20, DAT1, DAT2, DAT3, DAT4,
  140. DAT5, NUM01, NUM02, NUM03, NUM04,
  141. NUM05, NUM06, NUM07, NUM08, NUM09,
  142. NUM10, VAL01, VAL02, VAL03, VAL04,
  143. VAL05, VAL06, VAL07, VAL08, VAL09,
  144. VAL10, VAL11, VAL12, VAL13, VAL14,
  145. VAL15, VAL16, VAL17, VAL18, VAL19,
  146. VAL20)
  147. AS
  148. select
  149.         dsk.codsoc,
  150.         dsk.sigdep, dsk.codpro, dsk.coduni, to_char(sysdate,'YYYYMMDD'), ' ',
  151.         ' ', ' ', ' ', ' ', ' ',
  152.         ' ', ' ', ' ', ' ', ' ',
  153.         ' ', ' ', ' ', ' ', ' ',
  154.         ' ', ' ', ' ', ' ', ' ',
  155.         round(decode(
  156.      getTSC(
  157.          dsk.codsoc,
  158.       'R',
  159.       ' ',
  160.       dsk.codpro,
  161.       ' ',
  162.       to_char(sysdate, 'YYYYMMDD')
  163.       ),
  164.    -1,
  165.    convdev2(
  166.       dsk.codsoc,
  167.       to_char(sysdate, 'YYYYMMDD'),
  168.       (select tie.coddev
  169.        from tie, pro
  170.        where pro.codsoc = dsk.codsoc
  171.        and pro.codpro = dsk.codpro
  172.        and tie.codsoc = pro.codsoc
  173.        and tie.typtie = 'FOU'
  174.        and tie.sigtie = pro.sigfou),
  175.       (select para1
  176.        from parav
  177.        where codsoc = dsk.codsoc
  178.        and codpar = 'DEVNAT'
  179.        and codfct = ' '),
  180.       'STD',
  181.       getTSC(
  182.         dsk.codsoc,
  183.        'A',
  184.        (select pro.sigfou
  185.         from pro
  186.         where pro.codsoc = dsk.codsoc
  187.         and pro.codpro = dsk.codpro),
  188.        dsk.codpro,
  189.        (select tie.coddev
  190.         from tie, pro
  191.         where pro.codsoc = dsk.codsoc
  192.         and pro.codpro = dsk.codpro
  193.         and tie.codsoc = pro.codsoc
  194.         and tie.typtie = 'FOU'
  195.         and tie.sigtie = pro.sigfou),
  196.        to_char(sysdate, 'YYYYMMDD'))
  197.    ),
  198.    getTSC(
  199.        dsk.codsoc,
  200.        'R',
  201.        ' ',
  202.        dsk.codpro,
  203.        ' ',
  204.        to_char(sysdate, 'YYYYMMDD'))
  205.  ), 2), 0, 0, 0, 0,
  206.         0, 0, 0, 0, 0,
  207.         dsk.c01, dsk.c02, dsk.c03, dsk.c04, dsk.c01,
  208.         0, 0, 0, 0, 0,
  209.         0, 0, 0, 0, 0,
  210.         0, 0, 0, 0, 0
  211. from dsk
  212. where c01 > 0;
  213. select *
  214. from wv_stkcpt
  215. where codsoc = 2
  216. and num01 < 0
  217. -> 5 lignes en 2 secondes sur un serveur NT et des tables bien remplies.
  218. Pourtant ce serveur ramme particulièrement lors de traîtements relativement simples par moment. Preuve que Oracle se sort remarquablement bien des trucs qui marchent sur la tête :D
  219. PS: Oracle 8.1.7

n°1272771
Berceker U​nited
PSN : berceker_united
Posté le 23-12-2005 à 22:43:51  profilanswer
 

le join n'a pas finit d'etre fumé ? :/

n°1272794
Arjuna
Aircraft Ident.: F-MBSD
Posté le 24-12-2005 à 00:59:06  profilanswer
 

t'as fini de changer de pseudo toutes les 30 secondes toi ? :D
 
après je comprends jamais plus qui est qui :o

n°1272808
Berceker U​nited
PSN : berceker_united
Posté le 24-12-2005 à 07:12:31  profilanswer
 

non j'ai toujours gardé celui-ci :o

mood
Publicité
Posté le 24-12-2005 à 07:12:31  profilanswer
 

n°1272820
joce
Architecte / Développeur principal
&#034;BugHunter&#034;
Posté le 24-12-2005 à 10:00:50  profilanswer
 

il est passé où notre expert SQL leflos5 :??:

n°1272826
cinocks
Posté le 24-12-2005 à 10:37:34  profilanswer
 

il nous pond une requete simple :o


---------------
MZP est de retour
n°1273671
joce
Architecte / Développeur principal
&#034;BugHunter&#034;
Posté le 27-12-2005 à 13:00:19  profilanswer
 

il a l'air constipé :o

n°1273678
mrbebert
Posté le 27-12-2005 à 13:21:08  profilanswer
 

Comment on obtient toutes ces infos sur une requête :??:  
 

joce a écrit :

Requète 1 :
 

+-------+------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Level | Code | Message                                                                                                                                                                                                                                                                                                                                                  |
+-------+------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Note  | 1276 | Field or reference 'p.id' of SELECT #2 was resolved in SELECT #1                                                                                                                                                                                                                                                                                         |
| Note  | 1003 | select `test`.`a`.`nom` AS `nom`,`test`.`a`.`adresse` AS `adresse`,`test`.`p`.`prix` AS `prix` from `test`.`Adresses` `a` join `test`.`Prix` `p` where ((`test`.`p`.`id` = `test`.`a`.`id`) and (`test`.`p`.`datetime` = (select max(`test`.`p1`.`datetime`) AS `max(p1.datetime)` from `test`.`prix` `p1` where (`test`.`p1`.`id` = `test`.`p`.`id`)))) |
+-------+------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)


 
...


n°1275018
avander
Posté le 30-12-2005 à 17:07:00  profilanswer
 

J'étais tout content avec la requete de joce mais quand j'ai voulu la mettre en production je suis tombé sur un os...  
en effet point de mySQL 5 en production mais un archaique mySQL 4.0... qui est complètement hermétique au subqueries  :whistle:  
 
En consultant la doc de mySQL j'ai quand même pondu un truc qui semble tenir la route et ce sans subquery  :ange: grâce aux examples fourni ici
 
http://dev.mysql.com/doc/refman/4. [...] p-row.html
 
et la requete finale:  

select s1.id, s3.nom, s1.date, s1.prix, count(*) as records
from prix s1
 
inner join prix s2
on s1.id = s2.id
 
inner join adresses s3
on s1.id = s3.id
 
group by s1.id, s1.date, s1.prix
 
having s1.date = max(s2.date);


 
Ne me dites pas que c'est pas terrible niveau perfs... je m'en doute un peu!

n°1275113
joce
Architecte / Développeur principal
&#034;BugHunter&#034;
Posté le 30-12-2005 à 19:23:19  profilanswer
 

avander a écrit :

J'étais tout content avec la requete de joce mais quand j'ai voulu la mettre en production je suis tombé sur un os...  
en effet point de mySQL 5 en production mais un archaique mySQL 4.0... qui est complètement hermétique au subqueries  :whistle:  
 
En consultant la doc de mySQL j'ai quand même pondu un truc qui semble tenir la route et ce sans subquery  :ange: grâce aux examples fourni ici
 
http://dev.mysql.com/doc/refman/4. [...] p-row.html
 
et la requete finale:  

select s1.id, s3.nom, s1.date, s1.prix, count(*) as records
from prix s1
 
inner join prix s2
on s1.id = s2.id
 
inner join adresses s3
on s1.id = s3.id
 
group by s1.id, s1.date, s1.prix
 
having s1.date = max(s2.date);


 
Ne me dites pas que c'est pas terrible niveau perfs... je m'en doute un peu!


tu pourrais passer à MySQL 4.1 au moins :o

n°1275145
avander
Posté le 30-12-2005 à 21:20:56  profilanswer
 

lol, j'ai pas le choix c'est mon hébergeur qui décide...  :D

n°1275185
joce
Architecte / Développeur principal
&#034;BugHunter&#034;
Posté le 30-12-2005 à 23:51:54  profilanswer
 

change d'hebergeur :o
parce que 4.1 est déjà considéré comme deprecated, alors 4.0 voila quoi :o

n°1275614
avander
Posté le 01-01-2006 à 19:41:56  profilanswer
 

je vais toujours lui ( www.b-one.net) en parler, on ne sait jamais... maintenant pour 1,25€ par mois c'est peut-être abuser aussi.  :ange:  

n°1276246
avander
Posté le 03-01-2006 à 11:13:05  profilanswer
 

Voila une réponse encourageante, qui demande rien n'a rien...
 

Thank you for contacting B-one!
 
The current version of MySQL is Client API
version 4.0.24 . We do intend to make MySQL
5.0 available in the near furture but I cannot
give you the exact time frame when it will
be available.

n°1276303
joce
Architecte / Développeur principal
&#034;BugHunter&#034;
Posté le 03-01-2006 à 12:46:41  profilanswer
 

ah ouais ils passent directement de 4.0 a 5.0 sans passer par la case 4.1 :D

n°1286237
joce
Architecte / Développeur principal
&#034;BugHunter&#034;
Posté le 18-01-2006 à 01:43:55  profilanswer
 

autre méthode marrante qui a priori fonctionne :
 
SELECT a.*,p.* FROM adresse as a, prix as p, prix as p1 WHERE a.id=p.id AND p.id=p1.id AND p.date<p1.date AND p1.id IS NULL

Message cité 1 fois
Message édité par joce le 18-01-2006 à 01:46:06
n°1286312
avander
Posté le 18-01-2006 à 10:05:08  profilanswer
 

joce a écrit :

autre méthode marrante qui a priori fonctionne :
 
SELECT a.*,p.* FROM adresse as a, prix as p, prix as p1 WHERE a.id=p.id AND p.id=p1.id AND p.date<p1.date AND p1.id IS NULL


 
:gratgrat: je comprends pas trop l'entourloupe avec p1.id IS NULL mais je vais tester...
 
si ça marche en 4.0 se serait cool parce que pour l'instant je dois le faire en deux temps ( sélectionner les prix dans une table temporaire puis lecture de la temporaire avec order by sur les codes postaux). Avec ceci je pourrais rajouter l'order by direct, nan?

Message cité 1 fois
Message édité par avander le 18-01-2006 à 10:06:01
n°1286387
Arjuna
Aircraft Ident.: F-MBSD
Posté le 18-01-2006 à 11:21:48  profilanswer
 

joce, quand t'auras 5 minutes à perdre... :D
http://forum.hardware.fr/forum2.ph [...] w=0&nojs=0

n°1286461
joce
Architecte / Développeur principal
&#034;BugHunter&#034;
Posté le 18-01-2006 à 12:17:37  profilanswer
 

avander a écrit :

:gratgrat: je comprends pas trop l'entourloupe avec p1.id IS NULL mais je vais tester...
 
si ça marche en 4.0 se serait cool parce que pour l'instant je dois le faire en deux temps ( sélectionner les prix dans une table temporaire puis lecture de la temporaire avec order by sur les codes postaux). Avec ceci je pourrais rajouter l'order by direct, nan?


Seulement l'enregistrement qui a la date la plus recente ne peut pas avoir la condition de jointure p.date<p1.date vrai, donc il est associe a un p1 NULL, d'ou la condition sur p1.id IS NULL pour ne recuperer que cette ligne qui nous interesse.
 
oups d'ailleurs c'est :
 
SELECT a.*,p.* FROM adresse as a, prix as p LEFT JOIN prix as p1 ON (p.id=p1.id AND p.date<p1.date) WHERE a.id=p.id AND p1.id IS NULL

n°1286464
Arjuna
Aircraft Ident.: F-MBSD
Posté le 18-01-2006 à 12:20:48  profilanswer
 

je préfère avec le left join, je comprenais pas très bien non plus la requête sans lui.
me disais "encore un délire de MySQL" :D

n°1286593
avander
Posté le 18-01-2006 à 14:21:58  profilanswer
 

joce a écrit :

...
oups d'ailleurs c'est :
 
SELECT a.*,p.* FROM adresse as a, prix as p LEFT JOIN prix as p1 ON (p.id=p1.id AND p.date<p1.date) WHERE a.id=p.id AND p1.id IS NULL


 
J'espère que ça marche mieux que le précedent...  :whistle:
 
C'est effectivement le cas après avoir testé: magnifique !! :jap: :jap: :jap:


Message édité par avander le 18-01-2006 à 14:36:03
n°1287227
joce
Architecte / Développeur principal
&#034;BugHunter&#034;
Posté le 19-01-2006 à 00:05:33  profilanswer
 

:sol:
par contre je serais curieux de voir le resultat du test de vitesse :D
 
(enfin dans l'esprit ca ressemble à  
 
select s1.id, s3.nom, s1.date, s1.prix, count(*) as records
from prix s1
 
inner join prix s2
on s1.id = s2.id
 
inner join adresses s3
on s1.id = s3.id
 
group by s1.id, s1.date, s1.prix
 
having s1.date = max(s2.date); )


Message édité par joce le 19-01-2006 à 00:08:53
n°1287343
avander
Posté le 19-01-2006 à 10:46:20  profilanswer
 

Je ferais la comparaison en lancant les deux requêtes à partir de phpMyAdmin...

n°1290250
avander
Posté le 23-01-2006 à 16:28:44  profilanswer
 

Choses promises, choses dues...
 
Les requêtes sont lancées à partir de phpMyAdmin, j'ignore si il y a un méchanisme de cache qui joue, j'obtiens le même résultat si je me déconnecte d'abord...  
 
 

Code :
  1. SELECT s1.id, s1.date, s3.nom, s3.adresse, s3.cp, s3.localite, s1.prix
  2. FROM prix s1
  3.   INNER JOIN prix s2
  4.   ON s1.id = s2.id
  5.   INNER JOIN adresses s3
  6.   ON s1.id = s3.id
  7. GROUP BY s1.id, s1.date, s1.prix
  8. HAVING s1.date = MAX( s2.date)


L'ancienne requête: 0,0042 sec pour 16 résultats
 

Code :
  1. SELECT p.id, p.date, a.nom, a.adresse, a.cp, a.localite, p.prix
  2. FROM adresses as a, prix as p
  3.    LEFT JOIN prix as p1
  4.    ON ( p.id = p1.id AND p.date < p1.date)
  5.    WHERE a.id = p.id AND p1.id IS NULL


La nouvelle version: 0,0019 sec toujours pour 16 résultats
 

Code :
  1. SELECT p.id, p.date, a.nom, a.adresse, a.cp, a.localite, p.prix
  2. FROM adresses as a, prix as p
  3.    LEFT JOIN prix as p1
  4.    ON ( p.id = p1.id AND p.date < p1.date)
  5.    WHERE a.id = p.id AND p1.id IS NULL
  6. ORDER BY a.cp


La nouvelle avec order by: 0,0002 sec toujours pour 16 résultats  :pt1cable:  
 
Une idée pourquoi l'order by dope le résultat de façon spectaculaire? :gratgrat:

n°1290298
Arjuna
Aircraft Ident.: F-MBSD
Posté le 23-01-2006 à 17:11:13  profilanswer
 

Une idée pourquoi l'order by dope le résultat de façon spectaculaire?
-> Parceque c'est la même requête que précédement, et qu'elle est déjà en cache.
 
Sinon, tes résultats ne sont pas très parlants... Met au moins 10000 lignes et refait les requêtes, parceque sur 16 résultats, c'est trop juste... Notamment la première requête c'est tapé toutes les IO pour charger les données en mémoire, et les autres se sont basées sur les données déjà en mémoire pour travailler, donc les résultats sont fortement biaisés.

n°1291172
avander
Posté le 24-01-2006 à 17:04:03  profilanswer
 

Arjuna a écrit :

Une idée pourquoi l'order by dope le résultat de façon spectaculaire?
-> Parceque c'est la même requête que précédement, et qu'elle est déjà en cache.


Oui je m'en doute un peu, mais comment faire pour lancer les requêtes dans des conditions de départ identiques alors...  
 

Arjuna a écrit :


Sinon, tes résultats ne sont pas très parlants... Met au moins 10000 lignes et refait les requêtes, parceque sur 16 résultats, c'est trop juste...  
....


Tu fais quoi ce weekend?  :ange:

n°1292234
joce
Architecte / Développeur principal
&#034;BugHunter&#034;
Posté le 25-01-2006 à 20:22:21  profilanswer
 

avander a écrit :

Oui je m'en doute un peu, mais comment faire pour lancer les requêtes dans des conditions de départ identiques alors...  
 
 
Tu fais quoi ce weekend?  :ange:


key_buffer_size à 0 et query_cache à 0 ca devrait pas mal aider ;)

n°1292833
Arjuna
Aircraft Ident.: F-MBSD
Posté le 26-01-2006 à 16:46:48  profilanswer
 

avander a écrit :

Tu fais quoi ce weekend?  :ange:


bah tu peux faire un script genre :
 
for i = 1 to 100000
   insert dans ma table des conneries aléatoires;
next

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2  3
Page Suivante

Aller à :
Ajouter une réponse
 

Sujets relatifs
export de phpmyadmin vers SQL Serverordonner les resultats d'une requete SQL !
[SQL] Sauvegarder un fichier dans un blob ?Pb de PL SQL
PROMPT dans une procédure PL SQLHibernate Commande SQL direct
SQl\excelImport Export de données dans une BDD SQL et fichier texte
SQL Server 2005 Express et Full-text index ?[SQL Server]Reporting Services : Pages blanches à l'export des reports
Plus de sujets relatifs à : [SQL] un coup de main pour rouler mon join?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR