Der Serverparameter db_file_multiblock_read_count ist einer von denjenigen, die es seit dem großen Re-Write des Oracle-Codes mit Version 6 bis in heutige Versionen geschafft haben. Bei Parametern dieser Art lauert eine Gefahr: Man denkt, den Parameter und sein Verhalten zu kennen – aber im Kleingedruckten einer neuen Oracle-Version tauchen dann plötzlich Änderungen auf, die einem das DBA-Leben manchmal schwer machen können.
So geschehen mit dem eben genannten Parameter. Zunächst ein Blick auf die bekannte Funktionalität aus früheren Versionen: Mit dem Parameter db_file_multiblock_read_count stellt man ein, wie viele Datenbankblöcke bei einem Full Table Scan (FTS) mit einem IO gelesen werden. Daraus ergeben sich zwei Dinge:
- Je höher der Parameter eingestellt ist, desto schneller werden FTSs bearbeitet (im Rahmen der Möglichkeiten des IO-Systems).
- Dabei werden bei der Ermittlung der Ausführungspläne gleichzeitig FTS-Pläne wahrscheinlicher als Index-Pläne (da der Optimizer u.a. die Anzahl der IOs in seine Berechnung einbezieht).
Somit steckt man in der Zwickmühle: Für große FTSs müsste der Parameter recht groß eingestellt werden; gute Ausführungspläne bekommt man meist nur bei einer Einstellung von 8 oder 16.
Dies hat sich seit Oracle 10g geändert: Wenn man den Parameter nicht explizit setzt, so bekommt man einen Wert für db_file_multiblock_read_count, der 1MB entspricht (also 128 bei einer Blockgröße von 8KB). Aber: Dieser Wert wirkt sich nicht negativ im Hinblick auf Index-Ausführungspläne aus! Setzt man jedoch den Parameter explizit, so verhält sich das RDBMS wie gewohnt und präferiert FTSs.
Es ist tatsächlich so: Das RDBMS zeigt unterschiedliches Verhalten bei gleichem Parameterwert; der Unterschied ist, ob der Parameter explizit oder implizit gesetzt wird!
Daher lautet die Standardempfehlung ab Oracle 10g für diesen Paramerter: db_file_multiblock_read_count aus der Parameterdatei entfernen! (Natürlich lautet die Empfehlung für produktive Systeme, jede Parameteränderung ausgiebig zu testen!)
Eine Frage am Rande ist nun noch: Wie finde ich bei einem laufenden System heraus, ob der Wert implizit oder explizit gesetzt worden ist? Die Antwort liefert die View V$SYSTEM_PARAMETER: Wenn in der Spalte ISDEFAULT der Wert TRUE steht, ist der Parameter nicht in der Parameterdatei vorhanden. Arbeitet man mit einem SPFILE, so kann man auch auf die Spalte ISSPECIFIED der View V$SPPARAMETER zurückgreifen.
Weitere Informationen hierzu findet man in My Oracle Support Dokument 841444.1.