SQL優化--刪除表的資料來加速
今天上午檢視em工具,在9點半的時候applications又升 到了60去,雖然很快釋放,沒有引起資料庫慢,但是這 裡還是重視一下。用上午8點到10的快照做成一個awr報告, 通過檢視 SQL Statistice-SQL ordered by elapsed time, 找出排名第一的SQL,Sql如下: SELECT message_id, reciver_employee_id, msg_type, msg_title, msg_content, operator_time, linkurl, TIMEOUT, position_id, awake_time FROM t_s_message WHERE (show_times > 0 AND awake_time <= SYSDATE) OR (show_times > 0 AND awake_time IS NULL) 檢視這個SQL,發現執行計劃很糟糕,其實就是一個全表掃描,t_s_message這張 表應該也清理一下了,但是整理資料庫表空間的時候看這個表小就暫時沒有做處 理,現在處理一下當時說的t_s_message這張表留半年的 刪出表內容的時候要注意的一個地方 select a.owner 主鍵擁有者, a.table_name 主鍵表, b.column_name 主鍵列, C.OWNER 外來鍵擁有者, c.table_name 外來鍵表, d.column_name 外來鍵列 from user_constraints a, user_cons_columns b, user_constraints C, user_cons_columns d where a.constraint_name=b.constraint_name and C.R_CONSTRAINT_NAME=a.constraint_name and c.constraint_name=d.constraint_name and a.constraint_type='P' and a.table_name='T_S_MESSAGE' --需要檢視主外來鍵關係的表 order by a.table_name 結果為零行,說明這個表裡面的資料沒有被其他表的外來鍵所參考, 這樣的話,這個表就可以刪除,還是用移表的方式,直接刪除肯 定還是會報外來鍵約束刪不掉的錯誤,但是如果用rename的方式移 除表的話,資料庫就會報錯了 Create Table t_s_Message_bak_2011 As Select * From t_s_message 保險期間還是分時間段刪除,這個很重要,有次在測試機上面直接 刪100W資料就出現了效能問題,整個資料庫效能急劇下滑,當我要 停掉會話的時候發現還停不掉,我手工從系統層面將會話結束,不 過資料庫仍然很慢,我知道據庫還在做回滾,一次刪除太多,回滾 的時間也會很長,而且在這期間仍然是影響效能的,所以正式庫上 刪除資料一定要小心再小心 Delete From t_s_message a Where a.operator_time Between to_date('2010-03-01 00:00:00','yyyy/MM/DD/ HH24:MI:SS') and to_date('2011-01-01 00:00:00','yyyy/MM/DD/ HH24:MI:SS') Delete From t_s_message a Where a.operator_time Between to_date('2011-01-01 00:00:00','yyyy/MM/DD/ HH24:MI:SS') and to_date('2011-06-01 00:00:00','yyyy/MM/DD/ HH24:MI:SS') 刪除完後,檢視執行計劃仍然沒有改變,收縮一下表 SQL> alter table t_s_message shrink space; alter index MESSAGE_RECIVER_POSTION_FK rebuild alter index PK_T_S_MESSAGE rebuild alter index CASE_MESSAGE_FK rebuild alter index MESSAGE_SENDER_FK rebuild alter index MESSAGE_RECIVER_FK rebuild 這裡直接用的rebuild,沒有用online,速度比較快,他們的具體差異 大致說就是有一張臨時表的過渡,讓rebuild online的時候索引仍然 能正常使用,不過這種操作還是比較消耗系統資源,應當在系統較為 空閒的時候再做次操作 收集一下統計資訊 exec dbms_stats.gather_table_stats('GC','T_S_MESSAGE'); 整個完成後,上面那條SQL執行就很快了,我漸漸意識 到有的SQL並不是說要如何如何優化,一個合理的業務 需求也是很重要的,線上交易系統裡面的表是不是應該 控制一下大小,不能無限制的增大
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10678398/viewspace-715103/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- SQL刪除資料庫裡所有表的外來鍵,同時刪除所有使用者表SQL資料庫
- sql 多表關聯刪除表資料SQL
- 系統優化之---分割槽表加速查詢速度和刪除速度優化
- MySQL刪除資料表MySql
- 刪除大表資料
- 海量資料表刪除方案
- MongoDB 資料庫建立刪除、表(集合)建立刪除、資料增刪改查MongoDB資料庫
- 如何刪除大表中的資料
- T-SQL 刪除重複資料SQLSQL
- 簡單介紹mysql如何刪除資料表和關聯的資料表刪除詳情MySql
- logminer來恢復在表DDL之前被刪除的資料
- MySQL(四) 資料表的插入、更新、刪除資料MySql
- 【北亞資料恢復】誤刪除oracle表和誤刪除oracle表資料的資料恢復方法資料恢復Oracle
- Oracle中刪除重複資料的SqlOracleSQL
- 資料庫優化 - SQL優化資料庫優化SQL
- mySql刪除多個表 刪除多個欄位的SQLMySql
- python 刪除大表資料Python
- 刪除表裡重複資料
- 刪除資料庫表空間資料庫
- 刪除sql server資料庫中所有資料SQLServer資料庫
- 刪除a表中和b表相同的資料
- mysql 刪除表中重複的資料MySql
- MySQL如何優雅的刪除大表MySql
- sql server:刪除表資料,標識列Id從1開始SQLServer
- whk我【資料刪除】你個【資料刪除】的
- 表管理之二:表資料的插入修改與刪除
- ORACLE刪除-表分割槽和資料Oracle
- PostgreSQL刪除表中重複資料SQL
- Oracle批量建立、刪除資料庫表Oracle資料庫
- MySQL超大表刪除資料過程MySql
- 資料庫優化SQL資料庫優化SQL
- sql海量資料優化SQL優化
- Oracle大表刪除部分資料的最佳方案Oracle
- 刪除資料泵備份失敗的表
- Oracle中刪除表中的重複資料Oracle
- 如何刪除資料庫下的所有表(mysql)資料庫MySql
- sql優化實戰:從1353秒到135秒(刪除索引+修改資料+重建索引)SQL優化索引
- MS SQL Server 刪除重複行資料SQLServer