0
votes

SLOW SQL Supprimer dans Sybase IQ

J'ai une énorme table avec 6 milliards de lignes.

Ma commande Supprimer ressemble à quelque chose comme ci-dessous xxx

Ceci fonctionne trop lent, même si j'ai l'index HG sur les deux col1 et col2.

Nous sommes en mesure de supprimer environ 100 000 lignes en 15 minutes.

Toute suggestion Comment puis-je améliorer les performances de suppression.

sera un composite Index (COL1, COL2) Aide?


5 commentaires

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


3 Réponses :


0
votes

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 (valeur1, valeur2), (valeur3, valeur4) ,. .. (valuen, valuen + 1) dans une table table temp_table cola, colb avec index composite sur cola, colb Vous pouvez essayer d'utiliser Suppr avec une jointure intérieure

Pour Sybase, la syntaxe de jointe de suppression doit être la suivante: xxx

Assurez-vous d'avoir également un index composite sur [Nom de la table] (COL1, COL2).


0 commentaires

0
votes
  1. Tout d'abord, vous utilisez ou dans votre état, Innodb n'utilisera pas index.

  2. Deuxièmement, davantage d'index ralentiront l'exécution de la commande DELETE. temps.

  3. troisièmement, votre table est trop énorme, vous devez l'optimiser en la divisant par date ou autre symbole.

    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.

    PS: Utilisez l'index composite (COL1, COL2) sera plus rapide.

    et si votre dossier que vous voulez n'est pas beaucoup.

    Voir: http://dev.mysql.com/doc/refman/5.0/fr/delete.html

    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: xxx


0 commentaires

0
votes

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:

  • Quelle charge est sur le système?
  • sont d'autres requêtes qui interfèrent avec les serrures nécessaires aux suppressions?
  • Combien d'index se trouvent sur la table?
  • Y a-t-il des références essentielles à la table?
  • y a-t-il Supprimer déclencheurs?

    Supprimer est une opération coûteuse. En plus des travaux spécifiques nécessaires au Supprimer , les lignes / pages doivent être verrouillées et les résultats doivent être enregistrés.

    Il n'est pas clair que trouver 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 être le problème. Mais ce n'est pas évident.

    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:

    • Créez une nouvelle table filtrant les lignes à l'aide de .
    • Tronquez la table d'origine (faites d'abord une copie de sauvegarde!).
    • réinsérez les données dans le tableau.

0 commentaires