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

MS SQL Server Discussion :

Requête sur table avec des centaines de millions de lignes


Sujet :

MS SQL Server

  1. #1
    Futur Membre du Club
    Inscrit en
    octobre 2008
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : octobre 2008
    Messages : 9
    Points : 6
    Points
    6
    Par défaut Requête sur table avec des centaines de millions de lignes
    Bonjour,
    Voila je travaille sur un projet de géolocalisation avec SqlServer2008 ,
    j'ai une table "trame" qui contiendra tous les trames de tous les boitiers GPS qui sont au nombre de 1000 , un boitier envoie en moyenne 10 000 trames en un mois, donc ma table contiendra minimum 10 millions de lignes en un mois.

    La clé de cette table est un entier auto incrément.

    Ma question est que lorsque je fait un
    select avec where =" identifiant du boitier que je veux avoir ses trames"
    dans la table "trame", donc le SGBD va comparer la valeur du where avec chaque ligne de la table, combien de temps va prendre cette simple requête avec une table contenant des centaines de millions de lignes? et est-ce qu'il faut utiliser d'autres méthodes pour optimiser le temps de la requête?

    et merci.

  2. #2
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : janvier 2005
    Messages : 5 826
    Points : 12 348
    Points
    12 348
    Par défaut
    Bonjour,

    donc le SGBD va comparer la valeur du where avec chaque ligne de la table, combien de temps va prendre cette simple requête avec une table contenant des centaines de millions de lignes? et est-ce qu'il faut utiliser d'autres méthodes pour optimiser le temps de la requête?
    Il est impossible de prédire le temps d'exécution d'une requête sans plus d'informations que ce que vous donnez; d'autre part cela dépend aussi de la configuration hardware de la machine hébergeant SQL Server et votre base de données.

    Pour obtenir un temps de réponse raisonnable, il vous suffit pour cela d'indexer la colonne boitier_GPS_id de la table dbo.trame.

    La clé de cette table est un entier auto incrément.
    Vous voulez dire clé primaire ? si vous avez créé la clé primaire sans spécifier l'index, alors celui-ci est un index cluster

    Cela dit même avec 1000 boîtiers je doute que cela soit assez sélectif pour vous retourner un résultat en quelques secondes lorsque la table aura atteint son véritable volume de production.
    Je ne doute pas que la table contient une colonne probablement de type datetime ou même datetime2. Donc il est évident que vous allez filtrer la table par date et par boîtier.
    En ce sens il vaudra donc mieux créer un index non-cluster composite sur ces deux colonnes ...
    Peut-être même que ce devrait être une contrainte d'unicité ?
    C'est à dire qu'à tout moment, le couple {date, boîtier} dans l'entité trame est unique.
    A ce moment là c'est encore mieux puisque vous avez la meilleure sélectivité possible

    Dans l'attente de vos réponses et de la structure exacte de la table (colonnes, leurs types, et les index).

    @++

  3. #3
    Futur Membre du Club
    Inscrit en
    octobre 2008
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : octobre 2008
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Salut Nicolas,

    Je vous remercie pour votre explication, c'est vrai que je n'étais pas très précis, voila le format de la table trame:

    Trame( Rang_Trame,HHMMSS, Date, Longitude, Latitude, Atitude, Vitesse, Cap, #Id_Boitier) ;

    tel que:

    Rang_trame: est la clé primaire unique (int auto increment),
    HHMMSS: est l'heure+minutes+secondes //j'ai séparer l'heure de la date.
    ID_Boitier: est une clé étrangére,

    Je ne doute pas que la table contient une colonne probablement de type datetime ou même datetime2. Donc il est évident que vous allez filtrer la table par date et par boîtier.
    Tout à fait, au niveau de l'application, lorsque le client veut géolocaliser le boiter, il selectionne le boitier (ID_Boitier) et puis l’intervalle de date : ( date début + date fin)

    Donc mes sélections vont se faire sur ces deux colonnes: "ID_Boitier" et "Date".

    Sachant que la colonne "Date" est déjà triée, donc il serait facile à mon avis de l'indexer même en cluster.



    Voici un petit extrait de la table Trame :

    Rang_Trame_______Date___________HHMMSS__….....______ID_Boitier
    734651________04/01/2012________13 :25 :22_____________121
    734652________04/01/2012________13 :25 :55_____________444
    734653________04/01/2012________13 :25 :59_____________322
    734654________04/01/2012________13 :26 :03_____________121
    734655________04/01/2012________13 :26 :12_____________444
    734656________04/01/2012________13 :26 :29_____________533
    734657________04/01/2012________13 :26 :31_____________121



    En ce sens il vaudra donc mieux créer un index non-cluster composite sur ces deux colonnes ...
    Oui, mais sachant qu'un boitier envoie en moyenne 2 trames par minute, pour 1000 boitier on aura 2000 trames par minute !

    Et pourquoi ne pas le faire comme Index Cluster (indexant les deux colonnes Date+ID_Boitier) ?

    Peut-être même que ce devrait être une contrainte d'unicité ?
    Oui c'est une contrainte d'unicité si on ajoute la colonne HHMMSS.

    Une autre question : Est ce que les index fonctionnent avec les requetes contenant "Between" dans le where?

    par exemple:
    select * from Trame where ID_Balise=121 et Date=04/01/2012 et HHMMSS between 13 :25 :22 and 13 :27 :00

    Je n'ai pas l'habitude de travailler avec des flux de données gigantesques , donc j'essaye de bien cerner les problèmes avant de commencer la programmation,

    cordialement.

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Consultant Teradata
    Inscrit en
    septembre 2008
    Messages
    8 240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Teradata
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2008
    Messages : 8 240
    Points : 17 205
    Points
    17 205
    Par défaut
    Citation Envoyé par kaka83185 Voir le message
    HHMMSS: est l'heure+minutes+secondes //j'ai séparer l'heure de la date.
    Je pense que c'est une erreur dès lors que vous ferez des requêtes sur plusieurs journées.
    La requête pour récupérer les données entre le 4 janvier 23h30 et le 6 janvier 00h30 s'écrit ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select *
      from Trame
     where ID_Balise = 121 
       and [Date] between '2012-01-04' and '2012-01-06'
       and (   ([Date] = '2012-01-04' and [HHMMSS] >= '23:30:00')
            or ([Date] = '2012-01-06' and [HHMMSS] <= '00:30:00')  )
    Alors qu'avec un datetime :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     select *
      from Trame
     where ID_Balise = 121 
       and [DateTime] between '2012-01-04 23:30:00' and '2012-01-06 00:30:00'
    Citation Envoyé par kaka83185 Voir le message
    Oui, mais sachant qu'un boitier envoie en moyenne 2 trames par minute, pour 1000 boitier on aura 2000 trames par minute !
    Vous devriez envisager très sérieusement de partitionner (horizontalement) votre table sur des plages de dates (à vous de voir pour le pas de partionnement)
    http://technet.microsoft.com/en-us/l...(SQL.100).aspx

Discussions similaires

  1. Requête sur table avec beaucoup de champs
    Par Lideln75 dans le forum Requêtes
    Réponses: 16
    Dernier message: 04/12/2008, 03h37
  2. Réponses: 4
    Dernier message: 22/11/2007, 20h23
  3. Réponses: 14
    Dernier message: 23/07/2007, 18h29
  4. Réponses: 3
    Dernier message: 13/06/2007, 00h31
  5. [Requête] Union de 2 tables avec des colonnes différentes
    Par ceuce dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 22/05/2007, 18h04

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