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éveloppement SQL Server Discussion :

Amélioration performance d'insertion


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    SQL Server
    Inscrit en
    Juin 2010
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : SQL Server
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2010
    Messages : 43
    Par défaut Amélioration performance d'insertion
    Bonjour à tous.
    Domaine : base de données analytiques
    SGBD : SQL Server 2005 et SQL Server 2008 (mais si la solution trouvé est que pour 2008 ça m'ira)
    Voici mon objectif :
    Insérer de nombreuses lignes (Plusieurs millions) dans une table existante le plus rapidement possible.

    Option :
    en acceptant les insertion concurrente et les accès concurrent à la table via un select (update et delete non utilisé). Sachant qu'on ne peut pas essayer d'inserer deux fois la meme chose (normal car y a la PK) et on ne peut pas essayer de sélectionner des datas qui sont en train d'être insérées.

    Table dans laquelle inserer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Create table maTableDest
    (
    Champ1 int not null,
    Champ2 int not null,
    Champ3 int not null,
    Champ4 int not null
    )
     
    PRIMARY KEY CLUSTERED 
    (
    	[Champ1] ASC,
    	[Champ2] ASC,
    	[Champ3] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    Stats de l'index a jour quotidiennement
    Fragmentation de l'index : 0 %

    Genre de requete pour inserer les donner
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Insert into maTableDest
    Select distinct 'valeur en dur' as Champ1
    ,C2 as Champ2 
    ,C3 as Champ3
    ,C4 as Champ4
    FROM uneTable with(nolock)
    INNER JOIN ....
    WHERE ....
    Ce que j'ai essayé :
    Insert into maTableDest with(tablock)
    Select distinct 'valeur en dur' as Champ1
    ,C2 as Champ2
    ,C3 as Champ3
    ,C4 as Champ4
    FROM uneTable with(nolock)
    INNER JOIN ....
    WHERE ....

    L'avantage du tablock est que j'augmente de façon importante la vitesse d'insertion (2x plus rapide et l'impact est de plus en plus important avec la volumétrie), les performances sont équivalentes a une insertion dans une table temporaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Select distinct 'valeur en dur' as Champ1
    ,C2 as Champ2 
    ,C3 as Champ3
    ,C4 as Champ4
    INTO #Temp
    FROM uneTable with(nolock)
    INNER JOIN ....
    WHERE ....
    Mais les accès concurrents sont lockés avec le tablock (c'est le principe d'un côté).

    De plus si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select *
    from maTableDest with(nolock)
    where ...
    Avec en parallèle, une insertion (lancée en 2eme), l'insertion est locké et la les temps explosent :
    3 fois plus de temps que si l'insertion était seul. Je me dit que ça vient du fait que le select
    pose des lock sur les lignes, requete et enlève les locks (1 à 1 car par ligne)
    Je me demandé si le fait d'augmenté la granularité des lock (locké au niveau page voir table) au
    lieu de row pouvait être interessant.

    J'ai testé le paramètre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RECOVERY à BULK_LOGGED
    qui permet de limité l'écriture de log lors
    d'insertion notamment mais l'impact n'est pas présent.
    Effectivement, il me semble qu'il faut que la table soit vide pour que le bulk-logged soit vraiment
    utilisé. A moins que je me sois trompé dans mon paramètrage.

    Donc avez vous d'autres pistes ?

  2. #2
    Membre éclairé
    Homme Profil pro
    SQL Server
    Inscrit en
    Juin 2010
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : SQL Server
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2010
    Messages : 43
    Par défaut
    Aucune piste a suggérer ?

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 998
    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 998
    Billets dans le blog
    6
    Par défaut
    1) tailler les storages (fichiers) de façon suffisament grande pour 3 à 5 ans d'eploitation
    2) multiplier le nombre de fichier de données sur des disques physiques afin de répartir les IO
    3) multiplexer le journal de transaction en utilisant du RAID 10 sur 4, 6 ou 8 disques
    4) saucissoner vos transactions, en utilisant si possible des blocs de 64 Ko de data
    5) éventuellement partitionner votre table sur une colonne critère

    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/ * * * * *

  4. #4
    Membre éclairé
    Homme Profil pro
    SQL Server
    Inscrit en
    Juin 2010
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : SQL Server
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2010
    Messages : 43
    Par défaut
    Très interessant tous ça.
    Je essayer de me document sur les avantages et inconvénient de ce que vous venez de souligner et surtout trouver comment mettre ça en place.

  5. #5
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    En sus de ce que dit SQLPro,

    Vous pouvez également voir du côté d'une iinfrastructure SSIS qui permet de charger rapidement les données.

    Je sais également qu'avec la version 2008 il est possible d'utiliser le Trace Flag 610 pour pouvoir journaliser au minimum une table déjà remplie avec un index cluster ... (Je n'ai jamais testé personnellement)

    ++

  6. #6
    Membre éclairé
    Homme Profil pro
    SQL Server
    Inscrit en
    Juin 2010
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : SQL Server
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2010
    Messages : 43
    Par défaut
    J'ai essayé le Trace Flag pour éviter un minimum l'écriture de Log en cas d'insertion mais je n'ai vu aucune différence, cela vient peut être aussi d'une mauvaise configuration de la base ou server.

    Pour information, je teste dans un environnement vierge, aucune requête extérieur ne perturbe mes tests.

  7. #7
    Membre éclairé
    Homme Profil pro
    SQL Server
    Inscrit en
    Juin 2010
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : SQL Server
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2010
    Messages : 43
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    1) tailler les storages (fichiers) de façon suffisament grande pour 3 à 5 ans d'eploitation
    2) multiplier le nombre de fichier de données sur des disques physiques afin de répartir les IO
    3) multiplexer le journal de transaction en utilisant du RAID 10 sur 4, 6 ou 8 disques
    4) saucissoner vos transactions, en utilisant si possible des blocs de 64 Ko de data
    5) éventuellement partitionner votre table sur une colonne critère

    A +
    Ca m'a bien servi merci.

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

Discussions similaires

  1. Performances d'insertion dans une procédure
    Par f-demu01 dans le forum PL/SQL
    Réponses: 25
    Dernier message: 29/10/2008, 16h40
  2. access amélioration performance ouverture
    Par estebandelago dans le forum Access
    Réponses: 2
    Dernier message: 05/03/2007, 14h48
  3. [MySQL] Amélioration performance requête
    Par lodan dans le forum PHP & Base de données
    Réponses: 15
    Dernier message: 15/01/2007, 09h06
  4. Quel SGBD pour de bonnes performances en Insert ?
    Par arthix dans le forum Décisions SGBD
    Réponses: 13
    Dernier message: 03/05/2006, 17h48
  5. performance delete/insert vs update
    Par Dionisos dans le forum Langage SQL
    Réponses: 6
    Dernier message: 01/08/2005, 18h23

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