Tach!
- Nein, weil es zu einem vermeidbaren Fulltablescan führt.
Noch ein bisschen generelle Erläuterung dazu. Wenn man auf einen Wert in einem Feld nicht direkt zugreifen kann, sondern erst eine Funktion aufrufen muss, um den gewünschten Teilwert zu erhalten, erzeugt das meistens einen Full-Table-Scan. Das ist nicht weiter tragisch, wenn man nur wenige Datensätze hat. "Viel" fängt mit heutiger Rechenleistung aber auch meist erst bei 6- bis 7-stelligen Mengen an. Man muss es aber trotzdem nicht auf einen Full-Table-Scan ankommen lassen. Generell gilt, dass Felder, in denen (besonders häufig) gesucht wird, einen Index bekommen sollen. Damit der Index aber genutzt werden kann, muss die Bedingung eingehalten werden, dass man direkt darin nachschlagen kann, ohne zu rechnen.
Bei Datumsgeschichten kann man auch in der Query selbst rechnen, dann aber im feststehenden Teil. Das heißt, beispielsweise mit der Nutzereingabe, aber nicht mit dem Feld. Um Daten eines Monats zu berücksichtigen also nicht Jahr und Monat aus dem Feld extrahieren, sondern Anfang und Ende des gesuchten Zeitraums errechnen. Das muss das DBMS lediglich einmal tun, denn die Nutzereingabe ändert sich ja im Verlaufe der Statement-Abarbeitung nicht. Nun kann das DBMS mit dem Feld beziehungsweise dessen Index über einfache Vergleichsoperationen auf das Einhalten dieser Grenzen prüfen.
dedlfix.