sqlplus緩存區怎麼設置
1. 如何在sqlplus中查看,修改,執行緩存的SQL語句
oracle 10g的DBMS_XPLAN包中display_cursor函數不同於display函數,display_cursor用於顯示SQL語句的真實的執行計劃,在大多數情況下,
顯示真實的執行計劃有助於更好的分析SQL語句的全過程,尤其是運行此SQL語句實時的I/O開銷。通過對比預估的I/O與真實的I/O開銷來判斷
SQL語句所存在問題,如缺少統計信息,SQL語句執行的次數,根據實際中間結果集的大小來選擇合適的連接方式等。本文僅僅講述
display_cursor函數的使用。
一、display_cursor函數用法
1、display_cursor函數語法
DBMS_XPLAN.DISPLAY_CURSOR(
sql_id IN VARCHAR2 DEFAULT NULL,
cursor_child_no IN NUMBER DEFAULT NULL,
format IN VARCHAR2 DEFAULT 'TYPICAL');
2、display_cursor函數參數描述
sql_id
指定位於庫緩存執行計劃中SQL語句的父游標。默認值為null。當使用默認值時當前會話的最後一條SQL語句的執行計劃將被返回
可以通過查詢V$SQL 或V$SQLAREA的SQL_ID列來獲得SQL語句的SQL_ID。
cursor_child_no
指定父游標下子游標的序號。即指定被返回執行計劃的SQL語句的子游標。默認值為0。如果為null,則sql_id所指父游標下所有子游標
的執行計劃都將被返回。
format
控制SQL語句執行計劃的輸出部分,即哪些可以顯示哪些不顯示。使用與display函數的format參數與修飾符在這里同樣適用。
除此之外當在開啟statistics_level=all時或使用gather_plan_statistics提示可以獲得執行計劃中實時的統計信息
有關詳細的format格式描述請參考:dbms_xplan之display函數的使用 中format參數的描述
下面給出啟用統計信息時format新增的修飾符
iostats 控制I/O統計的顯示
last 默認,顯示所有執行計算過的統計。如果指定該值,則只顯示最後一次執行的統計信息
memstats 控制pga相關統計的顯示
allstats 此為iostats memstats的快捷方式,即allstats包含了iostats和memstats
run_stats_last 等同於iostats last。只能用於oracle 10g R1
run_stats_tot 等同於iostats。只能用於oracle 10g R1
2. 如何提高oracle的查詢速度
幾個簡單的步驟大幅提高Oracle性能--我優化資料庫的三板斧。
資料庫優化的討論可以說是一個永恆的主題。資深的Oracle優化人員通常會要求提出性能問題的人對資料庫做一個statspack,貼出資料庫配置等等。還有的人認為要抓出執行最慢的語句來進行優化。但實際情況是,提出疑問的人很可能根本不懂執行計劃,更不要說statspack了。而我認為,資料庫優化,應該首先從大的方面考慮:網路、伺服器硬體配置、操作系統配置、Oracle伺服器配置、數據結構組織、然後才是具體的調整。實際上網路、硬體等往往無法決定更換,應用程序一般也無法修改,因此應該著重從資料庫配置、數據結構上來下手,首先讓資料庫有一個良好的配置,然後再考慮具體優化某些過慢的語句。我在給我的用戶系統進行優化的過程中,總結了一些基本的,簡單易行的辦法來優化資料庫,算是我的三板斧,呵呵。不過請注意,這些不一定普遍使用,甚至有的會有副作用,但是對OLTP系統、基於成本的資料庫往往行之有效,不妨試試。(註:附件是Burleson寫的用來報告資料庫性能等信息的腳本,本文用到)
一.設置合適的SGA
常常有人抱怨伺服器硬體很好,但是Oracle就是很慢。很可能是內存分配不合理造成的。(1)假設內存有512M,這通常是小型應用。建議Oracle的SGA大約240M,其中:共享池(SHARED_POOL_SIZE)可以設置60M到80M,根據實際的用戶數、查詢等來定。數據塊緩沖區可以大致分配120M-150M,8i下需要設置DB_BLOCK_BUFFERS,DB_BLOCK_BUFFER*DB_BLOCK_SIZE等於數據塊緩沖區大小。9i 下的數據緩沖區可以用db_cache_size來直接分配。
(2)假設內存有1G,Oracle 的SGA可以考慮分配500M:共享池分配100M到150M,數據緩沖區分配300M到400M。
(3)內存2G,SGA可以考慮分配1.2G,共享池300M到500M,剩下的給數據塊緩沖區。
(4)內存2G以上:共享池300M到500M就足夠啦,再多也沒有太大幫助;(Biti_rainy有專述)數據緩沖區是盡可能的大,但是一定要注意兩個問題:一是要給操作系統和其他應用留夠內存,二是對於32位的操作系統,Oracle的SGA有1.75G的限制。有的32位操作系統上可以突破這個限制,方法還請看Biti的大作吧。
二.分析表和索引,更改優化模式
Oracle默認優化模式是CHOOSE,在這種情況下,如果表沒有經過分析,經常導致查詢使用全表掃描,而不使用索引。這通常導致磁碟I/O太多,而導致查詢很慢。如果沒有使用執行計劃穩定性,則應該把表和索引都分析一下,這樣可能直接會使查詢速度大幅提升。分析表命令可以用ANALYZE TABLE 分析索引可以用ANALYZE INDEX命令。對於少於100萬的表,可以考慮分析整個表,對於很大的表,可以按百分比來分析,但是百分比不能過低,否則生成的統計信息可能不準確。可以通過DBA_TABLES的LAST_ANALYZED列來查看錶是否經過分析或分析時間,索引可以通過DBA_INDEXES的LAST_ANALYZED列。
下面通過例子來說明分析前後的速度對比。(表CASE_GA_AJZLZ大約有35萬數據,有主鍵)首先在SQLPLUS中打開自動查詢執行計劃功能。(第一次要執行\RDBMS\ADMIN\utlxplan.sql來創建PLAN_TABLE這個表)
SQL> SET AUTOTRACE ON
SQL>SET TIMING ON
通過SET AUTOTRACE ON 來查看語句的執行計劃,通過SET TIMING ON 來查看語句運行時間。
SQL> seleCT count(*) from CASE_GA_AJZLZ;
COUNT(*)
----------
346639
已用時間: 00: 00: 21.38
Execution Plan
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 SORT (AGGREGATE)
2 1 TABLE ACCESS (FULL) OF 'CASE_GA_AJZLZ'
……………………
請注意上面分析中的TABLE ACCESS(FULL),這說明該語句執行了全表掃描。而且查詢使用了21.38秒。這時表還沒有經過分析。下面我們來對該表進行分析:
SQL> analyze table CASE_GA_AJZLZ compute statistics;
表已分析。已用時間: 00: 05: 357.63。然後再來查詢:
SQL> select count(*) from CASE_GA_AJZLZ;
COUNT(*)
----------
346639
已用時間: 00: 00: 00.71
Execution Plan
0 SELECT STATEMENT Optimizer=FIRST_ROWS (Cost=351 Card=1)
1 0 SORT (AGGREGATE)
2 1 INDEX (FAST FULL SCAN) OF 'PK_AJZLZ' (UNIQUE) (Cost=351
Card=346351)
…………………………
請注意,這次時間僅僅用了0.71秒!這要歸功於INDEX(FAST FULL SCAN)。通過分析表,查詢使用了PK_AJZLZ索引,磁碟I/O大幅減少,速度也大幅提升!下面的實用語句可以用來生成分析某個用戶的所有表和索引,假設用戶是GAXZUSR:
SQL> set pagesize 0
SQL> spool d:\analyze_tables.sql;
SQL> select 'analyze table '||owner||'.'||table_name||'
compute statistics;' from dba_tables where owner='GAXZUSR';
SQL> spool off
SQL> spool spool d:\analyze_indexes.sql;
SQL> select 'analyze index '||owner||'.'||index_name||'
compute statistics;' from dba_indexes where owner='GAXZUSR';
SQL> spool off
SQL> @d:\analyze_tables.sql
SQL> @d:\analyze_indexes.sql
解釋:上面的語句生成了兩個sql文件,分別分析全部的GAXZUSR的表和索引。如果需要按照百分比來分析表,可以修改一下腳本。通過上面的步驟,我們就完成了對表和索引的分析,可以測試一下速度的改進啦。建議定期運行上面的語句,尤其是數據經過大量更新。
當然,也可以通過dbms_stats來分析表和索引,更方便一些。但是我仍然習慣上面的方法,因為成功與否會直接提示出來。
另外,我們可以將優化模式進行修改。optimizer_mode值可以是RULE、CHOOSE、FIRST_ROWS和ALL_ROWS。對於OLTP系統,可以改成FIRST_ROWS,來要求查詢盡快返回結果。這樣即使不用分析,在一般情況下也可以提高查詢性能。但是表和索引經過分析後有助於找到最合適的執行計劃。
三.設置cursor_sharing=FORCE 或SIMILAR
這種方法是8i才開始有的,oracle805不支持。通過設置該參數,可以強制共享只有文字不同的語句解釋計劃。例如下面兩條語句可以共享:
SQL> SELECT * FROM MYTABLE WHERE NAME='tom'
SQL> SELECT * FROM MYTABLE WHERE NAME='turner'
這個方法可以大幅降低緩沖區利用率低的問題,避免語句重新解釋。通過這個功能,可以很大程度上解決硬解析帶來的性能下降的問題。個人感覺可根據系統的實際情況,決定是否將該參數改成FORCE。該參數默認是exact。不過一定要注意,修改之前,必須先給ORACLE打補丁,否則改之後oracle會佔用100%的CPU,無法使用。對於ORACLE9i,可以設置成SIMILAR,這個設置綜合了FORCE和EXACT的優點。不過請慎用這個功能,這個參數也可能帶來很大的負面影響!
四.將常用的小表、索引釘在數據緩存KEEP池中
內存上數據讀取速度遠遠比硬碟中讀取要快,據稱,內存中數據讀的速度是硬碟的14000倍!如果資源比較豐富,把常用的小的、而且經常進行全表掃描的表給釘內存中,當然是在好不過了。可以簡單的通過ALTER TABLE tablename CACHE來實現,在ORACLE8i之後可以使用ALTER TABLE table STORAGE(BUFFER_POOL KEEP)。一般來說,可以考慮把200數據塊之內的表放在keep池中,當然要根據內存大小等因素來定。關於如何查出那些表或索引符合條件,可以使用本文提供的access.sql和access_report.sql。這兩個腳本是著名的Oracle專家 Burleson寫的,你也可以在讀懂了情況下根據實際情況調整一下腳本。對於索引,可以通過ALTER INDEX indexname STORAGE(BUFFER_POOL KEEP)來釘在KEEP池中。
將表定在KEEP池中需要做一些准備工作。對於ORACLE9i 需要設置DB_KEEP_CACHE_SIZE,對於8i,需要設置buffer_pool_keep。在8i中,還要修改db_block_lru_latches,該參數默認是1,無法使用buffer_pool_keep。該參數應該比2*3*CPU數量少,但是要大於1,才能設置DB_KEEP_CACHE_BUFFER。buffer_pool_keep從db_block_buffers中分配,因此也要小於db_block_buffers。設置好這些參數後,就可以把常用對象永久釘在內存里。
五.設置optimizer_max_permutations
對於多表連接查詢,如果採用基於成本優化(CBO),ORACLE會計算出很多種運行方案,從中選擇出最優方案。這個參數就是設置oracle究竟從多少種方案來選擇最優。如果設置太大,那麼計算最優方案過程也是時間比較長的。Oracle805和8i默認是80000,8建議改成2000。對於9i,已經默認是2000了。
六.調整排序參數
(1) SORT_AREA_SIZE:默認的用來排序的SORT_AREA_SIZE大小是32K,通常顯得有點小,一般可以考慮設置成1M(1048576)。這個參數不能設置過大,因為每個連接都要分配同樣的排序內存。
(2) SORT_MULTIBLOCK_READ_COUNT:增大這個參數可以提高臨時表空間排序性能,該參數默認是2,可以改成32來對比一下排序查詢時間變化。注意,這個參數的最大值與平台有關系。
3. secureCRT 文件單行顯示問題。如圖
個人感覺跟SecureCRT設置關系不大,建議看看 ~/.bashrc 文件里有沒有設置命令別名 alias ls
考慮到這種顯示風格像是下面這個語句的結果:
ls-l|awk'{print$NF}'
或者:
ls|tr''' '
所以,懷疑~/.bashrc中設置了命令別名。順便也檢查下~/.bash_profile文件。
如果有設置,在前面加#注釋掉alias ls 行,然後重新登錄看看。
4. linux下 怎麼重啟oracle資料庫
工具/原料 oracle資料庫secureCRT或其他類似工具
方法/步驟
打開secureCRT,連接到資料庫伺服器,使用oracle用戶登錄系統
登錄Oracle: sqlplus / as sysdba
關閉資料庫 SHUTDOWN NORMAL
啟動資料庫 startup
參考 關閉資料庫時的參數:
在shutdown時可選擇關閉模式:NORMAL、TRANSACTIONAL、IMMEDIATE或ABORT
• ABORT:在關閉之前執行的任務最少。由於此模式需要在啟動之前進行恢復,因此只在需要時才使用此模式。當啟動實例時出現了問題,或者因緊急情況(如,通知在數秒內斷電)而需要立即關閉時,如果其它關閉方式都不起作用,通常選擇使用此模式。
• IMMEDIATE:這是最常用選項。選擇此模式會回退未提交的事務處理。
• TRANSACTIONAL:允許事務處理完成
• NORMAL:等待會話斷開
如果考慮執行關閉所花費的時間,則會發現ABORT的關閉速度最快,而NORMAL的關閉速度最慢。NORMAL和TRANSACTIONAL花費的時間較長,具體取決於會話和事務處理的數目。
注意:
在SHUTDOWN NORMAL或SHUTDOWN TRANSACTIONAL或 SHUTDOWN IMMEDIATE 這三個模式下關閉資料庫,則:
關閉時:執行immediate時,會回退未提交的更改;資料庫緩沖區高速緩存,會寫入到數據文件;會釋放資源。
啟動時:不用恢復實例。
在SHUTDOWN ABORT或 實例錯誤 或STARTUP FORCE,則
關閉時:修改過的緩沖區未寫入數據文件;不回退未提交的更改。
啟動時:使用聯機重做日誌文件重新應用更改;使用還原段回退未提交的更改。