Précédent   Forum des professionnels en informatique > Bases de données > Décisions SGBD > Optimisations
Optimisations Forum de conseils pour les optimisations des performances SGBD
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 21/09/2006, 17h01   #1
Membre éprouvé
 
Avatar de WebPac
 
Inscription : mai 2004
Messages : 919
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 919
Points : 410
Points : 410
Par défaut Quand créer les index ?

Bonjour tout le monde.

Depuis fort longtemps, je pratique ainsi : je crée la table et les champs, je crée les index, puis j'insère l'ensemble des données. Ainsi elles sont indexées.

J'ai entendu dire qu'il valait mieux créer les index après avoir inséré les données, car ainsi l'insertion est beaucoup plus rapide.
Mais je me pose une question, si on crée les index après l'insertion, est-ce que les données sont bien indexées ?

Merci pour vos éclairsissements sur la question.
WebPac est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 21/09/2006, 18h31   #2
Xo
Expert Confirmé
 
Avatar de Xo
 
Inscription : janvier 2005
Messages : 2 701
Détails du profil
Informations personnelles :
Âge : 38

Informations forums :
Inscription : janvier 2005
Messages : 2 701
Points : 3 237
Points : 3 237
Envoyer un message via Skype™ à Xo
Effectivement, un index accelère la lecture (si la clause WHERE de la requête porte sur un index), mais ralentit un peu l'insertion.

Dans la plupart des applicatifs, les index sont gérés soit dès la conception, soit après coup si l'on s'aperçoit qu'ils sont utiles : mais on attend pas d'avoir "toutes" les données avant de les créer, c'est pourquoi je me demande quel est ton cas de figure, pour insérer les données (massivement, j'imagine) avant de les indexer ?

En tout cas, je pense pouvoir affirmer sans trop dire de bêtises qu'un index est pleinement "fonctionnel" dès sa création.

Un petit complément : Les index
__________________
"Ce que l'on conçoit bien s'énonce clairement,
Et les mots pour le dire arrivent aisément." Nicolas Boileau

"Expliquer empêche de comprendre si cela dispense de chercher"

Quiz Oracle : venez tester vos connaissances !

La FAQ Oracle : 138 réponses à vos questions
Aidez-nous à la compléter
Xo est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 21/09/2006, 18h59   #3
Membre éprouvé
 
Avatar de WebPac
 
Inscription : mai 2004
Messages : 919
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 919
Points : 410
Points : 410
Voici les précisions que j'aurrais dû donner dès le départ :
* C'est moi-même qui crée les tables et les index.
* Il n'y a pas de clé primaire dans les tables.
* Lorsque je crée la table, de suite après, je fais une insertion massive de données.
* Après l'insertion massive de données, il n'y plus d'autre insertion de données.
* Après l'insertion massive de données, la table est uniquement utilisée en lecture seule (juste des SELECT).

La création des index permet d'optimiser les temps de requêtage sur la table, il n'y a pas de soucis sur ce point là.
Mon problème est le temps d'insertion des données, qui peut suivant le cas dépasser plusieurs heures (plusieurs millions d'enregistrement voire plusieurs dizaines de millions).

C'est pourquoi, je voudrais savoir si je dois créer les index avant l'insertion des données afin qu'ils soient opérationnels lors des requêtages ou est-il possible de ne les créer qu'après l'insertion des données afin d'optimiser l'insertion ?

En fait, je me demande si la création des index après insertion des données rend le requêtage sur la table aussi rapide que si on les crée au tout début.
WebPac est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 21/09/2006, 23h45   #4
Expert Confirmé

 
Homme Philippe Makowski
Consultant spécialité Firebird
Inscription : mai 2002
Messages : 2 215
Détails du profil
Informations personnelles :
Nom : Homme Philippe Makowski
Âge : 49
Localisation : France

Informations professionnelles :
Activité : Consultant spécialité Firebird
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 2 215
Points : 3 318
Points : 3 318
Citation:
Envoyé par WebPac
En fait, je me demande si la création des index après insertion des données rend le requêtage sur la table aussi rapide que si on les crée au tout début.
normalement oui, ou alors change de SGBD
__________________
Philippe Makowski
IBPhoenix - Firebird
Membre de l'April
makowski est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 22/09/2006, 08h20   #5
Membre éprouvé
 
Avatar de WebPac
 
Inscription : mai 2004
Messages : 919
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 919
Points : 410
Points : 410
Citation:
Envoyé par makowski
normalement oui, ou alors change de SGBD
Merci pour la réponse. Et pour info, j'ai pas de SGBD atitré, ça peut être Firebird, SQL Serveur, Oracle ou MySQL, c'est l'utilisateur qui le choisit.
WebPac est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/09/2006, 08h26   #6
Responsable WinDev
 
Avatar de Emmanuel Lecoester
 
Emmanuel Lecoester
Inscription : février 2003
Messages : 1 383
Détails du profil
Informations personnelles :
Nom : Emmanuel Lecoester
Âge : 36
Localisation : France, Nord (Nord Pas de Calais)

Informations forums :
Inscription : février 2003
Messages : 1 383
Points : 2 407
Points : 2 407
Envoyer un message via MSN à Emmanuel Lecoester Envoyer un message via Skype™ à Emmanuel Lecoester
Si tu parles d'une inseration massive de données, il vaut mieux utiliser les loader de chaque base (sql loader pour Oracle) qui sont bien plus rapide que des inserts.

Ensuite c'est vrai qu'avec des millions de lignes on désactivait l'index, on insérait les données et on faisait un rebuild de l'index.

Autre point intersssant : si ton fichier en entrée est trié sur la PK de ta table çà aide.
__________________
Emmanuel Lecoester
=> On recrute des rédacteurs WinDev
Emmanuel Lecoester est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 22/09/2006, 08h30   #7
Membre éprouvé
 
Avatar de WebPac
 
Inscription : mai 2004
Messages : 919
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 919
Points : 410
Points : 410
Citation:
Envoyé par elecoest
Si tu parles d'une inseration massive de données, il vaut mieux utiliser les loader de chaque base (sql loader pour Oracle) qui sont bien plus rapide que des inserts.

Ensuite c'est vrai qu'avec des millions de lignes on désactivait l'index, on insérait les données et on faisait un rebuild de l'index.

Autre point intersssant : si ton fichier en entrée est trié sur la PK de ta table çà aide.
Oui, à terme, je compte utiliser les procédures des bases de données, mais ça demande du développement spécifique pour chaque base, donc pas à l'ordre du jour.

Merci pour l'info sur les clés primaires, c'est pas bête. Je vais voir ce que je vais pouvoir faire.
WebPac est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 11/03/2009, 14h18   #8
Membre habitué
 
Inscription : mars 2009
Messages : 112
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 112
Points : 102
Points : 102
Bonjour,

vous êtes sûr de votre coup ?
Il y a une dizaine d'années, c'est effectivement ce que j'avais fait (load sans index puis creation de l'index), mais j'ai lu qu'aujourd'hui c'était une connerie (du moins sur DB2), en gros temps(load sans index) + temps(rebuild) > temps (load avec index), autrement dit le temps qu'on gagne au load est perdu au rebuild.
Par contre, si on a plusieurs index, il vaut mieux effectivement les créer par la suite.

Y a t il des tests en ligne sur ce type de chargement (j'ai plusieurs milliards de lignes à charger) et pour le moment ça rame sec (estimation 6 jours pour le load) ?
Quand je vois que l'extraction du VSAM se fait en 1 heure, ça craint.
keskidi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/03/2009, 10h25   #9
Membre éprouvé
 
Avatar de WebPac
 
Inscription : mai 2004
Messages : 919
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 919
Points : 410
Points : 410
Salut,

à l'époque, j'avais fait des tests de performance en interne sur Firebird et peut-être sur Oracle, SQL Serveur ou MySQL et les temps étaient meilleurs en indexant après le load.

Je n'avais pas trouvé de document sur le net qui expliquait la théorie ou le principe de fonctionnement sur le sujet qui donnerait les bonnes pratiques, donc les décisions se sont basées sur des données empiriques et non théoriques.

Si tu trouves de nouveaux éléments, je suis preneur.
WebPac est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/03/2009, 17h05   #10
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 959
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 959
Points : 17 791
Points : 17 791
Lisez l'article que j'ai écrit à ce sujet :
http://sqlpro.developpez.com/cours/s...ivation-index/

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 12/03/2009, 17h34   #11
Membre habitué
 
Inscription : mars 2009
Messages : 112
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 112
Points : 102
Points : 102
Citation:
Envoyé par SQLpro Voir le message
Lisez l'article que j'ai écrit à ce sujet :
http://sqlpro.developpez.com/cours/s...ivation-index/

A +
C'est bien ce qu'il me semblait, désactiver les primary key ne sert pas à grand chose, bon bien sûr, DB2 sur MVS, c'est surement pas Microsoft sql.
Donc en gros, prendre la table pour soi tout seul, débrancher le journal, supprimer les index, charger dans l'ordre des clés primaires et attendre - faudrait voir aussi du côté du freespace, je pense.
En gros, faut tester ...
keskidi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/03/2009, 23h40   #12
Membre éprouvé
 
Avatar de WebPac
 
Inscription : mai 2004
Messages : 919
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 919
Points : 410
Points : 410
Le problème est le nombre d'intermédiaires et non uniquement un problème d'index.

En effet, je me doute que tu as dû coder une application qui réalise un outil d'ETLs, elle fait donc une requête sur une base source et un insert dans une autre base.
Les données doivent donc sortir de la première base, entrer dans ton application, être transformées et traitées puis envoyées dans la base destination.

Cela fait beaucoup d'intermédiaires qui font que les temps ne seront jamais comparables à ce que fera une base de données qui travaillera seule en elle-même avec moins d'intermédiaire et du code plus natif.

Mon application arrive en vitesse de pointe à insérer les données à 4000 lignes/seconde, ce qui donne des valeurs comme toi, cad en théorie 5 jours pour 2 milliards d'enregistrement (jamais réalisé, le plus gros utilisateur ne dépasse pas les 60 millions d'enregistrement).
Il paraît qu'un utilisateur avec une machine ad hoc a réussi à dépasser les 8000 lignes/seconde, mais je ne l'ai pas vu par moi-même pour le constater.

Une autre voix de recherche peut aussi être le commit, cad, ne pas faire de commit automatique mais n'en faire que tous les 1000 enregistrements par exemple ou moins souvent.

Sinon, il faut essayer de déporter ce travail au niveau de la base de données destination, que ce soit elle qui requête et insère les données, ça te permettra de zapper des intermédiaires.

Bon courage en tout cas.
WebPac est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/03/2009, 09h14   #13
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 031
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 031
Points : 18 336
Points : 18 336
Envoyer un message via MSN à CinePhil
Pour en revenir à la question de départ :
Citation:
Envoyé par WebPac Voir le message
J'ai entendu dire qu'il valait mieux créer les index après avoir inséré les données, car ainsi l'insertion est beaucoup plus rapide.
Mais je me pose une question, si on crée les index après l'insertion, est-ce que les données sont bien indexées ?
Évidemment oui !

Voir dans cette partie de discussion l'explication de fsmrel sur la manière dont sont construits les index (dans DB2 mais ça doit être similaire dans les autres SGBD).

Un truc simple à retenir :
Les données d'une table ne sont pas triées au fur et à mesure où elles sont insérées. Seuls les index permettent de faire des tris et des recherches efficaces.

Après, vous gagnerez peut-être quelques micro-secondes par ci par là si vos données se retrouvent physiquement stockées sur le disque dans un certain ordonnancement mais ce que vous gagnerez sur une requête par la lecture de moins de pages sera peut-être perdu par une autre qui demandera les données triées sur un critère différent.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/03/2009, 17h13   #14
Membre habitué
 
Inscription : mars 2009
Messages : 112
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 112
Points : 102
Points : 102
Citation:
Envoyé par WebPac Voir le message
En effet, je me doute que tu as dû coder une application qui réalise un outil d'ETLs, elle fait donc une requête sur une base source et un insert dans une autre base.
Les données doivent donc sortir de la première base, entrer dans ton application, être transformées et traitées puis envoyées dans la base destination.
C'est pas vraiment ça, j'ai une base actuelle en KSDS VSAM, et demain je veux qu'elle soit en DB2, même données, même applicatifs, mais avec la possibilité d'utiliser des outils de requêtes user-friendly, l'extraction VSAM est très rapide, mais le chargement DB2 très lent (en comparaison de KSDS => fichier LOAD), étant donné les volumes, toutes les options sont bonnes à prendre, j'épluche un max de doc, mais pour le moment, je ne trouve pas vraiment d'informations plus pertinentes que ce qui est fait à l'heure actuelle.
keskidi est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h54.


 
 
 
 
Partenaires

Hébergement Web