1. 程式人生 > >Oracle一張表儲存大量資料再刪除後查詢變慢問題

Oracle一張表儲存大量資料再刪除後查詢變慢問題

開發十年,就只剩下這套架構體系了! >>>   

    系統需要做算分測試,在分數表四張分數表裡面分別插入了三百五十萬條資料進行測試,測試完畢後刪除測試資料,資料庫裡面只保留一組資料(每張表100條左右),但是這時候select表非常慢,和表中有百萬條資料的時候查詢速度差不多。

    最後查詢原因是因為對應存放大資料量的表的表空間變大了,一般沒有特殊設定的情況下表空間大小為64KB,而這幾張表的表空間大小接近1G,所以儘管表裡面只有100條資料但是查詢的速度還是非常地慢。這個時候可以用以下程式碼檢視對應表所佔表空間的大小。

select sum(bytes)/(1024*1024) from user_segments where segment_name='表名';

    既然表空間不需要這麼大,當資料量變小的時候就需要釋放多餘的表空間。

--釋放表空間
alter table 表名 move;

    由於釋放了表空間之後表的rowid會發生變化,基於rowid的索引會無效,這種情況下一般會刪除並重新建立索引,也可以直接rebuild索引。如果不知道這張表中有哪些索引,可以查詢出這張表的所有索引並重建。或者也可以查詢出當前使用者下所有表空間佔用情況然後進行優化。

--重建索引
alter index 索引名 rebuild;
--查詢對應表下所有索引
SELECT * FROM user_indexes WHERE TABLE_NAME = '表名'
--查詢出Oracle當前使用者下所有表空間大小佔用情況
select Segment_Name,Sum(bytes)/1024/1024 MEMORY_SIZE From User_Extents Group By Segment_Name ORDER BY MEMORY_SIZE DESC