国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > Oracle > 正文

ORACLE學習筆記--性能優化(1)

2024-08-29 13:34:52
字體:
來源:轉載
供稿:網友
1. 查詢正在執行語句的執行計劃(也就是實際語句執行計劃)

select * from v$sql_plan where hash_value = (select sql_hash_value from v$session where sid = 1111);

其中id和parent_id表示了執行數的結構,數值最大的為最先執行比如 ID  PARENT_ID   

-------------   

0

1 0

2 1

3 2

4 3

5 4

6 3   則執行計劃樹為

0

1

2

3

6     4 

5

2.如何設置自動跟蹤

用system登錄

執行$Oracle_HOME/rdbms/admin/utlXPlan.sql創建計劃表

執行$ORACLE_HOME/sqlplus/admin/plustrce.sql創建plustrace角色

假如想計劃表讓每個用戶都能使用,則

SQL>create public synonym plan_table for plan_table;

SQL> grant all on plan_table to public;假如想讓自動跟蹤的角色讓每個用戶都能使用,則

SQL> grant plustrace to public;

通過如下語句開啟/停止跟蹤

SET AUTOTRACE ON OFF ON EXPLAIN ON STATISTICS TRACEONLY TRACEONLY EXPLAIN3.如何跟蹤自己的會話或者是別人的會話

跟蹤自己的會話很簡單

Alter session set sql_trace truefalse

Or

Exec dbms_session.set_sql_trace(TRUE);假如跟蹤別人的會話,需要調用一個包

exec dbms_system.set_sql_trace_in_session(sid,serial#,truefalse)跟蹤的信息在user_dump_dest 目錄下可以找到或通過如下腳本獲得文件名稱(適用于Win環境,假如是unix需要做一定修改)

SELECT p1.value'/'p2.value'_ora_'p.spid'.ora' filename

FROM

v$PRocess p,

v$session s,

v$parameter p1,

v$parameter p2

WHERE p1.name = 'user_dump_dest'

AND p2.name = 'db_name'

AND p.addr = s.paddr

AND s.audsid = USERENV ('SESSIONID')

最后,可以通過Tkprof來解析跟蹤文件,如

Tkprof 原文件 目標文件 sys=n4.怎么設置整個數據庫系統跟蹤

其實文檔上的alter system set sql_trace=true是不成功的,但是可以通過設置事件來完成這個工作,作用相等

alter system set events

'10046 trace name context forever,level 1';假如關閉跟蹤,可以用如下語句

alter system set events

'10046 trace name context off';其中的level 1與上面的8都是跟蹤級別

level 1:跟蹤SQL語句,等于sql_trace=true

level 4:包括變量的具體信息

level 8:包括等待事件

level 12:包括綁定變量與等待事件5.怎么樣根據OS進程快速獲得DB進程信息與正在執行的語句

有些時候,我們在OS上操作,象TOP之后我們得到的OS進程,怎么快速根據OS信息獲得DB信息呢?

我們可以編寫如下腳本:

$more whoit.sh

#!/bin/sh

sqlplus /nolog 100,cascade=> TRUE);

dbms_stats.gather_table_stats(User,TableName,degree => 4,cascade => true);
這是對命令與工具包的一些總結

<1>、對于分區表,建議使用DBMS_STATS,而不是使用Analyze語句。

 a) 可以并行進行,對多個用戶,多個Table

 b) 可以得到整個分區表的數據和單個分區的數據。

 c) 可以在不同級別上Compute Statistics:單個分區,子分區,全表,所有分區

 d) 可以倒出統計信息

 e) 可以用戶自動收集統計信息

<2>、DBMS_STATS的缺點

 a) 不能Validate StrUCture

 b) 不能收集CHAINED ROWS, 不能收集CLUSTER TABLE的信息,這兩個仍然需要使用Analyze語句。

 c) DBMS_STATS 默認不對索引進行Analyze,因為默認Cascade是False,需要手工指定為True

<3>、對于oracle 9里面的External Table,Analyze不能使用,只能使用DBMS_STATS來收集信息。6.怎么樣快速重整索引

通過rebuild語句,可以快速重整或移動索引到別的表空間

rebuild有重建整個索引數的功能,可以在不刪除原始索引的情況下改變索引的存儲參數

語法為

alter index index_name rebuild tablespace ts_name

storage(......);假如要快速重建整個用戶下的索引,可以用如下腳本,當然,需要根據你自己的情況做相應修改

SQL> set heading off

SQL> set feedback off

SQL> spool d:/index.sql

SQL> SELECT 'alter index ' index_name ' rebuild '

'tablespace INDEXES storage(initial 256K next 256K pctincrease 0);'

FROM all_indexes

WHERE ( tablespace_name != 'INDEXES'

OR next_extent != ( 256 * 1024 )

)

AND owner = USER

SQL>spool off另外一個合并索引的語句是

alter index index_name coalesce這個語句僅僅是合并索引中同一級的leaf block,消耗不大,對于有些索引中存在大量空間浪費的情況下,有一些作用。7.如何使用Hint提示

在select/delete/update后寫/*+ hint */

如 select /*+ index(TABLE_NAME INDEX_NAME) */ col1...注重/*和+之間不能有空格,如用hint指定使用某個索引

select /*+ index(cbotab) */ col1 from cbotab;

select /*+ index(cbotab cbotab1) */ col1 from cbotab;

select /*+ index(a cbotab1) */ col1 from cbotab a;其中

TABLE_NAME是必須要寫的,且假如在查詢中使用了表的別名,在hint也要用表的別名來代替表名;

INDEX_NAME可以不必寫,Oracle會根據統計值選一個索引;

假如索引名或表名寫錯了,那這個hint就會被忽略;8.怎么樣快速復制表或者是插入數據

快速復制表可以指定Nologging選項

如:Create table t1 nologging

as select * from t2;快速插入數據可以指定append提示,但是需要注重noarchivelog模式下,默認用了append就是nologging模式的。 在archivelog下,需要把表設置程Nologging模式。

如insert /*+ append */ into t1

select * from t2注重:假如在9i環境中并設置了FORCE LOGGING,則以上操作是無效的,并不會加快,當然,可以通過如下語句設置為NO FORCE LOGGING。

Alter database no force logging;

是否開啟了FORCE LOGGING,可以用如下語句查看

SQL> select force_logging from v$database;9.怎么避免使用特定索引

在很多時候,Oracle會錯誤的使用索引而導致效率的明顯下降,我們可以使用一點點技巧而避免使用不該使用的索引,如:

表test,有字段a,b,c,d,在a,b,c上建立聯合索引inx_a(a,b,c),在b上單獨建立了一個索引Inx_b(b)。在正常情況下,where a=? and b=? and c=?會用到索引inx_a,where b=?會用到索引inx_b,但是,where a=? and b=? and c=? group by b會用到哪個索引呢?在分析數據不正確(很長時間沒有分析)或根本沒有分析數據的情況下,oracle往往會使用索引inx_b。通過執行計劃的分析,這個索引的使用,將大大耗費查詢時間。
當然,我們可以通過如下的技巧避免使用inx_b,而使用inx_a。where a=? and b=? and c=? group by b'' --假如b是字符

where a=? and b=? and c=? group by b+0 --假如b是數字通過這樣簡單的改變,往往可以是查詢時間提交很多倍

當然,我們也可以使用no_index提示,相信很多人沒有用過,也是一個不錯的方法:

select /*+ no_index(t,inx_b) */ * from test t

where a=? and b=? and c=? group by b舉例:

本來在CM_USER上有索引IDX_CM_USER4(ACC_ID)和IDX_CM_USER8(BILL_ID),可是執行如下語句的時候很慢。

select * from CM_USER where  acc_id =1200007175

and user_status>0 and bill_id like '13%' order by acc_id,bill_id用explain分析,發現執行計劃是用IDX_CM_USER8.如下查詢

select * from user_indexes where table_name ='CM_USER' 發現IDX_CM_USER8沒有分析過。用下面語句執行計劃改變

select /*+INDEX(CM_USER IDX_CM_USER4)*/* from CM_USER where  acc_id =1200007175 and user_status>0 and bill_id like '13%' order by acc_id,bill_id或者分析索引

exec dbms_stats.gather_index_stats(ownname => 'QACS1',indname => 'IDX_CM_USER8',estimate_percent => 5 );

可以發現執行計劃恢復正常。


10.Oracle什么時候會使用跳躍式索引掃描

這是9i的一個新特性跳躍式索引掃描(Index Skip Scan).

例如表有索引index(a,b,c),當查詢條件為where b=?的時候,可能會使用到索引index(a,b,c),如,執行計劃中出現如下計劃:

INDEX (SKIP SCAN) OF 'TEST_IDX' (NON-UNIQUE)Oracle的優化器(這里指的是CBO)能對查詢應用Index Skip Scans至少要有幾個條件:

<1> 優化器認為是合適的。

<2> 索引中的前導列的唯一值的數量能滿足一定的條件(如重復值很多

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 尚志市| 疏附县| 共和县| 富锦市| 调兵山市| 永吉县| 临潭县| 略阳县| 江门市| 德令哈市| 永济市| 金溪县| 虞城县| 永福县| 平江县| 凭祥市| 龙州县| 枝江市| 武城县| 安平县| 共和县| 敦化市| 枣强县| 微山县| 沅江市| 罗江县| 买车| 林口县| 钟山县| 元氏县| 洪洞县| 梅河口市| 大埔区| 略阳县| 新巴尔虎左旗| 库尔勒市| 阿瓦提县| 于都县| 渝北区| 绿春县| 南雄市|