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 :

Update sur grosse volumétrie


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Architecte technique
    Inscrit en
    Février 2004
    Messages
    477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 477
    Par défaut Update sur grosse volumétrie
    Bonjour à tous,

    Je dois faire l'update d'une table et j'ai quelques soucis de performance, cela fait déja 8h que mon script tourne et c'est toujours pas fini.

    Pour info:
    - La table contient plusieurs dizaines de millions de données, partitionnée avec une notion de date.
    - Mon update est bien structuré avec une clause Where. C'est un update, tout ce qu'il y a de plus basique.
    - La table est convenablement indexée et ne possède aucun trigger.
    - Par contre sur ma table, j'ai une douzaine de vue qui pointent dessus.

    Questions:
    - J'ai lu dans certains forums, qu'il faudrait désactiver les index, et ensuite les reconstruire. Qu'en pensez vous ? Est ce que je vais vraiment gagner en temps ?
    - Est ce qu'il faut que je dissocie mes vues et le recrée après mon update ?

    Merci pour vos avis.

  2. #2
    Membre Expert
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    968
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 968
    Par défaut
    bonsoir Pfeffer,

    La restriction
    1- porte sur quel % de la volumétrie (à la louche) ?
    2- porte au moins en partie sur l'information de partition ?

    Le temps d'acquisition des verrous peut être long (8 heures c'est un peu beaucoup) car les select, même par le biais des vues posent des verrous, à moins d'utiliser le niveau d'isolation SNAPSHOT.
    Que disent les compteurs de performances à ce propos ?
    Toutes les partitions sont libres ?

    Pour les bonnes pratiques : tout dépend du % de lignes mises à jour.
    Si on modifie 1 ligne, il va de soit qu'on ne touche pas aux contraintes - de check -de FK (- d'unicité aussi mais c'est plus complexe sous SQL server de ne pas perdre l'index)

    En tous les cas, supprimer un index pour faire un chargement/une modification doit bien s'évaluer : si vous mettez 8 heures pour faire un update restreint, il vous faudra combien de temps pour relire toutes les lignes, trier les valeurs afin de pouvoir construire l'index supprimé ?

    Je veux bien entendre qu'après une modification massive il faille reconstruire (rebuild) les index mais les scénarios pour lesquels la suppression de l'index suivi de sa reconstruction est la solution gagnante ne sont pas nombreux.

    Faut pas toujours croire ce qu'on trouve sur internet

  3. #3
    Membre éclairé
    Homme Profil pro
    Architecte technique
    Inscrit en
    Février 2004
    Messages
    477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 477
    Par défaut
    Bonjour,

    Je partage totalement votre avis sur la question des index.
    Le REBUILD risque de prendre beaucoup de temps et je n'aurai rien gagné.

    1- porte sur quel % de la volumétrie (à la louche) ?
    L'update porte sur une partition qui contient 471.693.339 lignes.

    2- porte au moins en partie sur l'information de partition ?
    Oui je retrouve bien la notion de "date" dans mon Where, la même que celle que j'utilise pour créer ma partition

    Le temps d'acquisition des verrous peut être long (8 heures c'est un peu beaucoup) car les select, même par le biais des vues posent des verrous, à moins d'utiliser le niveau d'isolation SNAPSHOT.
    Que disent les compteurs de performances à ce propos ?
    Toutes les partitions sont libres ?
    De quels compteur de performances parle-t-on ?
    Vous entendez quoi par partition libre ?

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Bonjour,

    concernant les vues, si elles sont indexées, alors même remarque que ci-dessus pour les indexes (comparer le cout suppression/reconstruction d'index par rapport au surcout de mise à jour avec index)

    si elle ne sont pas indexées : aucun impact sur la mise à jour, donc on peut les laisser.

    Peut-on avoir la structure de la table (avec indexes) ainsi que la requête UPDATE ?

    Avez-vous vérifié qu'il ne s'agit pas simplement de verrous posés sur les données à mettre à jour ?

  5. #5
    Membre éclairé
    Homme Profil pro
    Architecte technique
    Inscrit en
    Février 2004
    Messages
    477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 477
    Par défaut
    Nom : columns.png
Affichages : 844
Taille : 27,5 Ko
    Nom : index.png
Affichages : 823
Taille : 22,3 Ko
    Nom : partition.png
Affichages : 849
Taille : 50,2 Ko


    Voici la structure de ma table, avec les index et les partitions.
    Et voici un exemple d'update chronophage.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    UPDATE gtm_crb_consolide_pt10
          SET puissance_arenh = NULL
        WHERE year (dateadd (minute, -10, crb.datepoint)) = @iYear

  6. #6
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    votre clause WHERE empêche l'utilisation d'indexes telle qu'elle est écrite.

    Il faudrait la réécrire de telle sorte à ne pas faire de calcul sur la colonne datepoint

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    WHERE datepoint >= @debut
    AND datepoint <@fin
    L'update porte sur une partition qui contient 471.693.339 lignes
    Combien de lignes remplissent la condition year (dateadd (minute, -10, crb.datepoint)) = @iYear.

    Comme vous ne mettez à jour que la colonne puissance_arenh, seuls les indexes contenant cette colonne sont éventuellement à désactiver le temps de la mise à jour.

  7. #7
    Membre Expert
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    968
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 968
    Par défaut
    Remarques sur le partitionnement :

    1- Partitionnement sur date
    En général c'est fait pour avoir un stockage "rotatif" sur un nombre de périodes glissantes constant.
    Dans ce cas il convient que les index soient "alignés".

    2- Nombre de partitions
    Selon la version de SQL le nombre maximum évolue.
    Faire des partitions plus "serrées" que le besoin "normal" (ici, le besoin : l'année, partitionnement au mois voire à la semaine) permet de bénéficier de méthodes d'accès concurrentielles (plus ou moins drastique en fonction de la version et de l'édition ; reste une bonne pratique)

    3- Le stockage des partitions
    Il est recommandé de ne pas utiliser PRIMARY pour les données utilisateur.
    Il est recommandé d'allouer différents groupes de fichiers pour les partitions

  8. #8
    Membre éclairé
    Homme Profil pro
    Architecte technique
    Inscrit en
    Février 2004
    Messages
    477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 477
    Par défaut
    Que pensez vs de créer un index sur l'année en faisant:
    Create index year_index on year(datepoint)

  9. #9
    Membre Expert
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    968
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 968
    Par défaut
    Citation Envoyé par Pfeffer Voir le message
    Create index year_index on year(datepoint)
    Quel est l'intérêt ?
    Est-ce que l'index est réellement ignoré pour vos traitement (voir le plan d’exécution) ?

    Le fait d'ajouter un index va pénaliser les écritures et ajouter du volume à backuper.
    La colonne datepoint est déjà indexée
    Est-que la solution de aieeeuuuuu n'est réellement pas envisageable ?

    Ce qui me gène par rapport à la requête et face au partitionnement, c'est la soustraction de 10 minutes.
    Potentiellement ça ramène des lignes de début 2019 en 2018, du coup ça oblige à parcourir les 2 partitions et vu qu'à elles 2 elles représentent 80% du nombre de lignes... ça peut être long !

    Encore une fois si vous pouvez faire quelque chose, il me semble important -a minima- de revoir la stratégie de partitionnement (groupes de fichiers & nombre de partition & alignement des index sur ces mêmes partitions).
    Selon la version et l'édition de SQL et des contraintes associées voir si le columnstore est envisageable, et sinon, étudier si la compression peut être utile.

  10. #10
    Membre éclairé
    Homme Profil pro
    Architecte technique
    Inscrit en
    Février 2004
    Messages
    477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 477
    Par défaut
    Alors plusieurs plans d'action que j'envisage dès ce lundi:

    - Revoir le schéma de partition pour éventuellement passer sur une granularité mensuelle. 12 partions par année, sachant qu'on aura au max 5 ans glissantes, donc 60 partitions. Est ce qu'un schéma ça se change facilement ? Sur une table de 70Go ?

    - Ajouter des filegroups supplémentaires, quelle strategie adoptée ? 1 filegroup pour les données de M-12 jusqu'à M+x et un filegroup avec les données archivees beaucoup moins sollicitées, réparties physiquement sur 2 disque dur différents.

    - Eviter le year() dans mes WHERE et vérifier mes plans d'exécution

  11. #11
    Membre Expert
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    968
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 968
    Par défaut
    Bonsoir,
    Citation Envoyé par Pfeffer Voir le message
    Alors plusieurs plans d'action que j'envisage dès ce lundi:

    - Revoir le schéma de partition pour éventuellement passer sur une granularité mensuelle. 12 partions par année, sachant qu'on aura au max 5 ans glissantes, donc 60 partitions. Est ce qu'un schéma ça se change facilement ? Sur une table de 70Go ?
    Faire ça sur un serveur de qualification et extrapoler pour le serveur de production.
    Trop de facteurs influent sur la rapidité.
    Prévoir une fenêtre de maintenance.

    J'insiste lourdement :
    1- Aligner tous les index
    2- Si la version le permet, utiliser la compression de données.

    Citation Envoyé par Pfeffer Voir le message
    - Ajouter des filegroups supplémentaires, quelle strategie adoptée ? 1 filegroup pour les données de M-12 jusqu'à M+x et un filegroup avec les données archivees beaucoup moins sollicitées, réparties physiquement sur 2 disque dur différents.
    1- créer 1 FG qui sera le nouveau FG par défaut (et ainsi ne plus utiliser PRIMARY)
    2- créer un minimum de 60 FG, 1 par partition. PAS de migration de lignes d'un FG à l'autre.
    3- La conversation du nombre de fichiers est dépendante de sous système disque (DAS, NAS, SAN, ...) et de ce qu'on peut en espérer.
    Un script sera le bien venu.
    Encore une fois les tests des scripts ne se font pas sur le serveur de production.

    Citation Envoyé par Pfeffer Voir le message
    - Eviter le year() dans mes WHERE et vérifier mes plans d'exécution
    De manière générale, vérifier les plans d'execution

  12. #12
    Membre Expert
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    968
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 968
    Par défaut
    Bonsoir,

    Un petit tour sur la doc me semble important :
    index aligné : https://docs.microsoft.com/fr-fr/sql...#aligned-index

    Le stockage des index rentre dans la conversation des périodes glissantes.
    Si vous maintenez 20 mois de données, vous avez 2 choix :
    - tous les jours faire migrer les lignes d'une partition à une autre (pas bien rapide tout ça) et pour le lignes qui dépassent la période DELETE
    - à chaque période (schedule) on crée une nouvelle partition et on supprime l'ancienne (beaucoup mieux)

    Le scénario conseillé est le 2ieme.
    Du coup la table est un sorte d'assemblage de lot de lignes. En fin de période on supprime le lot (et non pas les lignes) c'est super rapide !
    MAIS si les index ne sont pas alignés on perd une grosse partie du bénéfice.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Tri sur grosses volumétries
    Par crashtib dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 10/06/2009, 10h18
  2. Grosses volumétries sur sqlserver
    Par genio dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 31/08/2007, 12h33
  3. Pbleme UPDATE sur POSTGRESQL
    Par $grm$ dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 26/04/2004, 14h50
  4. [Crystal] Performance sur grosses base de données
    Par Nico118 dans le forum SAP Crystal Reports
    Réponses: 5
    Dernier message: 14/11/2003, 15h27
  5. update sur plusieurs nouvelles valeurs
    Par Mut dans le forum Langage SQL
    Réponses: 4
    Dernier message: 02/11/2003, 16h15

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