sql >> Databáze >  >> RDS >> Oracle

Jak se zbavit prázdného, ​​ale obrovského sloupce LOB?

Jako alternativu k vypuštění a opětovnému přidání sloupce můžete použít shrink space doložka :

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

db<>fiddle , což je 18c, ale mělo by fungovat i v 11g. (Později:ano, dělá to v 11gR2 s retention none stejně vynecháno; SQL Fiddle to však nemá rád.)

Tento detail mi chyběl, ale stále funguje; stačí další krok, abyste našli skrytý sloupec BLOB zálohující sloupec XMLType, jak je uvedeno zde . Udělal jsem alter dynamický jen proto, abyste to mohli za chodu zachytit, ale pokud to můžete najít ručně, můžete to samozřejmě sami zapojit do prohlášení:

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

Pravděpodobně stojí za zmínku, že to funguje s basicfile úložiště, jak je uvedeno ve vaší minimální ukázce, ale nemusí fungovat s securefile úložiště – alespoň část času, která vyvolá ORA-10635:Neplatný typ segmentu nebo tabulkového prostoru.




  1. Nasazujete databázi Postgres na instanci azurového kontejneru?

  2. Připojení Mysql z více tabulek

  3. Konvence pojmenování PostgreSQL

  4. Chyba PostgreSQL při pokusu o vytvoření rozšíření