Freitag, August 09, 2013

CBO: Cardinality-Berechnung für Werte außerhalb des bekannten Wertebereichs

Jonathan Lewis gibt eine kurze Zusammenfassung des in Cost Based Oracle umfassender erläuterten Verfahrens zur Berechnung der Cardinality von Werten die außerhalb des durch LOW_VALUE und HIGH_VALUE (in DBA_TAB_COLS und entsprechenden Views) definierten Bereichs bekannter Werte liegen. Für Gleichheitsprüfungen gilt dabei folgende Formel:
base cardinality * (total range – distance outside ) / (total range)
Die Wahrscheinlichkeit nimmt dabei jenseits der bekannten Werte sukzessive ab und die Cardinality fällt spätestens auf 1, wenn die "distance outside" die "total range" erreicht. Für Range-Pädikate wird eine andere Berechnung verwendet - in diesem Fall gilt:
For the out-of-range range-based predicate, the cardinality is simply the base cardinality of an in-range “column = unknown constant”
Die Größe des Bereichs hat folglich keinen Einfluss auf die Cardinality. Für Ranges, die teilweise außerhalb des bekannten Wertebereichs liegen, wird dabei offenbar nur die Cardinality des bekannten Teilbereichs berücksichtigt:

-- basierend auf dem Beispiel von Jonathan Lewis
-- 12.1.0.1
select * from t1 where n1 between 90 and 200;

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |   178 |  1958 |     4   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| T1   |   178 |  1958 |     4   (0)| 00:00:01 |
--------------------------------------------------------------------------

select * from t1 where n1 between 90 and 100;

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |   178 |  1958 |     4   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| T1   |   178 |  1958 |     4   (0)| 00:00:01 |
--------------------------------------------------------------------------

Diese Berechnungsregeln sind in Oracle 12 offenbar unverändert.

Keine Kommentare:

Kommentar veröffentlichen