Wann ist sql deutlich schneller als die Java-Programmierung "distinct"

8

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

    
Franz See 04.06.2009, 10:37
quelle

9 Antworten

25

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:

  • Daten für den Treiber aus der Datenbank übertragen;
  • Netzwerkübertragung;
  • Unmarshalling von Daten vom Treiber zur Anwendung;

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.

    
Robert Munteanu 04.06.2009, 10:40
quelle
11

Zwei Hauptaspekte:

  • Wenn Sie die Daten nach Java übertragen müssen, müssen Sie diese Übertragung durchführen. Durch die Arbeit in der Datenbank müssen Sie keine Daten übertragen, die Sie nicht benötigen.
  • Die Datenbank kann ihre Indizes, Caches usw. verwenden, um die Dinge zu beschleunigen.

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.

    
Jon Skeet 04.06.2009 10:39
quelle
6

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.

    
Erich Kitzmueller 04.06.2009 11:01
quelle
3

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 ...

    
ante.sabo 04.06.2009 11:37
quelle
3

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)

    
Peter 04.06.2009 10:47
quelle
2

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.

    
tuinstoel 04.06.2009 11:13
quelle
1

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.

    
Robert Koritnik 04.06.2009 10:40
quelle
1

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).

    
Jeffrey Kemp 05.06.2009 02:30
quelle
0

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.

    
I GIVE CRAP ANSWERS 04.06.2009 10:43
quelle