phpcompta-contrib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Phpcompta-contrib] Re: [Dolibarr-user] Abstraction de base de données e


From: Dany De Bontridder
Subject: [Phpcompta-contrib] Re: [Dolibarr-user] Abstraction de base de données et versions de PHP
Date: Thu, 13 Apr 2006 20:35:03 +0200
User-agent: KMail/1.8.2

On Thursday 13 April 2006 10:57, herve couvelard wrote:
> Dany De Bontridder a écrit :

> Donc, l'argument de l'intégrité est moins déterminant que l'on veut bien
> le penser, et c'est une discussion que j'enfourche facilement,[peut être
> l'age]. Pour donner un peu plus de poids à mon argumentation (arrrfff),
> (coup bas désolé) c'est ton statut de free lance Oracle qui te pousse à
> travailler avec un char d'assaut (au cas ou) pour aller ceuillir des
> paquerettes. :-)
Ben disons que mon travail me permet de bien connaître les bases de 
données ;-)
>
> Voila, l'évolution de mysql qui ajoute des fonctionnalités à la Oracle
> et postgre devrait dans un avenir proche voir une migration des
> nombreuses personnes de oracle vers mysql, en laissant à oracle son
> marché NATUREL : le besoin d'une BDD sécurisé à la colone et à la ligne,
> avec la possibilité de faire plein de choses avec des vues graphiques au
> détriment de la performance brute.
Euh...Non j'ai déjà participé à des évaluations (pour la migration Oracle 
vers ??) et en opensource Psql tiendrait le coup (fonctionnalité et 
performance). Le problème est que MySql n'est bon pas pour la montée en 
charge avec des requêtes complexes, et Oracle est vraiment plus performant 
que MySql (et Psql), je pense que la vitesse de MySql est surtout une 
réputation de même que la lenteur d'Oracle ou de Psql, désolé, j'ai eu 
l'opportunité de faire des tests , et non, Oracle est très rapide même 
comparé à MySql, on ne se rend pas compte. Bien sûr, on finira par me 
répondre "quelle version de MySql, Oracle, Os, tuné, application, nombre de 
client et quels seraient les résultats si tu avais d'abord tuné Oracle en 
étant bourré ??...." Et on conclura par MySql est p-e plus rapide qu'Oracle 
dans certaines circonstances que je n'ai pas pu tester, une impasse 
trollesque comme d'hab, la vérité est ailleurs :-). 
>
> Par exemple lorsque je fais un essai sur le site phpcompta  de demo en
> ligne base compta cvs /journaux/grandlivre/, il y a un 'blanc' de 5-9
> secondes, je ne l'accepterais jamais d'une de mes applications.
> Mais je continue à dire que php compta est une super appli, et ce ne
> serais pas sous postgre, je l'aurais adopté 'de suite'
C'est assez normal, il y a beaucoup de jointure et comme les différentes 
tables sont devenues assez grosses ... Le produit cartésien devient 
important. Surtout que tout fonctionne avec des métadonnées pour les fiches 
et que j'avoue n'avoir pas trop tuné (ni les requêtes SQL ni les index)

Pour donner une idée d'une vue qui ne donne que les clients : il y a 9 sous 
requêtes chacune contenant 4 jointures entre 5 tables, fiche +/- 
10000lignes,jnt_fic_att_value 50000, attr_value 50000, les autres ont disons 
10 lignes chacunes, donc le produit cartésien = 10000*50000*50000*10*10 pour 
chaque sous-requête = 2.500.000.000.000.000 "tuples" à filtrer (il y a full 
table scan à cause du where) multiplié par 9, tu imagines la masses qu'on te 
renvoit en moins de 5 secondes (avec traitement de l'info, temps de réaction 
d'apache, lenteur réseau... ), essaie avec MySql et Oracle et dis-moi 
honnêtement qui tient la route ;-) (Oracle est effrayant de rapidité, faite 
un pg_dump, c'est de l'ANSI Sql) injecté dans Oracle et MySql rejouer les SQL 
qu'on trouvera dans la DB log et vous verrez par vous-même. Au faite 
seulement un select count sur les vues, vous comprendrez, il y a outil pour 
remplir les DB, besoin de données quand je teste 
(contrib/test-size/simul.py).

La vue la plus lourde a 13 sous-requêtes.

Pour avoir ce genre de requête va sur fiche-> fournisseur, résultat en 2-3 
secondes (affichage compris) pour un résultat de 5000 lignes (et ce n'est pas 
la seule requête qui est lancé, c'est la plus grosse elle est dans une vue). 
Et ce n'est pas un server dédié uniquement à PhpCompta




SELECT a.f_id, a.av_text AS name, b.av_text AS tva_num, c.av_text AS 
poste_comptable, d.av_text AS rue, e.av_text AS code_postal, f.av_text AS 
pays, g.av_text AS telephone, h.av_text AS email
   FROM ( SELECT jnt_fic_att_value.jft_id, fiche.f_id, fiche_def.frd_id, 
fiche.fd_id, fiche_def.fd_class_base, fiche_def.fd_label, 
fiche_def.fd_create_account, fiche_def_ref.frd_text, 
fiche_def_ref.frd_class_base, jnt_fic_att_value.ad_id, attr_value.av_text
           FROM fiche
      JOIN fiche_def USING (fd_id)
   JOIN fiche_def_ref USING (frd_id)
   JOIN jnt_fic_att_value USING (f_id)
   JOIN attr_value USING (jft_id)
  WHERE jnt_fic_att_value.ad_id = 1) a
   LEFT JOIN ( SELECT jnt_fic_att_value.jft_id, fiche.f_id, fiche_def.frd_id, 
fiche.fd_id, fiche_def.fd_class_base, fiche_def.fd_label, 
fiche_def.fd_create_account, fiche_def_ref.frd_text, 
fiche_def_ref.frd_class_base, jnt_fic_att_value.ad_id, attr_value.av_text
           FROM fiche
      JOIN fiche_def USING (fd_id)
   JOIN fiche_def_ref USING (frd_id)
   JOIN jnt_fic_att_value USING (f_id)
   JOIN attr_value USING (jft_id)
  WHERE jnt_fic_att_value.ad_id = 13) b USING (f_id)
   LEFT JOIN ( SELECT jnt_fic_att_value.jft_id, fiche.f_id, fiche_def.frd_id, 
fiche.fd_id, fiche_def.fd_class_base, fiche_def.fd_label, 
fiche_def.fd_create_account, fiche_def_ref.frd_text, 
fiche_def_ref.frd_class_base, jnt_fic_att_value.ad_id, attr_value.av_text
      FROM fiche
   JOIN fiche_def USING (fd_id)
   JOIN fiche_def_ref USING (frd_id)
   JOIN jnt_fic_att_value USING (f_id)
   JOIN attr_value USING (jft_id)
  WHERE jnt_fic_att_value.ad_id = 5) c USING (f_id)
   LEFT JOIN ( SELECT jnt_fic_att_value.jft_id, fiche.f_id, fiche_def.frd_id, 
fiche.fd_id, fiche_def.fd_class_base, fiche_def.fd_label, 
fiche_def.fd_create_account, fiche_def_ref.frd_text, 
fiche_def_ref.frd_class_base, jnt_fic_att_value.ad_id, attr_value.av_text
   FROM fiche
   JOIN fiche_def USING (fd_id)
   JOIN fiche_def_ref USING (frd_id).
   JOIN jnt_fic_att_value USING (f_id)
   JOIN attr_value USING (jft_id)
  WHERE jnt_fic_att_value.ad_id = 14) d USING (f_id)
   LEFT JOIN ( SELECT jnt_fic_att_value.jft_id, fiche.f_id, fiche_def.frd_id, 
fiche.fd_id, fiche_def.fd_class_base, fiche_def.fd_label, 
fiche_def.fd_create_account, fiche_def_ref.frd_text, 
fiche_def_ref.frd_class_base, jnt_fic_att_value.ad_id, attr_value.av_text
   FROM fiche
   JOIN fiche_def USING (fd_id)
   JOIN fiche_def_ref USING (frd_id)
   JOIN jnt_fic_att_value USING (f_id)
   JOIN attr_value USING (jft_id)
  WHERE jnt_fic_att_value.ad_id = 15) e USING (f_id)
   LEFT JOIN ( SELECT jnt_fic_att_value.jft_id, fiche.f_id, fiche_def.frd_id, 
fiche.fd_id, fiche_def.fd_class_base, fiche_def.fd_label, 
fiche_def.fd_create_account, fiche_def_ref.frd_text, 
fiche_def_ref.frd_class_base, jnt_fic_att_value.ad_id, attr_value.av_text
   FROM fiche
   JOIN fiche_def USING (fd_id)

   JOIN fiche_def_ref USING (frd_id)
   JOIN jnt_fic_att_value USING (f_id)
   JOIN attr_value USING (jft_id)
  WHERE jnt_fic_att_value.ad_id = 16) f USING (f_id)
   LEFT JOIN ( SELECT jnt_fic_att_value.jft_id, fiche.f_id, fiche_def.frd_id, 
fiche.fd_id, fiche_def.fd_class_base, fiche_def.fd_label, 
fiche_def.fd_create_account, fiche_def_ref.frd_text, 
fiche_def_ref.frd_class_base, jnt_fic_att_value.ad_id, attr_value.av_text
   FROM fiche
   JOIN fiche_def USING (fd_id)
   JOIN fiche_def_ref USING (frd_id)
   JOIN jnt_fic_att_value USING (f_id)
   JOIN attr_value USING (jft_id)
  WHERE jnt_fic_att_value.ad_id = 17) g USING (f_id)
   LEFT JOIN ( SELECT jnt_fic_att_value.jft_id, fiche.f_id, fiche_def.frd_id, 
fiche.fd_id, fiche_def.fd_class_base, fiche_def.fd_label, 
fiche_def.fd_create_account, fiche_def_ref.frd_text, 
fiche_def_ref.frd_class_base, jnt_fic_att_value.ad_id, attr_value.av_text
   FROM fiche
   JOIN fiche_def USING (fd_id)
   JOIN fiche_def_ref USING (frd_id)
   JOIN jnt_fic_att_value USING (f_id)
   JOIN attr_value USING (jft_id)
  WHERE jnt_fic_att_value.ad_id = 18) h USING (f_id)
  WHERE a.frd_id = 9




reply via email to

[Prev in Thread] Current Thread [Next in Thread]