經(jīng)??梢杂龅竭@樣的情況,由于程序員的sql語(yǔ)句寫(xiě)的非常不合理,導致Oracle數據庫查詢(xún)速度緩慢,嚴重的情況會(huì )導致數據庫的故障。
舉個(gè)例子,我以前就遇到過(guò)Oracle數據庫定期(一周左右)出現 ORA-4031錯誤(shared pool內存不夠,無(wú)法連接Oracle數據庫),此時(shí)數據庫已經(jīng)無(wú)法再使用了。必須關(guān)閉重起,來(lái)釋放那些占在shared pool里面無(wú)法釋放的對象。
所以對于一個(gè)Oracle DBA來(lái)說(shuō),需要定期的檢查shared pool中的sql語(yǔ)句占用的內存空間,對于嚴重占用shared pool,無(wú)法釋放的sql語(yǔ)句,必須要求程序員修改或優(yōu)化sql語(yǔ)句。
- select sql_text ,sharable_mem from v$sql where sharable_mem > '100000' order by sharable_mem ;
select sql_text ,sharable_mem from v$sql where sharable_mem > '100000' order by sharable_mem ;
上面的sql語(yǔ)句是查詢(xún)shared pool中占用內存超過(guò)100K的sql語(yǔ)句。
這個(gè)sql可以非常有效的檢查出Oracle shared pool中那些嚴重占用內存的sql,根據我的經(jīng)驗,絕大多數有問(wèn)題的sql語(yǔ)句都會(huì )在這里留下痕跡,通過(guò)在這里找出有問(wèn)題的sql語(yǔ)句并進(jìn)行修改,再反復運行這個(gè)sql腳本,直到所以有問(wèn)題的sql都處理完畢,這就是對Oracle數據庫在sql上面的最好的優(yōu)化,可以保證不會(huì )因為程序員的sql語(yǔ)句問(wèn)題導致Oracle數據庫的性能問(wèn)題。
共享池主要由庫緩沖區(共享SQL區和PL/SQL區)和數據字典緩沖區組成。
select * from v$sgastat; --顯式SGA的狀態(tài)信息。
有的人寫(xiě)的SQL語(yǔ)句非常復雜,嵌套了好幾層,SQL語(yǔ)句本身寫(xiě)的很差,就有可能會(huì )占用很大的SQL區域。
這是我從Oracle Metalink里面摘下來(lái)的:
引用
If the SHARED_POOL_SIZE is large enough, most ORA-04031 errors are a result of dynamic sql fragmenting the shared pool. This can be caused by:
o Not sharing SQL
o Making unnecessary parse calls (soft)
o Not using bind variables