Bereichsbedingungen sind Suchbedingungen mit Vergleichsprädikat oder BETWEEN-Prädikat. Für den SQL-Optimierer gelten folgende Einschränkungen für Bereichsbedingungen:
● Operatoren sind nur die Vergleichsoperatoren < | <= | => | > und der Operator BETWEEN
●
Bereichsbedingungen haben eine der
folgenden Formen:
<column_spec>
< < | <= |
=> | > > <extended_value_spec>
oder
<column_spec>
BETWEEN
<extended_value_spec> AND
<extended_value_spec>
Nur Bereichsbedingungen, die diesen Festlegungen genügen, kann der SQL-Optimierer zum Ermitteln einer optimalen Suchstrategie auswerten.
Ob der Bereich durch einen BETWEEN-Operator oder durch Kombination der Vergleichsoperatoren <= und => begrenzt wird, ist für die Suchstratgie unerheblich.
Bedingungen der folgenden Form werden, wenn möglich, in einen Ausdruck ohne NOT mit entsprechend negiertem Operator überführt:
...NOT (<column_spec> < < | <= | => | > > <extended_value_spec>)
...NOT (<column_spec> NOT BETWEEN <extended_value_spec> AND <extended_value_spec>)
Die umgeformte Bedingung wird dann vom SQL-Optimierer weiterverarbeitet.
Die bei den Erläuterungen zum SQL-Optimierer verwendeten Beispiele stützen sich auf die Demo-Datenbank DEMODB und ihre vollständigen Demo-Daten im Schema HOTEL.
Konzepte des Datenbanksystems, Objekte im Schema HOTEL
SELECT * FROM hotel.customer
WHERE name BETWEEN 'B' AND 'P' AND
firstname = 'Greg'
Qualifikation: name BETWEEN
'B' AND 'P' And firstname = 'Greg'
Primärschlüssel der Tabelle CUSTOMER: cno
Indizes über qualifizierte Spalten: FULL_NAME_INDEX (name,
firstname)
genutzte Suchstrategie: TABLE
SCAN
Der Index FULL_NAME_INDEX (name, firstname) könnte genutzt werden, da für die Spalten NAME und FIRSTNAME eine Bereichs- (BETWEEN) und eine Gleichheitsbedingung angegeben wurde. Ein TABLE SCAN wird hier gewählt, da bei einem Index-Zugriff anschließend auch auf die Basistabelle zugegriffen werden muss. Ab einer bestimmten Größe des Bereichs fallen dadurch zu viele Lesekosten an. Bei einem TABLE SCAN entfallen die Lesekosten des Index.
Ergebnis der EXPLAIN-Anweisung
TABLENAME |
COLUMN_OR_INDEX |
STRATEGY |
PAGECOUNT |
CUSTOMER |
FULL_NAME_INDEX |
RANGE CONDITION FOR INDEX |
40 |
|
|
RESULT IS NOT COPIED, |
|
Weitere einfache Beispiel-SQL-Anweisungen
finden Sie im SQL-Tutorial.
Siehe auch:
SQL-Referenzhandbuch, Vergleichsprädikat (comparison_predicate), BETWEEN-Prädikat (between_predicate)