Oracle-Datenbank automatisch optimieren

Row Chaining und Row Migration

Die Blockgröße hat auch Einfluss auf Row Chaining und Row Migration. Wenn ein Datensatz eingefügt wird und die Größe eines Datenblocks übersteigt, dann wird er in mehreren Blöcken untergebracht. Dieser Vorgang wird als Row Chaining bezeichnet.

Row Chaining ist schlecht für die Performance, da mehrere Blöcke für einen Satz gelesen werden müssen.

Vermeiden Sie Row Chaining, indem Sie eine hinreichend große Blockgröße wählen. In Oracle 10g können Tablespaces mit verschiedenen Blockgrößen in einer Datenbank verwaltet werden.

Row Migration tritt auf, wenn ein Datensatz geändert wird und der geänderte Satz so groß wird, dass er nicht mehr in den Block passt. Da die ROWID identisch bleiben muss, verschiebt Oracle in diesem Fall den kompletten Datensatz in einen neuen Block.

Row Migration ist schlecht für die Performance, da eine Menge Overhead mit der Verschiebung des Datensatzes in einen neuen Block ausgelöst wird. Sie können Row Migration vermeiden, indem Sie den Parameter PCTFREE erhöhen.

Mit der Abfrage in folgendem Listing können Sie herausfinden, ob Row Chaining oder Row Migration in Ihrer Datenbank ein Problem ist.

SQL> SELECT table_name, chain_cnt
2 FROM dba_tables
3 WHERE chain_cnt > 0;
TABLE_NAME CHAIN_CNT
-------------------- ----------
HOUSEHOLD_FACTS 134

Die Spalte CHAIN_CNT im View DBA_TABLES wird nur gefüllt, wenn die Tabellen analysiert sind. Tabellen können einzeln mit dem ANALYZE-Befehl analysiert werden. Sie können alternativ ein komplettes Schema mit der Prozedur ANALYZE_SCHEMA analysieren.

SQL> ANALYZE TABLE dwh.household_facts COMPUTE STATISTICS;
Tabelle wurde analysiert.
SQL> EXEC dbms_utility.analyze_schema('DWH','COMPUTE');
PL/SQL-Prozedur wurde erfolgreich abgeschlossen.

Oracle liefert das Skript utlchain.sql aus, mit dessen Hilfe Sie Row Chaining identifizieren und beseitigen können.