oracle 學習筆記---效能優化(2)

zhengbao_jun發表於2010-08-04

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 wner = 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;

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/235507/viewspace-670208/,如需轉載,請註明出處,否則將追究法律責任。

相關文章