ORACLE分析表和索引的指令碼
--analyze.sql
[@more@]
declare
v_per number(3);
v_start number := dbms_utility.get_time;
v_end number;
begin
from user_segments group by segment_name,segment_type)
loop
dbms_stats.gather_index_stats(ownname=>'citictest', --自己改一下
INDNAME=>rec.segment_name
);
v_start := dbms_utility.get_time;
case when rec.segment_size < 32 then
v_per := 100;
when rec.segment_size < 320 then
v_per := 10;
else
v_per := 1;
end case;
dbms_stats.gather_table_stats(OWNNAME=>'citictest',
TABNAME=>rec.segment_name,
ESTIMATE_PERCENT=>v_per,
METHOD_OPT=>'FOR ALL INDEXED COLUMNS');
v_start := dbms_utility.get_time;
end loop;
end;
/
---------------------------------------------------------------------------
SET ECHO OFF;
SET FEEDBACK OFF;
SET VERIFY OFF;
SET PAGESIZE 0;
SET TERMOUT ON;
SET HEADING OFF;
ACCEPT username CHAR PROMPT 'Enter the index username: ';
spool /oracle/rebuild_&username.sql;
SELECT
'REM +-----------------------------------------------+' || chr(10) ||
'REM | INDEX NAME : ' || owner || '.'
[Q]怎麼樣分析表或索引
[A]命令列方式可以採用analyze命令
如Analyze table tablename compute statistics;
Analyze index|cluster indexname estimate statistics;
ANALYZE TABLE tablename COMPUTE STATISTICS
FOR TABLE
FOR ALL [LOCAL] INDEXES
FOR ALL [INDEXED] COLUMNS;
ANALYZE TABLE tablename DELETE STATISTICS
ANALYZE TABLE tablename VALIDATE REF UPDATE
ANALYZE TABLE tablename VALIDATE STRUCTURE
[CASCADE]|[INTO TableName]
ANALYZE TABLE tablename LIST CHAINED ROWS [INTO TableName]
等等。
如果想分析整個使用者或資料庫,還可以採用工具包,可以並行分析
Dbms_utility(8i以前的工具包)
Dbms_stats(8i以後提供的工具包)
如
dbms_stats.gather_schema_stats(User,estimate_percent=>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來收集資訊。
|| lpad('|', 33 - (length(owner) + length(segment_name)) )
|| chr(10) ||
'REM | BYTES : ' || bytes
|| lpad ('|', 34-(length(bytes)) ) || chr(10) ||
'REM | EXTENTS : ' || extents
|| lpad ('|', 34-(length(extents)) ) || chr(10) ||
'REM +-----------------------------------------------+' || chr(10) ||
'ALTER INDEX ' || owner || '.' || segment_name || chr(10) ||
'REBUILD ' || chr(10) ||
'TABLESPACE ' || tablespace_name || chr(10) ||
'STORAGE ( ' || chr(10) ||
' INITIAL ' || initial_extent || chr(10) ||
' NEXT ' || next_extent || chr(10) ||
' MINEXTENTS ' || min_extents || chr(10) ||
' MAXEXTENTS ' || max_extents || chr(10) ||
' PCTINCREASE ' || pct_increase || chr(10) ||
');' || chr(10) || chr(10)
FROM dba_segments
WHERE segment_type = 'INDEX'
AND owner='&username'
ORDER BY owner, bytes DESC;
spool off;
-----------------------------------------------------------------------------
如果你用的是WINDOWS系統, 想改變輸出檔案的存放目錄, 修改spool後面的路徑成:
spool c:oraclerebuild_&username.sql;
如果你只想對大於max_bytes的索引重建索引, 可以修改上面的SQL語句: 在AND owner='&username' 後面加個限制條件 AND bytes> &max_bytes
如果你想修改索引的儲存引數, 在重建索引rebuild_&username.sql裡改也可以. 比如把pctincrease不等於零的值改成是零.
如果你想把index從一個TABLESPACE轉移到另外一個TABLESPACE,也可以修改其中的tablespace_name
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/64429/viewspace-912322/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- oracle 表分析和索引Oracle索引
- Oracle表與索引的分析及索引重建Oracle索引
- Oracle表與索引的分析及索引重建(轉)Oracle索引
- oracle 索引重建提示指令碼Oracle索引指令碼
- 分析表的crontab指令碼指令碼
- oracle 定期表及索引分析Oracle索引
- Oracle堆組織表的索引和索引組織表Oracle索引
- 表及索引 move tablespace 常用指令碼索引指令碼
- Oracle對錶、索引和簇的分析Oracle索引
- Oracle 表的移動和索引的重建Oracle索引
- Oracle 建立表空間和使用者指令碼Oracle指令碼
- 建庫和表的指令碼.sql指令碼SQL
- 【TABLE】Oracle表資訊收集指令碼Oracle指令碼
- 找出冗餘索引的指令碼索引指令碼
- 【SQL】【指令碼】遷移當前使用者下所有表和索引到新表空間SQL指令碼索引
- oracle 索引分析及索引重建Oracle索引
- 監控oracle表空間指令碼Oracle指令碼
- oracle報表自動FTP指令碼OracleFTP指令碼
- Oracle指令碼(Oracle Scripts) – 檢視索引訪問次數及索引訪問型別Oracle指令碼索引型別
- 分析函式的建表指令碼all_sales函式指令碼
- 水煮oracle41----shell指令碼中對oracle的sql*plus和rman工具的指令碼呼叫和嵌入Oracle指令碼SQL
- Oracle 中 誤刪 emp,dept ,恢復 emp 和 dept表的sql指令碼.OracleSQL指令碼
- Analyze分析表或者索引索引
- 批量匯出建立索引的指令碼索引指令碼
- Oracle如何預估將要建立的索引和表的大小Oracle索引
- Oracle 找出需要建立索引的表Oracle索引
- mysql指令碼,新建表和理清表之間的聯絡MySql指令碼
- 【實驗】【analyze】分析特定使用者的表和索引索引
- Oracle表結構轉換SqlSERVER表結構 指令碼OracleSQLServer指令碼
- oracle 巢狀表 索引表 使用Oracle巢狀索引
- oracle 索引組織表Oracle索引
- Oracle表table與索引index的分析及索引重建及統計資訊匯入匯出Oracle索引Index
- Oracle對索引分析的優化Oracle索引優化
- 索引的分析和比較索引
- Oracle 指令碼 線上哪些索引從來沒有被使用過Oracle指令碼索引
- Oralce中分析表及索引索引
- 【eygle】Oracle的分割槽表和Local索引建立與維護Oracle索引
- 監控mysql索引使用效率的指令碼MySql索引指令碼