J'ai une énorme table avec 6 milliards de lignes.
Ma commande Supprimer ressemble à quelque chose comme ci-dessous p> Ceci fonctionne trop lent, même si j'ai l'index HG sur les deux col1 et col2. p> Nous sommes en mesure de supprimer environ 100 000 lignes en 15 minutes. P> Toute suggestion Comment puis-je améliorer les performances de suppression. P> sera un composite Index (COL1, COL2) Aide? P> P>
3 Réponses :
La condition répétée ou la condition produise des performances lentes Vous pouvez essayer d'améliorer les performances en évitant l'utilisation de plusieurs ou de la clause de cette
TF, vous pouvez stocker les paires Pour Sybase, la syntaxe de jointe de suppression doit être la suivante: p> Assurez-vous d'avoir également un index composite sur [Nom de la table] (COL1, COL2). p> p> (valeur1, valeur2), (valeur3, valeur4) ,. .. (valuen, valuen + 1) code> dans une table
table temp_table cola, colb code> avec index composite sur
cola, colb code> Vous pouvez essayer d'utiliser Suppr avec une jointure intérieure P>
Tout d'abord, vous utilisez Deuxièmement, davantage d'index ralentiront l'exécution de la commande DELETE.
temps. p> li>
troisièmement, votre table est trop énorme, vous devez l'optimiser en la divisant
par date ou autre symbole. P> li>
Donc, si vous souhaitez utiliser l'index, vous devez être nécessaire pour exécuter la commande Supprimer quelques fois à quelques reprises en divisant ou en utilisant l'index. P> PS: Utilisez l'index composite (COL1, COL2) sera plus rapide. p> et si votre dossier que vous voulez n'est pas beaucoup. p> Voir: http://dev.mysql.com/doc/refman/5.0/fr/delete.html P> Si vous supprimez de nombreuses lignes d'une grande table, vous pouvez dépasser la taille de la table de verrouillage pour une table InnoDB. Pour éviter ce problème, ou simplement pour minimiser le temps que le tableau reste verrouillé, la stratégie suivante (qui n'utilise pas du tout) peut être utile: p>
blockQuote> ou code> dans votre état, Innodb n'utilisera pas
index. p> li>
Les suppressions sont chères. 100k rangées en 15 minutes est d'environ 111 rangées par seconde. Ce n'est pas nécessairement mauvais, selon de nombreux facteurs, que vous n'expliquez pas dans votre question: p>
Supprimer code> déclencheurs? LI>
ul>
Supprimer code> est une opération coûteuse. En plus des travaux spécifiques nécessaires au code> Supprimer code>, les lignes / pages doivent être verrouillées et les résultats doivent être enregistrés. P>
Il n'est pas clair que trouver em> les lignes est la cause de ce que vous voyez comme un problème de performance. Et trouver les lignes est ce que les indices vont aider. Bien sûr, il pourrait être em> être le problème. Mais ce n'est pas évident. P>
Dans de nombreuses bases de données, les suppressions massives sont si lentes qu'il est plus rapide de recréer la table sans les rangées souhaitées. C'est-à-dire que cette séquence peut être beaucoup plus rapide: p>
- Créez une nouvelle table filtrant les lignes à l'aide de
où code>. li>
- Tronquez la table d'origine (faites d'abord une copie de sauvegarde!). Li>
- réinsérez les données dans le tableau. LI>
ul>
Comment obtenez-vous la paire (valeur1, valeur2) (valeur3, valeur4) ?? ... est possible obtenir ces paires à partir d'une sous-requête ?? Et quel dB vous utilisez vraiment .. mysql ou sybase?
J'utilise Sybase IQ. Disons que je ne peux pas modifier comment j'obtiens ces tuples mais je peux modifier cette requête elle-même.
Ok Nut mais comment vous obtenez le tuple ?? .. est possible obtenir ces tuples d'une sous-requête ?? .. ou stocker le tuple dans la table Temp ?? '
Je peux le stocker dans une table Temps ..still voudriez savoir de quoi pensez-vous la sous-requête WRT / TIMP.
J'ai posté une réponse