6. Juli 201015 j Hi, ich mache einen einfachen selekt auf eine Tabelle: SELECT * FROM table WHERE creation_date > 20100416164036513; Die Spalte "creation_date" ist indiziert, der Index wird aber nicht gezogen. Der Ausführungsplan sieht so aus: QUERY_PLAN TABLE ACCESS FULL table Wenn ich den select mit "=" starte, zieht Oracle den Index: SELECT * FROM table WHERE creation_date = 20100416164036513; TABLE ACCESS BY INDEX ROWID table INDEX RANGE SCAN IDX$$_164B0001 Muss ich bei "größer als" anders indizieren, oder macht die Verwendung eines Index für den Optimierer keinen Sinn, da zu viele Zeilen gefunden werden? Danke! Bearbeitet 6. Juli 201015 j von meht
6. Juli 201015 j Hi, kann natürlich sein, dass die Kosten für einen Full Table Scan niedriger sind als für die Benutzung des Indexes. Vielleicht fehlen Statistiken zu dem Index? Ansonsten versuch mal einen Hint, damit der Index auf jeden Fall genutzt wird, und vergleiche die Kosten mit dem FTS: OTN Discussion Forums : use Hint to force using index does not ...
6. Juli 201015 j Hier werden gleich zwei Fehler gemacht. 1. Du speicherst ein Datum als String ab. Warum? 2. Du gehst davon aus, dass ein Indexzugriff immer schneller ist als ein FTS. Vergleiche einen Index mit einem Stichwortverzeichnis. Wenn Du nur zu ein paar Wörtern die Inhalte heraussuchen möchtest, geht das über das Stichwortverzeichnis natürlich sehr schnell. Musst Du aber für sehr viele Wörter nachschlagen, kommt Du irgendwann an einen Punkt, an dem es schneller ist, dass Buch einfach von vorne bis hintern durchzublättern anstatt für jedes Wort einzeln nachzuschlagen. Der Optimizer greift, davon abgesehen, noch auf einige Feinheiten wie Histogramme, Cachverhalten, Geschwindigkeit der Platten und CPUs etc. zu, die in die Berechnung mit einfließen. Dim
Archiv
Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.