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

    系統須要作算分測試,在分數表四張分數表裏面分別插入了三百五十萬條數據進行測試,測試完畢後刪除測試數據,數據庫裏面只保留一組數據(每張表100條左右),可是這時候select表很是慢,和表中有百萬條數據的時候查詢速度差很少。sql

    最後查找緣由是由於對應存放大數據量的表的表空間變大了,通常沒有特殊設定的狀況下表空間大小爲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
相關文章
相關標籤/搜索