2009-03-05 5 views
3

Lors de l'utilisation de tables MySQL MyISAM et de l'émission d'une instruction ALTER TABLE pour ajouter une colonne, MySQL crée une table temporaire et copie toutes les données dans la nouvelle table avant d'écraser la table d'origine.Performance Oracle des changements de schéma par rapport à MySQL ALTER TABLE?

Si cette table contient beaucoup de données, ce processus peut être très lent (en particulier lors de la reconstruction d'index) et vous devez disposer de suffisamment d'espace libre sur le disque pour stocker 2 copies de la table. C'est très agaçant.

Comment fonctionne Oracle lors de l'ajout de colonnes? Est-ce rapide sur de grandes tables?

Je suis toujours intéressé à pouvoir modifier les schémas sans avoir beaucoup de temps d'arrêt. Nous ajoutons toujours de nouvelles fonctionnalités à notre logiciel qui nécessitent des changements de schéma avec chaque version. Tout conseil est apprécié ...

Répondre

6

L'ajout d'une colonne sans données à une grande table dans Oracle est généralement très rapide. Il n'y a pas de copie temporaire des données et pas besoin de reconstruire les index. La lenteur survient généralement lorsque vous voulez ajouter une colonne à une grande table et remplir les données dans cette nouvelle colonne pour toutes les lignes existantes, car vous parlez maintenant d'une instruction UPDATE qui affecte un grand nombre de lignes.

L'ajout de colonnes peut entraîner une migration de ligne dans le temps. Si vous avez un bloc rempli à 80% avec 4 lignes et que vous ajoutez des colonnes qui augmenteront la taille de chaque ligne de 30% avec le temps, vous finirez par atteindre un point où Oracle doit déplacer l'une des 4 lignes vers une autre bloc. Il le fait en laissant un pointeur sur le nouveau bloc dans l'ancien bloc, ce qui provoque des lectures sur cette ligne migrée pour nécessiter plus d'E/S. L'élimination des lignes migrées peut être assez coûteuse, et bien qu'il soit généralement possible de se passer de temps d'arrêt en supposant que vous utilisez l'édition d'entreprise, il est généralement plus facile si vous avez un peu de temps d'arrêt. Mais la migration par rangée est quelque chose dont vous n'avez généralement à vous inquiéter qu'à long terme. Si vous savez que certaines tables risquent d'augmenter considérablement leur taille de ligne à l'avenir, vous pouvez limiter les problèmes à l'avance en spécifiant un paramètre PCTFREE plus grand pour la table.

+0

Je suis sûr que vous voulez dire "Si vous avez un bloc qui est rempli à 80% avec 4 lignes", oui? – Khb

+0

Tout à fait correct, oui. Merci. –

2

En ce qui concerne les temps d'arrêt, la modification d'une table (et d'un tas d'autres opérations DDL) nécessite un verrouillage exclusif. Toutefois, Oracle peut également effectuer une redéfinition en ligne des objets oobjects en utilisant le paquet DBMS_REDEFINITION, qui peut vraiment prendre une pause dans les temps d'arrêt.

+0

La fonction de redéfinition en ligne nécessite-t-elle Enterprise Edition? –

+0

Je ne pense pas - je ne le vois pas mentionné dans la comparaison d'édition de produit. http://www.oracle.com/database/product_editions.html –

Questions connexes