Optimizerprobleme


Indexzugriff auf Teilfelder eines Datetime-Feldes
Die folgende SET EXPLAIN Ausgabe suggeriert, daß der Informix-Optimizer auch auf Teilfelder eines
Datetime-Feldes mittels Index zugreifen kann:
QUERY: (OPTIMIZATION TIMESTAMP: 12-28-2009 22:30:00)
------
select bfa.zeitpunkt from bfa where extend (zeitpunkt, year to month) = "2006-01"

Estimated Cost: 57839
Estimated # of Rows Returned: 154482

  1) cw.bfa: INDEX PATH

    (1) Index Name: cw.bfa_zeitpunkt
        Index Keys: zeitpunkt   (Key-Only)  (Serial, fragments: ALL)
        Index Key Filters:  (EXTEND (cw.bfa.zeitpunkt ,year to month) = datetime(2006-01) year to month )

Die Ausgabe des Optimizers ändert sich aber, wenn man ein weiteres Feld der Tabelle bfa hinzunimmt:

QUERY: (OPTIMIZATION TIMESTAMP: 12-29-2009 15:28:43)
------
select zeitpunkt, forum_autoren_nr from bfa  where extend (zeitpunkt, year to month) = "2006-01"

Estimated Cost: 930901
Estimated # of Rows Returned: 154482

  1) cw.bfa: SEQUENTIAL SCAN

        Filters: EXTEND (cw.bfa.zeitpunkt ,year to month) = datetime(2006-01) year to month

In dem Statement

select bfa.zeitpunkt from bfa where extend (zeitpunkt, year to month) = "2006-01"

wurde allerdings nur deshalb der Index benutzt, weil hier nur das Indexfeld selbst gesucht wurde. Dabei ist natürlich
der Lauf über den Index schneller als ein sequentieller Lauf über alle Sätze. Im 2.Statement dagegen wird das
Feld forum_autoren_nr hinzugenommen, so daß ein Lauf über den Index alleine nur dann etwas
nützen würde, wenn der Filter

where extend (zeitpunkt, year to month) = "2006-01"

den Index nutzen würde, was aber nicht der Fall ist.

Grundsätzlich gilt: Die Extension "year to month" ist kein Teilfeld eines aus mehreren Feldern zusammengesetzten
Index, sondern lediglich eine Teilzeichenkette des aus einem einzigen Feld bestehenden Index. Und diese
Teilzeichenkette kann vom Index natürlich nicht benutzt werden.
Ein Ausweg aus dieser Situation wäre die Generierung eines zusätzlichen Feldes, in welchem "year to month"
gespeichert wird.

Kommentar hinzufügen

Der Inhalt dieses Feldes wird nicht öffentlich zugänglich angezeigt.
CAPTCHA
Diese Frage dient dazu festzustellen, ob Sie ein Mensch sind und um automatisierte SPAM-Beiträge zu verhindern.
7 + 3 =
Lösen Sie dieses einfache mathematische Problem und geben Sie das Ergebnis ein. Für 1 + 3 geben Sie z.B. 4 ein.