# Geschwindigkeit bei if Abfrage



## nutellaSchmeckt (23. Jan 2011)

Hallo,

ich habe eine Frage bzgl. Geschwindigkeit bei if-Abfragen. Ich hoffe, dass es hier schon jemand ausprobiert hat. Ansonsten müsste ich erst eine DB aufsetzen ....

Ich habe eine Tabelle mit zwei Spalten x, y (beides int Werte).
x und y sollen miteinander verglichen werden und die größere von beiden in einer Variablen gespeichert werden.

Funktioniert dies schneller, wenn die if-Abfrage in der SQL-Anweisung steht, oder geht es schneller, wenn beide Werte aus der DB gelesen werden und der Vergleich "innerhalb des Java-Programms" erfolgt?


----------



## Landei (23. Jan 2011)

Ich vermute, dass es mit SQL schneller geht, aber nicht weil Javas if langsamer ist, sondern weil in diesem Fall weniger Daten (wenn es nur die beiden Spalten sind, die Hälfte) übertragen werden müssen.


----------



## JohannisderKaeufer (23. Jan 2011)

Wie soll das in SQL gehen?

mir fällt da nur folgendes ein


```
select x as z from table where x >= y
union
select y as z from table where y > x
```

Dabei durchläufst du allerdings 2 mal die ganze Tabelle.
Hast bei jedem Eintrag also 2 Überprüfungen (x>=y und y>x).

Bei einer Abfrage

```
select x,y from table
```
Durchläufst du nur einmal die Tabelle
Und im Java-Code überprüfst du nur einmal ob x>y ist.

Das die übertragene Datenmenge ansteigt, mag sein.
Das sie sich verdoppelt, glaube ich eher nicht, da ich denke, daß bei einer DB-Abfrage eh noch einiger Overhead mitwandert.

Was genau rauskommt, könnte man aber durch ausprobieren herausfinden.


----------



## ice-breaker (23. Jan 2011)

JohannisderKaeufer hat gesagt.:


> Wie soll das in SQL gehen?



z.B. so:

```
SELECT IF(x >= y, x, y) AS z FROM table
```


----------



## nutellaSchmeckt (23. Jan 2011)

> Wie soll das in SQL gehen?



Hier sind zwei Beispiele bzgl. if-Anweisung innerhalb eines SQL-Statements.
sql server - SQL: IF clause within WHERE clause - Stack Overflow
Use IF in select clause : IFFlow ControlSQL / MySQL

Im Netz habe ich noch folgendes gefunden:
"SQL-Datenbanken effizient nutzen"
SQL-Datenbanken effizient nutzen | Dr. Web Magazin
Interessant ist der letzte Abschnitt: "Wann ist der Einsatz sinnvoll?"

Es sieht wohl so aus, als müsste man dies jedesmal ausprobieren, wenn die Performance entscheidend ist.


----------



## SlaterB (23. Jan 2011)

wenn die Performance entscheidend ist, man aber so wenig über die Systeme weiß dass man da was ausprobieren/ messen muss,
dann sehe ich ja schwarz, dann ist das wohl nur eine Spass-Optimierung


----------



## nutellaSchmeckt (23. Jan 2011)

> wenn die Performance entscheidend ist, man aber so wenig über die Systeme weiß dass man da was ausprobieren/ messen muss,
> dann sehe ich ja schwarz, dann ist das wohl nur eine Spass-Optimierung



Ich arbeite hier nicht an einem konkreten Problem, sondern lese gerade ein Buch über Datenbanken. Beim Kapitel über die if-Abfragen stellte sich bei mir die Frage ein, was wann besser ist.
Ich würde gerne wissen, nach welchen Kriterien man eine solche Entscheidungen trifft, bzw. welche Parameter man kennen muss, damit man nicht ausprobieren/messen muss.
Hast du vielleicht einen guten Link oder eine Literaturempfehlung zu dem Thema?


----------



## Landei (23. Jan 2011)

Auf SQL-Seite würde man in diesem Fall sowieso kein if, sondern max nehmen.


----------



## tuttle64 (24. Jan 2011)

Landei hat gesagt.:


> Auf SQL-Seite würde man in diesem Fall sowieso kein if, sondern max nehmen.




oder auf mySQL geht auch ein CASE WHEN x > y then x ELSE y END


----------



## JohannisderKaeufer (24. Jan 2011)

Das mit dem IF, daran kann ich mich so langsam wieder erinnern, das war aber auch schon ein paar Jahre her, seit ich das das letzte mal so verwendet habe.

Aber ich Frage mich erneut, wie soll das mit max aussehen?
Max ist doch eine Aggregatsfunktion, die den höchsten Wert in einer Spalte liefert. 
BrotaufstrichIstLecker  sucht aber nach einer Möglichkeit das Max aus zwei Werten einer Zeile zu bekommen.


----------



## tuttle64 (24. Jan 2011)

nutellaSchmeckt hat gesagt.:


> Funktioniert dies schneller, wenn die if-Abfrage in der SQL-Anweisung steht, oder geht es schneller, wenn beide Werte aus der DB gelesen werden und der Vergleich "innerhalb des Java-Programms" erfolgt?




Alllgemein funktioniert es schneller, wenn alles im SQL-Statement steht, da die Bedingungen bereits auf dem Server geprüft werden und nur noch die Datenmenge zum Client transferiert werden muss, die den Bedingungen entsprechen. Wir innerhalb des Java Programms entschieden muss zuerst die ganze Datenmenge auf den Client übertragen werden und erst dann kann entschieden werden, welche Row(s) zutreffen. Ich kann es testweise auf meiner mySQL Installation testen. Ich kann aber jetzt schon sagen, dass bei einer Row der Unterschied nicht gross sein wird.


----------



## Antoras (24. Jan 2011)

Zu dem Problem mit max: Is there a Max function in SQL Server that takes two values like Math.Max in .NET? - Stack Overflow
Da sollten genug Lösungswege beschrieben sein.


----------

