einfach das Hinzufügen von Farbe Antwort auf Gordon (was ist die richtige Antwort und sollte so markiert werden).
Erstens kann es Ihnen helfen, zu lernen, wie man EXPLAIN PLAN benutzt. In Toad oder SQL Developer (wenn Sie eines dieser Frontends verwenden, um mit Ihrer Datenbank zu interagieren), ist es so einfach wie das Ausführen einer Abfrage - Sie klicken einfach auf eine andere Schaltfläche und Sie erhalten den EXPLAIN PLAN.
Erste Frage: Wenn Sie ein Datum innerhalb von to_date (to_char (...), ...) mit einer identischen und vollständigen Maske für beide Funktionen umbrechen, ist der Optimierer intelligent genug, um dies zu erkennen und beide Funktionen zu entfernen nur dieses Datum verwenden? Antwort: NEIN; EXPLAIN PLAN zeigt, dass das Prädikat nicht wie hier vorgeschlagen vereinfacht ist. Es zeigt auch, dass date_column > SYSDATE
10 einen Index verwendet, aber wenn Sie die Datumsspalte in to_date (to_char (.....)) umbrechen, führt die Engine einen vollständigen Tabellenscan durch (es wird NICHT den Index verwenden).
Zweite Frage: Könnte die Ungleichung dieses Problem auch ohne die Funktionsaufrufe verursachen? Der Vergleich der Datumsspalte (indexiert, nicht in Funktionen eingeschlossen) mit SYSDATE verwendet den Index.
Vergleicht man zwei Spalten, die erste ist Primärschlüssel und die zweite ist NICHT INDEXED, führt zu einem vollständigen Scan (verursacht durch den Vergleich, ohne Funktionen um jede Spalte).
Hilft ein Index für die andere Spalte (zusätzlich zum Primärschlüssel in der ersten Spalte) mit einem Ungleichheitsfilter? Antwort: Nein. Nachdem Sie einen Index für die zweite Spalte erstellt und EXPLAIN PLAN erneut ausgeführt haben, wird die Tabelle weiterhin vollständig gescannt. Genau wie Gordon erklärte.
Warum führen Sie eine Datum-zu-String-Back-to-Date-Konvertierung überhaupt durch? 'to_date (to_char (x))'. Scheint das nicht überflüssig? Und ich sehe 2 Spalten in Ihrer 'where' Klausel referenziert werden. Sind sie beide vom gleichen Typ? Sind beide indexiert?Welchen Index würden Sie vom Optimierer erwarten (unklar ohne vollständige Abfrage). Und schließlich, was ist der tatsächliche Oracle-Datentyp Ihrer 2 Spalten? Ich weiß nicht, was Sie mit "UTC Date Time" meinen. – sstan
Das habe ich auch herausgefunden. Beide haben den gleichen Datentyp, also keinen Grund TO_DATE (TO_CHAR) zu machen, aber ich habe das an vielen Stellen gesehen. Gibt es einen möglichen Grund dafür, frage ich mich. –