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 :

[SQL2K] Table avec données tournantes


Sujet :

MS SQL Server

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 14
    Points : 10
    Points
    10
    Par défaut [SQL2K] Table avec données tournantes
    Bonjour,

    j'ai une table qui doit contenir des informations horodatées tournantes sur une profondeur d'un mois.
    Chaque jour je supprime les informations pour garder la taille de la table à 1 mois.

    Mon problème est lié à la taille de la table : 1 million d'enregistrements, et au temps mis à effectuer cette requete de suppression.

    Voici la structure de la table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE TABLE donneestechniques
    (
    station_id 	INTEGER NOT NULL FOREIGN KEY REFERENCES station (station_id),
    indexdonnee	INTEGER NOT NULL,
    dateheuretu	DATETIME DEFAULT GETDATE(),
    dateheurelegale	DATETIME DEFAULT GETDATE(),
    donnee		FLOAT DEFAULT '-9999',
    parametre	INTEGER DEFAULT'0'
    CONSTRAINT PK_donneestechniques PRIMARY KEY (station_id, indexdonnee, dateheuretu, parametre)
    )
    Voici ma requête de suppression :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DELETE FROM donneestechniques WHERE dateheuretu < 'AAAAMMJJ HH:mm:SS.mse'
    avec 'AAAAMMJJ HH:mm:SS.mse' la date d'il y a un mois.

    La requete, executée une fois par jour, mets 5 minutes à s'éxécuter. Je cherche désespérement à diminuer son temps d'execution.

    Avez vous des conseils sur les tables avec un nombre important d'enregistrements permettant de résoudre mon problème ?

  2. #2
    Expert confirmé
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Points : 4 043
    Points
    4 043
    Par défaut
    Bonjour,

    As-tu un index sur la colonne dateheuretu (avec cette colonne seule, ou en premier) ?
    Même avec ça, peut-être SQL Server ne l'utilise pas, peux-tu poster le résultat de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SET SHOWPLAN_TEXT
    GO
    DELETE FROM donneestechniques WHERE dateheuretu < 'AAAAMMJJ HH:mm:SS.mse'
    Ta clé primaire est longue. Est-elle clustered ? On dirait que oui selon ton DDL. Ca peut être un problème. essaie de la mettre en NONCLUSTERED.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    Bonjour,

    voici le résultat des mes manips sur la table :

    création d'un index sur la colonne dateheuretu


    voici le détail de ma clé primaire


    et voici le résultat de la requete avec la modification ci dessus :

    |--Sequence
    |--Index Delete(OBJECT:([frontal].[dbo].[donneestechniques].[index_2101582525]))
    | |--Sort(ORDER BY:([donneestechniques].[rowguid] ASC))
    | |--Table Spool
    | |--Table Delete(OBJECT:([frontal].[dbo].[donneestechniques]))
    | |--Top(ROWCOUNT est 0)
    | |--Index Seek(OBJECT:([frontal].[dbo].[donneestechniques].[IX_dateheuretu]), SEEK:([donneestechniques].[dateheuretu] < Convert([@1])) ORDERED FORWARD)
    |--Index Delete(OBJECT:([frontal].[dbo].[donneestechniques].[PK_donneestechniques]))
    | |--Sort(ORDER BY:([donneestechniques].[station_id] ASC, [donneestechniques].[indexdonnee] ASC, [donneestechniques].[dateheuretu] ASC, [donneestechniques].[parametre] ASC))
    | |--Table Spool
    |--Index Delete(OBJECT:([frontal].[dbo].[donneestechniques].[IX_dateheuretu]))
    |--Sort(ORDER BY:([donneestechniques].[dateheuretu] ASC, [Bmk1000] DESC))
    |--Table Spool


    Je n'ai pas encore assez de recul dans le temps pour juger des améliorations, car j'ai du supprimer des données pour d'autres tests. Dès que ma table aura repris son ancien volume, je reposterais.

    Merci en tout cas de ta réponse,
    Nicolas

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 902
    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 902
    Points : 53 143
    Points
    53 143
    Billets dans le blog
    6
    Par défaut
    1) pour votre clef, sachez qu'une clef composée de plusieurs colonnes est toujours une mauvaise idée. Vous auriez tout intérêt soit :
    a) à ajouter un identifiant autoincrémenté et le faire devenir clef et placez vos quatre colonnes de l'ancienne clef en contrainte UNIQUE si besoin est
    b) à utiliser un index non clustured (solution moins satisfaisante à mon gout.

    2) effectivement rajouter un index sur la date pour que lors de la suppression SQL Server trouve direcetment le point d'entrée.

    3) si des index secondaires (donc non sémantique) existe, les supprimer préalablement à la suppression et les remettre après la suppression.

    Avec cela vous devriez diminuer d'une facteur de 2 à 10 les temps d'exécution.

    A +

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    Bonjour,
    j'ai bien pensé à ajouter un identifiant autoincrémenté, mais même si je le défini comme un entier de grande précision (BIGINT) comment faire pour qu'il ne se bloque pas à sa valeur maximum (après quelques mois de fonctionnement), et recycle les valeurs d'index qui ont été supprimées ?

    Est ce que le type "uniqueidentifier" peut faire l'affaire ?

    Merci

  6. #6
    Membre éprouvé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2006
    Messages
    730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

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

    Informations forums :
    Inscription : Août 2006
    Messages : 730
    Points : 923
    Points
    923
    Par défaut
    bigint va jusqu'a 2 puissance 63 en + et - soit de

    -9223372036854775808 a +9223372036854775807

    soit en gros des milliards de milliards de milliards de lignes, si t'arrive au max ton disque du serveur aura explosé avant

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    après quelques calculs,
    j'ai besoin de 200 000 lignes par jour, soit 1 milliard 480 millions de lignes pour 20 ans.

    merci à tous pour vos réponses.

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 902
    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 902
    Points : 53 143
    Points
    53 143
    Billets dans le blog
    6
    Par défaut
    Donc un INT est largement suffisant car capable de couvrir 4 milliard de ligne soit 54 ans !
    Avec un BIGINT, tu peut mourrir tranquille la limite sera dans : 231 928 234 millénaires...

    A +

Discussions similaires

  1. Problème lecture de tables avec données type Oui/non
    Par Alixe80 dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 20/04/2008, 17h44
  2. [Debutant] Recherche sur table avec donnée incomplète
    Par dahu17 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 26/06/2007, 17h00
  3. Réponses: 14
    Dernier message: 05/09/2006, 17h01
  4. Réponses: 2
    Dernier message: 11/01/2006, 11h54
  5. Tables avec données temporelles
    Par blins dans le forum Oracle
    Réponses: 12
    Dernier message: 12/12/2005, 09h50

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