sql >> Database >  >> RDS >> Oracle

Hoe Oracle LOB te laten vallen

Een scenario waarin u een LOB kunt zien in user_objects maar de join naar user_lobs vindt niets is als de tabel al is verwijderd, maar bevindt zich in de prullenbak .

create table t42 (my_clob clob);

table T42 created.

Zoals verwacht, toont de vraag van Justin je de kolom:

select l.table_name,
       l.column_name,
       l.segment_name lob_name
  from user_lobs l
       join user_objects o
         on( o.object_name = l.segment_name );

TABLE_NAME  COLUMN_NAME LOB_NAME                     
----------- ----------- ------------------------------
T42         MY_CLOB     SYS_LOB0000133310C00001$$      

drop table t42;

table T42 dropped.

Nu vindt de zoekopdracht van Justin niets:

select l.table_name,
       l.column_name,
       l.segment_name lob_name
  from user_lobs l
       join user_objects o
         on( o.object_name = l.segment_name );

no rows selected

Maar het staat nog steeds in user_objects :

select object_name, object_type, status from user_objects
where object_type like 'LOB%';

OBJECT_NAME                    OBJECT_TYPE         STATUS
------------------------------ ------------------- -------
SYS_LOB0000133328C00001$$      LOB                 VALID   

En je kunt het zien in de prullenbak:

select * from user_recyclebin;

OBJECT_NAME                    ORIGINAL_NAME                    OPERATION TYPE                      TS_NAME                        CREATETIME          DROPTIME               DROPSCN PARTITION_NAME                   CAN_UNDROP CAN_PURGE    RELATED BASE_OBJECT PURGE_OBJECT      SPACE
------------------------------ -------------------------------- --------- ------------------------- ------------------------------ ------------------- ------------------- ---------- -------------------------------- ---------- --------- ---------- ----------- ------------ ----------
SYS_IL0000133310C00001$$       SYS_IL0000133310C00001$$         DROP      LOB INDEX                 USERS                          2013-08-22:08:33:21 2013-08-22:08:33:21    1.0E+13                                  NO         NO            133310      133310       133310          0 
SYS_LOB0000133310C00001$$      SYS_LOB0000133310C00001$$        DROP      LOB                       USERS                          2013-08-22:08:33:21 2013-08-22:08:33:21    1.0E+13                                  NO         NO            133310      133310       133310          0 
BIN$5IUNXtWkUXLgQwEAAH9TlQ==$0 T42                              DROP      TABLE                     USERS                          2013-08-22:08:33:21 2013-08-22:08:33:21    1.0E+13                                  YES        YES           133310      133310       133310          0 

De LOB bestaat nog steeds op schijf en gebruikt opslag, en ik denk dat dat is waar je je zorgen over maakt. Dus om je vraag te beantwoorden, om de LOB echt te laten vallen en de opslag vrij te geven, moet je de hele tabel opschonen:

purge table t42;

table purged.

select object_name, object_type, status from user_objects
where object_type like 'LOB%';

no rows selected

Interessant genoeg zie je dit effect niet als je het LOB-segment een naam geeft:

create table t42 (my_clob clob)
lob (my_clob) store as my_clob_segment;

Door de bovenstaande stappen te herhalen, is de invoer verdwenen van user_objects na de drop .

drop table t42;

table T42 dropped.

select object_name, object_type, status from user_objects
where object_type like 'LOB%';

no rows selected

select * from user_recyclebin;

OBJECT_NAME                    ORIGINAL_NAME                    OPERATION TYPE                      TS_NAME                        CREATETIME          DROPTIME               DROPSCN PARTITION_NAME                   CAN_UNDROP CAN_PURGE    RELATED BASE_OBJECT PURGE_OBJECT      SPACE
------------------------------ -------------------------------- --------- ------------------------- ------------------------------ ------------------- ------------------- ---------- -------------------------------- ---------- --------- ---------- ----------- ------------ ----------
BIN$5IUNXtWnUXLgQwEAAH9TlQ==$0 MY_CLOB_SEGMENT                  DROP      LOB                       USERS                          2013-08-22:08:36:41 2013-08-22:08:36:41    1.0E+13                                  NO         NO            133316      133316       133316          0 
BIN$5IUNXtWoUXLgQwEAAH9TlQ==$0 T42                              DROP      TABLE                     USERS                          2013-08-22:08:36:41 2013-08-22:08:36:41    1.0E+13                                  YES        YES           133316      133316       133316          0 
SYS_IL0000133316C00001$$       SYS_IL0000133316C00001$$         DROP      LOB INDEX                 USERS                          2013-08-22:08:36:41 2013-08-22:08:36:41    1.0E+13                                  NO         NO            133316      133316       133316          0 

De opslag wordt natuurlijk nog steeds gebruikt en je moet nog steeds opschonen om het vrij te maken, het ziet er alleen wat consistenter uit in de datadictionary. Dus dit lijkt op een (zeer kleine) bug, misschien hoogstens. Het kan te maken hebben met het gedrag waarnaar wordt verwezen in ondersteuningsnota 394442.1.



  1. Postgres/JSON - update alle array-elementen

  2. Update als de naam bestaat, anders invoegen - in SQL Server

  3. Hoe u een kalenderkwartaal kunt krijgen van een datum in TSQL

  4. Selecteer laatste record in tabel (datetime veld)