IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Décisions SGBD Discussion :

Base de données pour éléments temporels


Sujet :

Décisions SGBD

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 30
    Points : 23
    Points
    23
    Par défaut Base de données pour éléments temporels
    Bonjour,

    Je suis en pleine recherche sur le meilleur outil gratuit à utiliser pour une gestion de données temporelles. C'est à dire que j'ai énormément de données qui dépendent d'une date.

    Basiquement la base de données recevra énormément d'insert liés à chaque fois à une date. Elle recevra également beaucoup de select, encore une fois liés à une recherche sur une date (avant, apres, intervals...).

    Intuitivement j'utiliserais MySQL pour tout cela, mais mes connaissances limitées dans les différents SGBD ne me permettent pas de savoir s'il existe de meilleurs outils.

    Bien à vous.

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 768
    Points : 52 571
    Points
    52 571
    Billets dans le blog
    5
    Par défaut
    benchmark MySQL, PostGreSQL, MS SQL Server sur des requêtes d'agrégation temporelles :
    http://blog.developpez.com/sqlpro/p9...alles_en_sql_1

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Membre éprouvé Avatar de Jester
    Inscrit en
    Septembre 2003
    Messages
    813
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 813
    Points : 1 058
    Points
    1 058
    Par défaut
    SQLPro votre benchmark est intéressant.

    Cependant, en 10 minutes j'ai trouvé un solution pour que postgresql soit comparable à votre meilleure solution SQL Server.

    Notons que cette requête n'utilise que du SQL de base mais que SQL Server ne sait pas l'exécuter. On pourrait la réécrire pour la faire tourner sur SQL Server 2012 donc la toute dernière version.

    Sur une VM (que vous convenez être une catastrophe pour les perfs d'un SGBD) quadri core (sur 4 dispo) 3.1GHz avec 8Go (sur 32) de RAM et un disque 2To standard 5400RPM. Disons comparable à votre serveur j'imagine avec des + et des -. J'obtiens :
    340s pour le 10M de lignes
    58s pour les 3M

    Je n'ai pas le paramétrage par défaut car ce serait stupide, mais rien d'incroyable ou hors des bonnes pratiques du manuel postgresql. Aucun index n'est utilisé.

    Le problème est un sort qui est effectué sur le disque dur ce qui prend la majorité du temp. Optimisable? On est sur un seul core utilisé, les autres se tournent les pouces, c'est PostgreSQL.

    Voici le script SQL. Cette méthode existe probablement déjà quelque part, sinon je la nomme la solution du bouffon.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    with projection as (
      select itv_item, itv_debut as dt, +1 as direction
      from t_interval_itv
      union all
      select itv_item, itv_fin as dt, -1 as direction
      from t_interval_itv
    ),
    sumsumsum as (
      select itv_item, dt, 
    	sum(direction) over (partition by itv_item order by dt, direction desc) as cnt,	
    	coalesce(sum(direction) over (partition by itv_item order by dt, direction desc rows between unbounded preceding and 1 preceding),0) as lag_cnt
      from projection
    ),
    make_order as (
      select itv_item, dt, 0 as pos
      from sumsumsum
      where cnt > 0 and lag_cnt = 0
      union all
      select itv_item, dt, 1 as pos
      from sumsumsum
      where cnt = 0 and lag_cnt >0
    ),
    make_interval as (
      select itv_item, dt as itv_debut, 
    	lead(dt) over (partition by itv_item order by dt) as itv_fin,
    	pos
      from make_order
    )
    select  itv_item, itv_debut, itv_fin
    from make_interval
    where pos = 0
    La même requête sur un serveur Greenplum (gratuit en community sur un seul noeud, pas de limite de taille) donne :
    87s pour 10M
    20s pour 3M
    Aucun index, aucune astuce greenplum (partitionning, bidouille sur les distributions, compression, ...).

    Certes ce n'est pas un SGBD prévu pour l'OLTP.

    D'ailleurs je doutes que ce soit le genre de requête qu'im-souf compte utiliser, il me semble plutôt qu'il cherche de l'archi basique.

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Février 2013
    Messages : 23
    Points : 32
    Points
    32
    Par défaut
    Bonjour, c'est du Postgres 9.2 ou du 8.4 ? Parce qu'entre 8.4 et 9.2, il y a eu du chemin de réalisé en terme de perfs. Et il serait intéressant de faire un test avec MariaDB, dont l'optimiseur a été amélioré par rapport à MySQL 5.5 qui comme le montre le test intéressant de SQLPro, est très basique et ne s'en sort pas avec des requêtes un tant soit peu complexes.

  5. #5
    Membre éprouvé Avatar de Jester
    Inscrit en
    Septembre 2003
    Messages
    813
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 813
    Points : 1 058
    Points
    1 058
    Par défaut
    C'est postgresql 9.1. Sur cette requête du 8.4 donnerais le même résultat je pense, il n'y a rien de très avancé dans le plan d'exécution.

    Je ne sais pas l'écrire pour MariaDB. C'est probablement possible en utilisant les fonctionnalité de variables de MySQL, mais ce n'est pas mon style de SQL. Ce serait du niveau de Postgresql (il y a juste 2 sort à faire). MySQL et forks ne sont pas vraiment prévu pour ce genre de requêtes.

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 768
    Points : 52 571
    Points
    52 571
    Billets dans le blog
    5
    Par défaut
    Jester, pour une fois, vous avez raison ! ;-)

    J'ai testé votre requête sur les 2 systèmes : PostGreSQL 9.1 et MS SQL Server 2012 et les temps sont comparables : 2 secondes chacun !

    Félicitation.

    Il me semble que dans la version 8.4 les fonctions LEAD et LAG ou RANGE et ROWS n'existait pas....

    N'hésitez pas à ajouter votre solution à mon blog !

    Merci

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  7. #7
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 445
    Points : 622
    Points
    622
    Par défaut
    @SQLPro

    Voici une requête pour MySQL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    SELECT  ITV_ITEM, ITV_DEBUT, MAX(ITV_FIN) AS ITV_FIN FROM
    (
    	SELECT	IF(currentItem=@previousItem, 
    			IF(@previousFin < currentFin,
    				IF(currentDebut <= @previousFin,
    					0,
    					@previousDebut:=currentDebut
    				) & (@previousFin:=currentFin),
    				0
    			),
    			(@previousItem:=currentItem) & (@previousDebut:=currentDebut)  & (@previousFin:=currentFin)
    		) AS calc,
    		@previousItem AS ITV_ITEM,
    		@previousDebut AS ITV_DEBUT,
    		@previousFin AS ITV_FIN
    	FROM 
    	(
    		SELECT ITV_ITEM AS currentItem,ITV_DEBUT AS currentDebut,ITV_FIN AS currentFin 
    		FROM `t_interval_itv`		
    	)t1 
    	ORDER BY currentItem,currentDebut
    ) t2
    STRAIGHT_JOIN (SELECT @previousItem:=NULL ) just_for_init
    GROUP BY ITV_ITEM,ITV_DEBUT
    ORDER BY ITV_ITEM,ITV_DEBUT;
    J'avais proposé cette solution sous forme de procédure, mais ça ne convenait pas...

    Je ne sais pas si elle est aussi rapide que la solution de Jester, mais elle devrait également mettre à mal vos conclusions.

    Edit: Mise en forme

  8. #8
    Membre éprouvé Avatar de Jester
    Inscrit en
    Septembre 2003
    Messages
    813
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 813
    Points : 1 058
    Points
    1 058
    Par défaut
    @Fred_34 je pense que votre solution est plus rapide en mono-threadé. Par contre, elle n'est pas parallélisable (ou en étant un super-super-optimiseur improbable). C'est l'avantage de mysql qui ajoute des features sans trop se demander quel impact ça aura dans le futur lointain. Elle est aussi un peu trop simple à comprendre

    @SQLPro lead et lag sont dispo depuis postgresql 8.4 donc depuis 2009. Je posterais un truc la semaine prochaine si j'y pense.

Discussions similaires

  1. Base de données pour Flash
    Par INM dans le forum Flash
    Réponses: 15
    Dernier message: 22/11/2005, 22h47
  2. Quelle base de données pour un emploi du temps
    Par edouard21 dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 26/10/2005, 22h48
  3. [Conception] base de données pour sport
    Par peach dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 26/10/2005, 15h21
  4. Un moteur de base de données pour un application
    Par sirius1974 dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 18/06/2005, 13h52
  5. comment faire ma base de donnée pour un moteur de recherche
    Par HoB dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 04/05/2004, 15h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo