|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Membre éclairé
![]() Inscription : avril 2009 Messages : 523 ![]() |
bonjour,
j'ai une table avec un shéma très simpe : Citation:
Citation:
il ya dans la table 700000 enregistrement à supprimer. La table fait 56M, l'index 13M alors que le serveur est puissant et à 2go de mémoire. où est le problème ? si ça peut aider, voilà quelques infos durant le process : ![]() ![]() ![]()
|
||
|
|
00
|
|
|
#2 |
![]() ![]() Inscription : octobre 2008 Messages : 1 508 ![]() |
Que dit l'EXPLAIN de la requête?
|
|
|
00
|
|
|
#3 |
|
Membre éclairé
![]() Inscription : avril 2009 Messages : 523 ![]() |
|
|
|
00
|
|
|
#4 |
![]() ![]() Inscription : octobre 2008 Messages : 1 508 ![]() |
c'est pourquoi il faut faire EXPLAIN delete... et non EXPLAIN ANALYZE delete...
|
|
|
00
|
|
|
#5 |
![]() ![]() Inscription : octobre 2008 Messages : 1 508 ![]() |
Est-ce qu'il y a des clefs étrangères qui pointent vers la table dont les lignes sont supprimées par la requête?
|
|
|
00
|
|
|
#6 |
|
Membre Expert
![]() Inscription : juin 2007 Messages : 1 497 ![]() |
Comme le dit estofilo, regarde l'explain de ta requête, si ça se trouve il fait un index range scan sur un index inapproprié
Peut-être aussi as-tu trop d'indexes sur cette table, dans ce cas la suppression de lignes est longue car doit aussi mettre à jour les indexes
__________________
La théorie, c'est quand on sait tout mais que rien ne fonctionne. La pratique, c'est quand tout fonctionne mais que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique : Rien ne fonctionne ... et personne ne sait pourquoi ! Réplication de base avec Postgresql : http://scheu.developpez.com/tutoriel.../log-shipping/ |
|
|
00
|
|
|
#7 | |
|
Membre éclairé
![]() Inscription : avril 2009 Messages : 523 ![]() |
bonjour,
j'ai fait un explain mais pour 50 éléments, voiçi le résultat (ça dure 30s sans le analyse) : Citation:
ps : j'ai regardé la doc, mais ya pas moyen de ajouter une clause LIMIT dans le delete ? je voudrais les supprimer 10 par 10 chaque minute. |
|
|
|
00
|
|
|
#8 |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 954 ![]() |
1) rien ne vous empêche de calculer un nombre approximatif de DELETE en jouant sur l'auto incrément. Il n'y a pas de LIMIT avec PostGreSQL pour la mise à jour.
2) tentez un index en hash sur (res_type, wkf_id ) 3) si vous faites vos DELETE aux heures creuses, une technique consiste à :
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 * * * * * |
|
00
|
|
|
#9 |
![]() ![]() Inscription : octobre 2008 Messages : 1 508 ![]() |
A propos du temps d'exécution, si on synthétise les infos de la discussion:
- 700000 lignes à effacer dans une table wkf_instance - 5 tables référencent wkf_instance en clef étrangère - une clause ON DELETE SET NULL sur des tables qui référencent wkf_instance Pour chaque ligne à effaçer, postgres doit lancer en interne 5 recherches dans les tables "fille" et pour chaque ligne trouvée dans ces tables, faire un UPDATE d'une colonne à NULL. Ca représente donc 700k*5 = 3,5 millions de requêtes SELECT + un nombre de requêtes UPDATE supposément de même ordre de grandeur, ce qui explique pourquoi c'est lent. |
|
|
00
|
|
|
#10 | |||
![]() ![]() Inscription : octobre 2008 Messages : 1 508 ![]() |
Citation:
Code :
|
|||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com