sql >> データベース >  >> RDS >> Oracle

空であるが巨大なLOB列を取り除く方法は?

    列を削除して再度追加する代わりに、shrink space 条項

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

    db <> fiddle 、これは18cですが、11gでも動作するはずです。 (後で:はい、それはretention noneで11gR2で行います とにかく省略。 SQL Fiddleはそれが好きではありません。)

    その詳細を見逃しましたが、それでも機能します。 XMLType列をバックアップする非表示のBLOB列を見つけるには、追加の手順が必要です。ここに示すように 。 alterを作成しました その場でそれを拾うためだけに動的ですが、手動で見つけることができれば、明らかに自分でステートメントにプラグインすることができます:

    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<>フィドル

    おそらくこれがbasicfileで機能することは注目に値します 最小限のデモに示されているように、ストレージですが、securefileでは機能しない可能性があります ストレージ-ORA-10635をスローする時間の少なくとも一部:無効なセグメントまたはテーブルスペースタイプ。




    1. 値が配列であるMySQLテーブルから行を選択しますか?

    2. このprepareステートメントをWordpress$wpdbのプレースホルダーを使用するように変換するにはどうすればよいですか?

    3. MySQLデータベースをメモリ内で完全に実行するにはどうすればよいですか?

    4. ウィンドウ関数とよりローカルな集約