Wenn ich eine SQL-Abfrage habe, die 'distinct' (in oracle) verwendet, wäre es schneller als das Abrufen des nicht-distinct dann die einzigartigen Ergebnisse über Java-Programmierung erhalten?
Ich habe irgendwo gehört, dass oracle sql distinct schwer ist, aber ist es schwerer als manuelle "Unterscheidung" durch Java-Programmierung?
Danke, Franz
Die Daumenregel ist, dass die Daten in der Datenbank schneller verarbeitet werden als in Ihrer Programmiersprache.
Der Grund dafür ist, dass die Daten bereits in der Datenbank verfügbar sind und der Aufwand für den Zugriff auf Ihre App reduziert wird:
Da Oracle DISTINCT
schwer ist, kann es bedeuten, nie einfach eine DISTINCT
in eine Abfrage zu werfen, nur weil es eine gute Idee zu sein scheint - profiliere sie mit realistischen Daten festgelegt, da es schwerwiegende Auswirkungen auf die Leistung haben kann.
Zwei Hauptaspekte:
Ich wäre sehr überrascht zu sehen, dass das Holen aller Daten und das Ausführen einer bestimmten Operation in Java schneller war als das in der Datenbank.
Wenn Ihre Anwendung dies schneller als die Datenbank ausführen kann, ist die Datenbank ernsthaft beschädigt (außer wenn die Anwendung auf einem erheblich schnelleren Computer ausgeführt wird). Natürlich muss die Datenbank etwas arbeiten (entweder durch Sortierung oder Verwendung von Hashtabellen, um Dubletten zu eliminieren), aber auch Ihre Anwendung!
Es ist fast immer falsch, Aufgaben in der Anwendung zu erledigen, die die Datenbank gut kann.
allgemeine Regel: Lässt die Datenbank den Job der Datenbank erledigen, Sie sparen Speicher, Netzwerk, CPU auf Ihrer Seite. Die meisten dieser Ressourcen werden entweder auf der Datenbankseite ausgegeben, aber es wurden große Optimierungen vor der Produktion gemacht, also - gib ihrer Mutter ein Baby ...
Damals, als Tiere noch auf ihren Atari-Spielen redeten und spielten, war das Erstellen von nicht benötigtem Netzwerk-Traffic eine SCHLECHTE DINGE.
Es wurde einfach nicht mehr Daten abgerufen als benötigt. Der einzige Grund, warum ich sehen kann, alle Daten zu bekommen und sie in Java zu manipulieren, um eindeutige Werte zu erhalten, ist, wenn Sie die anderen Daten auch etwas später benötigen. Also um es zu cachen.
Hinweis: Das ist nicht dasselbe wie zu sagen, alles auf dem Server zu tun, Datenmanipulationen in einer Umgebung mit mehr Unterstützung für die Datenmanipulation durchzuführen kann eine gute Sache sein. Fragen Sie nicht nach mehr Daten als Sie benötigen (Caching als eine bemerkenswerte Ausnahme)
Oracle 9 und Oracle 10 führen eine unterschiedliche Operation anders aus, Oracle 9 sortiert, Oracle 10 Hashes. Es ist möglich, dass Java in einigen ausgewählten Fällen die Unterscheidung schneller als Oracle 9, aber langsamer als Oracle 10 durchführen kann.
Ich denke, Oracle kann es schneller machen. Siehe Jon Skeets Antwort.
Im Speicher ist die Datenbearbeitung normalerweise schneller, aber. Wenn Sie wissen, dass Sie viele Duplikate haben, ist es besser, auf DB zu unterscheiden. Andernfalls verwenden Sie viel mehr Netzwerkbandbreite und Speicher. Es hängt also von den Daten ab.
Oracle hat, besonders in späteren Versionen, mehrere Methoden zur Auswahl, um die DISTINCT-Operation zu implementieren, einschließlich Sortierungen oder Hashes, und den Zugriff auf die Tabelle auf verschiedene Arten (z. B. mithilfe von Indizes oder vollständigen Scans). Es hat auch mehr Informationen über die Daten, einschließlich Statistiken und Einschränkungen, die es helfen können, Optimierungen zu finden, die ein Java-Programm möglicherweise nicht unbedingt kennt.
Dies ist abgesehen von dem Hauptproblem hier, welches die Menge an Daten ist, die herumgereicht wird (wie es hier von anderen mehrfach angegeben wurde).
SQL distinct ist "schwer", weil mehrere Vorkommnisse eliminiert werden müssen. Dies kann erreicht werden, indem zuerst die Daten sortiert werden und dann Läufe mit gleichen Elementen eliminiert werden. Die Schwere bezieht sich auf die Tatsache, dass es kostet, diese Operation zu machen.
Die idiomatische Lösung wäre hier, die Datenbank anheben zu lassen und sich dann um die Leistung zu kümmern, wenn dies zu einem Problem wird.
Tags und Links sql java database oracle performance