ALTER TABLE … SHRINK SPACE permet de:
- déplacer les lignes vers le début de la table lorsqu’il y a de l’espace libre dans les blocs
- abaisser le High Water Mark pour ne plus aller lire les blocks vidés (lors d’un full table scan) et pour libérer les extents qui sont au dessus.
La première opération doit déplacer les lignes, donc elle nécessite ‘enable row movement’. Elle peut être longue (les lignes sont déplacées une par une, avec maintenance des index, comme un delete+insert) mais elle est totalement online (comme un delete+insert).
La deuxième peut poser un problème lorsqu’il y a des sessions concurrentes.
D’une part parce qu’un verrou exclusif est posé, d’autre part avec le risque que les requêtes en cours sur la table se plantent avec un ‘ORA-10632: Invalid rowid’.
Pour diminuer la plage de maintenance, il est possible de faire cela en 2 temps:
pour faire tout le travail long de l’étape 1 – totalement online
Puis, lorsqu’il n’y a plus d’activité concurrente:
qui sera plus rapide puisque le déplacement des lignes a déjà été fait.
La demo montre les erreurs possibles et les verrous posés.
Il ne faut pas oublier non plus que dès que les stats seront calculées, des plans d’exécution pourront changer. Le nombre de BLOCKS de la table sera plus faible (favorise les FULL TABLE SCAN) et les CLUSTERING_FACTOR des index peuvent être moins bons (défavorise les accès par index).