sql >> Database >  >> RDS >> Oracle

Hoe zich te ontdoen van lege maar enorme LOB-kolom?

Als alternatief voor het verwijderen en opnieuw toevoegen van de kolom kunt u de shrink space clausule :

ALTER TABLE t MODIFY LOB (c) (SHRINK SPACE);

db<>fiddle , wat 18c is, maar ook in 11g zou moeten werken. (Later:ja, in 11gR2 met retention none toch weggelaten; SQL Fiddle vindt het echter niet leuk.)

Dat detail gemist, maar het werkt nog steeds; je hebt alleen een extra stap nodig om de verborgen BLOB-kolom te vinden die een back-up maakt van de XMLType-kolom, zoals hier weergegeven . Ik heb de alter . gemaakt dynamisch om dat meteen op te pikken, maar als je het handmatig kunt vinden, kun je het natuurlijk gewoon zelf in de verklaring pluggen:

DECLARE
  l_name USER_TAB_COLUMNS.COLUMN_NAME%TYPE;
  l_stmt VARCHAR2(100);
BEGIN
  select column_name
  into l_name
  from user_tab_cols 
  where 
    table_name = 'T' and hidden_column = 'YES'
    and
    column_id = (
        select column_id 
        from user_tab_cols 
        where table_name = 'T' and column_name = 'X'
    );

  l_stmt := 'ALTER TABLE t MODIFY LOB ("' || l_name || '") (SHRINK SPACE)';
  dbms_output.put_line(l_stmt);
  execute immediate l_stmt;
END;
/

db<>fiddle

Waarschijnlijk het vermelden waard dat dit werkt met basicfile opslag, zoals weergegeven in uw minimale demo, maar werkt mogelijk niet met securefile opslag - in ieder geval een deel van de tijd die ORA-10635 genereert:Ongeldig segment of type tabelruimte.




  1. Uitzondering 'kon stuurprogramma niet vinden' tijdens migratie in yii2

  2. Hoe efficiënt een kolom BIJWERKEN in een grote PostgreSQL-tabel met Python / psycopg2?

  3. Verzend ajax-formulier en blijf op dezelfde pagina werkt niet

  4. Indexeringsstrategie voor verschillende combinaties van WHERE-clausules incl. tekstpatronen