have an option to reorganize (or defragement) the table by traditional export/truncate/import method, i.e., exporting data from affected table, truncate the
table, then importing data back to the table.
There is an “alter table table_name move” command that you can use to defragment tables.
Note: This method does not apply to tables with with 'LONG' columns.
--------detecting chained row-----
SELECT owner, table_name, chain_cnt FROM dba_tables WHERE chain_cnt > 0;
List Chained Rows
Creating a CHAINED_ROWS Table
@D:\oracle\product\10.2.0\db_1\RDBMS\ADMIN\utlchain.sql will create following table
create table CHAINED_ROWS (
owner_name varchar2(30),
table_name varchar2(30),
cluster_name varchar2(30),
partition_name varchar2(30),
subpartition_name varchar2(30),
head_rowid rowid,
analyze_timestamp date
);
SELECT owner_name,table_name, head_rowid FROM chained_rows;
-------------------
SELECT dbms_rowid.rowid_block_number(rowid) "Block-Nr", count(*) "Rows"
FROM
GROUP BY dbms_rowid.rowid_block_number(rowid) order by 1;
SELECT chain_cnt,
round(chain_cnt/num_rows*100,2) pct_chained,
avg_row_len, pct_free , pct_used
FROM user_tables
WHERE TABLE_NAME IN (
SELECT distinct table_name FROM CHAINED_ROWS);
If the table includes LOB column(s), this statement can be used to move the table along with LOB data and LOB index segments (associated with this table)
which the user explicitly specifies. If not specified, the default is to not move the LOB data and LOB index segments.
---------------------------Detect all Tables with Chained and Migrated Rows------------------------
1) Analyze all or only your Tables
SELECT 'ANALYZE TABLE '||table_name||' LIST CHAINED ROWS INTO CHAINED_ROWS;' FROM user_tables;
Analyze only chained rows tables
SELECT owner, table_name, chain_cnt FROM dba_tables WHERE owner='LDBO' and chain_cnt > 0;
set heading off;
set feedback off;
set pagesize 1000;
spool C:\temp\chained_statistics.sql;
SELECT 'ANALYZE TABLE ' ||table_name||' LIST CHAINED ROWS INTO CHAINED_ROWS;'
FROM dba_tables WHERE owner='LDBO' and chain_cnt > 0;
spool off
2) Alter Table ......Move
set heading off;
set feedback off;
set pagesize 1000;
spool C:\temp\defrag.sql;
SELECT DISTINCT 'ALTER TABLE ' ||table_name|| FROM CHAINED_ROWS;
spool off
or
select sum(bytes/1024/1024) "FOR INITIAL VALUE OR MORE"
from dba_segments
where owner = 'LDBO'
and segment_name = 'TBLOPTIONACCESSHISTORY';
SELECT DISTINCT 'ALTER TABLE ' ||table_name||' MOVE PCTFREE 20 PCTUSED 40 STORAGE (INITIAL 20K NEXT 40K MINEXTENTS 2 MAXEXTENTS 20 PCTINCREASE 0);' FROM
CHAINED_ROWS;
3) Rebuild Indexes because these tables’s indexes are in unstable state.
connect deltek/xxx@fin;
set heading off;
set feedback off;
set pagesize 1000;
spool C:\temp\rebuild_index.sql;
SELECT 'ALTER INDEX ' ||INDEX_NAME||' REBUILD;' FROM DBA_INDEXES WHERE TABLE_NAME IN ( SELECT distinct table_name FROM CHAINED_ROWS);
spool off
4) Analyze Tables for compute statistics after defragmentation
set heading off;
set feedback off;
set pagesize 1000;
spool C:\temp\compute_stat.sql;
SELECT 'ANALYZE TABLE '||table_name||' COMPUTE STATISTICS;' FROM user_tables WHERE TABLE_NAME IN ( SELECT distinct table_name FROM CHAINED_ROWS);
spool off
5) Show the RowIDs for all chained rows
This will allow you to quickly see how much of a problem chaining is in each table. If chaining is prevalent in a table, then that table should be rebuild
with a higher value for PCTFREE
SELECT owner_name,
table_name,
count(head_rowid) row_count
FROM chained_rows
GROUP BY owner_name,table_name
/
6) SELECT owner, table_name, chain_cnt FROM dba_tables WHERE chain_cnt > 0;
SELECT dbms_rowid.rowid_block_number(rowid) "Block-Nr", count(*) "Rows"
FROM row_mig_chain_demo
GROUP BY dbms_rowid.rowid_block_number(rowid) order by 1;
delete FROM chained_rows;
No comments:
Post a Comment