Was sind häufige Fehler bei der Datenbankentwicklung, die von Anwendungsentwicklern gemacht werden?
Antworten
Zu viele Anzeigen?Schlechte Leistung verursacht durch korrelierte Unterabfragen
In den meisten Fällen sollten Sie korrelierte Unterabfragen vermeiden. Eine Unterabfrage ist korreliert, wenn innerhalb der Unterabfrage ein Verweis auf eine Spalte aus der äußeren Abfrage vorhanden ist. In diesem Fall wird die Unterabfrage für jede zurückgegebene Zeile mindestens einmal ausgeführt, und sie könnte noch öfter ausgeführt werden, wenn nach der Bedingung, die die korrelierte Unterabfrage enthält, andere Bedingungen angewendet werden.
Verzeihen Sie das konstruierte Beispiel und die Oracle-Syntax, aber nehmen wir an, Sie möchten alle Mitarbeiter finden, die in einer Ihrer Filialen eingestellt wurden, seit die Filiale das letzte Mal weniger als 10.000 $ Umsatz an einem Tag gemacht hat.
select e.first_name, e.last_name
from employee e
where e.start_date >
(select max(ds.transaction_date)
from daily_sales ds
where ds.store_id = e.store_id and
ds.total < 10000)
Die Unterabfrage in diesem Beispiel ist über die store_id mit der äußeren Abfrage korreliert und würde für jeden Mitarbeiter in Ihrem System ausgeführt werden. Eine Möglichkeit, diese Abfrage zu optimieren, besteht darin, die Unterabfrage in eine Inline-Ansicht zu verschieben.
select e.first_name, e.last_name
from employee e,
(select ds.store_id,
max(s.transaction_date) transaction_date
from daily_sales ds
where ds.total < 10000
group by s.store_id) dsx
where e.store_id = dsx.store_id and
e.start_date > dsx.transaction_date
In diesem Beispiel ist die Abfrage in der from-Klausel nun eine Inline-Ansicht (wieder eine Oracle-spezifische Syntax) und wird nur einmal ausgeführt. Abhängig von Ihrem Datenmodell wird diese Abfrage wahrscheinlich viel schneller ausgeführt. Sie würde mit zunehmender Anzahl der Mitarbeiter besser funktionieren als die erste Abfrage. Die erste Abfrage könnte sogar besser funktionieren, wenn es nur wenige Mitarbeiter und viele Filialen gäbe (und vielleicht viele der Filialen keine Mitarbeiter hätten) und die Tabelle daily_sales auf store_id indiziert wäre. Dies ist kein wahrscheinliches Szenario, zeigt aber, wie eine korrelierte Abfrage möglicherweise besser abschneiden könnte als eine alternative.
Ich habe schon oft erlebt, dass Junior-Entwickler Unterabfragen korrelieren, und das hat in der Regel erhebliche Auswirkungen auf die Leistung. Wenn Sie jedoch eine korrelierte Unterabfrage entfernen, achten Sie darauf, dass Sie die Plan erläutern vorher und nachher, um sicherzustellen, dass Sie die Leistung nicht verschlechtern.
Verwendung von Access anstelle einer "echten" Datenbank. Es gibt viele großartige kleine und sogar kostenlose Datenbanken wie SQL Express , MySQL y SQLite die viel besser funktionieren und skalierbar sind. Apps müssen oft auf unerwartete Weise skaliert werden.