Uno scenario in cui è possibile vedere un LOB in user_objects
ma il join in user_lobs
non trova nulla se la tabella è già stata rilasciata, ma is in the recycle bin.
create table t42 (my_clob clob);
table T42 created.
Come previsto, la query di Justin si mostra la colonna:
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.
Ora interrogazione di Justin non trova nulla:
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
ma è ancora 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
A ND si può vedere nel cestino:
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
Il LOB esiste ancora sul disco e sta usando lo stoccaggio, che credo sia quello che siete preoccupati. Quindi, per una sorta di rispondere alla tua domanda, a cadere davvero il LOB e rilasciare il suo stoccaggio è necessario per eliminare l'intera tabella:
purge table t42;
table purged.
select object_name, object_type, status from user_objects
where object_type like 'LOB%';
no rows selected
È interessante notare che non si vede questo effetto se il nome del segmento LOB:
create table t42 (my_clob clob)
lob (my_clob) store as my_clob_segment;
Ripetendo i passaggi precedenti, la voce è passata da user_objects
dopo la 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
Lo stoccaggio è ancora in uso, naturalmente, e si ancora bisogno di eliminare per liberarlo, l'aspetto è un po 'più consistente nel dizionario dei dati. Quindi questo sembra un bug (molto piccolo), forse, al massimo. Potrebbe essere correlato al comportamento indicato nella nota di supporto 394442.1.
Grazie per la spiegazione dettagliata e le query di esempio – byneri
+1. Molto bella. Grazie per la risposta concisa (e leggibile)! – spencer7593