91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SQL中如何釋放大數據量的lob字段空間

發布時間:2021-11-29 11:30:03 來源:億速云 閱讀:128 作者:柒染 欄目:關系型數據庫

SQL中如何釋放大數據量的lob字段空間,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

SQL> create tablespace ts_lob datafile '/u01/app/oracle/oradata/DBdb/ts_lob.dbf' size 500m autoextend off;

Tablespace created.

--scott用戶創建測試表lob1:
SQL> grant dba to scott;

Grant succeeded.

SQL> conn scott/tiger;
Connected.
SQL> create table lob1(line number,text clob) tablespace ts_lob;

Table created.

SQL> insert into lob1  select line,text from  dba_source;

637502 rows created.

SQL> insert into lob1 select * from lob1;

637502 rows created.

SQL> select count(*) from lob1;

  COUNT(*)
----------
   1275004

SQL> commit;

Commit complete.


--查詢表大小(包含表和lob字段)
select (select nvl(sum(s.bytes/1024/1204), 0)                              -- the table segment size  
          from dba_segments s
         where s.owner = upper('SCOTT')
           and (s.segment_name = upper('LOB1'))) +
       (select nvl(sum(s.bytes/1024/1024), 0)                              -- the lob segment size  
          from dba_segments s, dba_lobs l
         where s.owner = upper('SCOTT')
           and (l.segment_name = s.segment_name and
               l.table_name = upper('LOB1') and
               l.owner = upper('SCOTT'))) +
       (select nvl(sum(s.bytes/1024/1024), 0)                              -- the lob index size  
          from dba_segments s, dba_indexes i
         where s.owner = upper('SCOTT')
           and (i.index_name = s.segment_name and
               i.table_name = upper('LOB1') and index_type = 'LOB' and
               i.owner = upper('SCOTT'))) "total_table_size_M"
        FROM DUAL;
        
total_table_size_M
------------------
        239.966154
           

--查詢表大小(不包含lob字段)               
col SEGMENT_NAME for a30
col PARTITION_NAME for a30
SQL> select OWNER,SEGMENT_NAME,PARTITION_NAME,BYTES/1024/1024 M from dba_segments where segment_name='LOB1' and owner='SCOTT';

OWNER                          SEGMENT_NAME                   PARTITION_NAME                          M
------------------------------ ------------------------------ ------------------------------ ----------
SCOTT                          LOB1                                                                 208


--查詢表大小(只包含lob字段)       
set lines 200 pages 999
col owner  for a15
col TABLE_NAME for a20
col COLUMN_NAME for a30
col SEGMENT_NAME for a30
select a.owner,  
       a.table_name,  
       a.column_name,  
       b.segment_name,
       b.segment_type,  
       ROUND(b.BYTES / 1024 / 1024)  
  from dba_lobs a, dba_segments b  
 where a.segment_name = b.segment_name  
   and a.owner = 'SCOTT'  
   and a.table_name = 'LOB1'  
union all  
select a.owner,  
       a.table_name,  
       a.column_name,  
       b.segment_name,
       b.segment_type,  
       ROUND(b.BYTES / 1024 / 1024)  
  from dba_lobs a, dba_segments b  
 where a.index_name = b.segment_name  
   and a.owner = 'SCOTT'  
   and a.table_name = 'LOB1';

OWNER           TABLE_NAME           COLUMN_NAME                    SEGMENT_NAME                   SEGMENT_TYPE       ROUND(B.BYTES/1024/1024)
--------------- -------------------- ------------------------------ ------------------------------ ------------------ ------------------------
SCOTT           LOB1                 TEXT                           SYS_LOB0000089969C00002$$      LOBSEGMENT                               63
SCOTT           LOB1                 TEXT                           SYS_IL0000089969C00002$$       LOBINDEX                                  0
   
   
--查詢ts_lob表空間的表大小排行
SQL> select * from (select SEGMENT_NAME,sum(bytes)/1024/1024 sx from dba_segments
               where tablespace_name='TS_LOB' group by segment_name )
               order by sx desc;
 
SEGMENT_NAME                           SX
------------------------------ ----------
LOB1                                  208
SYS_LOB0000089969C00002$$              63
SYS_IL0000089969C00002$$            .0625

--查詢lob字段SCOTT_LOB0000089963C00002$$ 、SCOTT_IL0000089963C00002$$:
SQL> col object_name for a30
SQL> select OWNER,OBJECT_NAME,OBJECT_TYPE from dba_objects where OBJECT_NAME in('SYS_LOB0000089969C00002$$','SYS_IL0000089969C00002$$');

OWNER           OBJECT_NAME                    OBJECT_TYPE
--------------- ------------------------------ -------------------
SCOTT           SYS_IL0000089969C00002$$       INDEX
SCOTT           SYS_LOB0000089969C00002$$      LOB

SQL>  select OWNER,TABLE_NAME,COLUMN_NAME,SEGMENT_NAME,TABLESPACE_NAME,INDEX_NAME from dba_lobs where segment_name in('SYS_LOB0000089969C00002$$','SYS_IL0000089969C00002$$');

OWNER           TABLE_NAME           COLUMN_NAME                    SEGMENT_NAME                   TABLESPACE_NAME                INDEX_NAME
--------------- -------------------- ------------------------------ ------------------------------ ------------------------------ ------------------------------
SCOTT           LOB1                 TEXT                           SYS_LOB0000089969C00002$$      TS_LOB                         SYS_IL0000089969C00002$$

SQL>
SQL> select SEGMENT_NAME,bytes /1024/1024 sx from dba_segments where tablespace_name='TS_LOB' and SEGMENT_NAME in('SYS_LOB0000089969C00002$$','SYS_IL0000089969C00002$$');

SEGMENT_NAME                           SX
------------------------------ ----------
SYS_LOB0000089969C00002$$              63
SYS_IL0000089969C00002$$            .0625


一、先試著刪除lob字段:
SQL>  alter table scott.lob1 drop (text);

Table altered.

SQL> select SEGMENT_NAME,bytes /1024/1024 sx from dba_segments where tablespace_name='TS_LOB' and SEGMENT_NAME in('SYS_LOB0000089969C00002$$','SYS_IL0000089969C00002$$');

no rows selected

SQL> select * from (select SEGMENT_NAME,sum(bytes)/1024/1024 sx from dba_segments where tablespace_name='TS_LOB' group by segment_name ) order by sx desc;

SEGMENT_NAME                           SX
------------------------------ ----------
LOB1                                  208

發現刪除lob字段可以釋放表空間。


--再次添加LOB字段:
SQL> alter  table scott.lob1 add (text clob);

Table altered.

SQL>  select * from (select SEGMENT_NAME,sum(bytes)/1024/1024 sx from dba_segments where tablespace_name='TS_LOB' group by segment_name ) order by sx desc;

SEGMENT_NAME                           SX
------------------------------ ----------
LOB1                                  208
SYS_LOB0000089969C00002$$           .0625
SYS_IL0000089969C00002$$            .0625

二、再次插入數據:
SQL> insert into scott.lob1 select LINE,text from dba_source;

637502 rows created.

SQL> insert into scott.lob1 select LINE,text from dba_source;

637502 rows created.

SQL> commit;

Commit complete.

SQL>  select * from (select SEGMENT_NAME,sum(bytes)/1024/1024 sx from dba_segments where tablespace_name='TS_LOB' group by segment_name ) order by sx desc;

SEGMENT_NAME                           SX
------------------------------ ----------
LOB1                                  208
SYS_LOB0000089969C00002$$              63
SYS_IL0000089969C00002$$            .0625


--接著試著truncate表LOB1
SQL> truncate table scott.lob1;

Table truncated.

SQL>  select * from (select SEGMENT_NAME,sum(bytes)/1024/1024 sx from dba_segments where tablespace_name='TS_LOB' group by segment_name ) order by sx desc;

SEGMENT_NAME                           SX
------------------------------ ----------
LOB1                                .0625
SYS_LOB0000089969C00002$$           .0625
SYS_IL0000089969C00002$$            .0625

truncate表也可以釋放lob字段數據;

三、再次插入數據:
SQL> insert into scott.lob1 select LINE,text from dba_source;

637502 rows created.

SQL> insert into scott.lob1 select LINE,text from dba_source;

637502 rows created.

SQL> commit;

Commit complete.

SQL>
SQL>  select * from (select SEGMENT_NAME,sum(bytes)/1024/1024 sx from dba_segments where tablespace_name='TS_LOB' group by segment_name ) order by sx desc;

SEGMENT_NAME                           SX
------------------------------ ----------
LOB1                                  184
SYS_LOB0000089969C00002$$              63
SYS_IL0000089969C00002$$            .0625

使用delete方式刪除數據,實際上物理塊還是被占用,高水位沒有下降。
SQL> delete scott.lob1;

1275004 rows deleted.

SQL>
SQL> select * from (select SEGMENT_NAME,sum(bytes)/1024/1024 sx from dba_segments where tablespace_name='TS_LOB' group by segment_name ) order by sx desc;

SEGMENT_NAME                           SX
------------------------------ ----------
LOB1                                  184
SYS_LOB0000089969C00002$$              63
SYS_IL0000089969C00002$$              .75

SQL> select count(*) from scott.lob1;

  COUNT(*)
----------
         0
         
SQL> truncate table scott.lob1;

Table truncated.

SQL> select * from (select SEGMENT_NAME,sum(bytes)/1024/1024 sx from dba_segments where tablespace_name='TS_LOB' group by segment_name ) order by sx desc;

SEGMENT_NAME                           SX
------------------------------ ----------
LOB1                                .0625
SYS_LOB0000089969C00002$$           .0625
SYS_IL0000089969C00002$$            .0625

結論:在刪除lob字段的大數據量時,可以采用重建表(CTAS)、刪除lob字段再重建alter table table_name drop (column)、導出導入(只導出元數據)、或者直接truncate全表刪除全表(包括lob)降低高水位。 

看完上述內容,你們掌握SQL中如何釋放大數據量的lob字段空間的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

邓州市| 祁门县| 望都县| 曲松县| 台北市| 天气| 台东市| 凤山市| 腾冲县| 綦江县| 株洲市| 廊坊市| 壤塘县| 普兰店市| 普安县| 兴国县| 堆龙德庆县| 玛曲县| 龙岩市| 泸定县| 米林县| 饶阳县| 交口县| 和林格尔县| 绿春县| 罗平县| 余庆县| 富顺县| 丰顺县| 雷州市| 平顶山市| 宜宾市| 滕州市| 闽侯县| 汤原县| 新绛县| 基隆市| 桑植县| 井冈山市| 珲春市| 柯坪县|