Wie effektiv festellen, ob Datensatz vorhanden ist?

Wie effektiv festellen, ob Datensatz vorhanden ist?

am 09.05.2006 14:26:14 von Andreas Delp

Hallo NG,

im Grunde brauche ich die Daten nicht. Ich möcht nur wissen, ob es sie gibt.
Ich könnte nun:
SELECT COUNT(*) FROM xyz WHERE .....
und dann in der Client-Anwendung (perl) das Ergebnis auf 0 prüfen.

Ich könnte aber auch
SELECT ID FROM xyz WHERE ..... LIMIT 1
und in der Client-Anwendung prüfen wieviel Datensätze gefunden werden.
if($dbh->execute(...) == 0) {...}

Was ist performanter? Gibt es da Unterschiede ob sich die DB auf dem
gleichen Host befindet, oder irgendwo im Netz?

TIA, Andreas

--
Wer mir per Mail antworten möchte sollte 'erdbeere' im Betreff erwähnen,
sonst wird die Mail zusammen mit SPAM und Würmern ungelesen gelöscht.

Re: Wie effektiv festellen, ob Datensatz vorhanden ist?

am 09.05.2006 15:03:02 von Andreas Kretschmer

Andreas
--
Andreas Kretschmer
Linux - weil ich es mir wert bin!
GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net
Deutsche PostgreSQL User Group: http://pgug.de

Re: Wie effektiv festellen, ob Datensatz vorhanden ist?

am 09.05.2006 15:33:37 von Frank Schenk

Andreas Delp wrote:
> Hallo NG,
>
> im Grunde brauche ich die Daten nicht. Ich möcht nur wissen, ob es sie gibt.
> Ich könnte nun:
> SELECT COUNT(*) FROM xyz WHERE .....
> und dann in der Client-Anwendung (perl) das Ergebnis auf 0 prüfen.
>
> Ich könnte aber auch
> SELECT ID FROM xyz WHERE ..... LIMIT 1
> und in der Client-Anwendung prüfen wieviel Datensätze gefunden werden.
> if($dbh->execute(...) == 0) {...}
>
> Was ist performanter? Gibt es da Unterschiede ob sich die DB auf dem
> gleichen Host befindet, oder irgendwo im Netz?
>
> TIA, Andreas
>

IMHO
SELECT COUNT(*) as anz FROM xyz WHERE .....

Siehe Handbuch, select count(*) wird optimiert

Aber was spricht gegen:

explain SELECT COUNT(*) FROM xyz WHERE .....
explain SELECT ID FROM xyz WHERE ..... LIMIT 1

gruß, Frank

Re: Wie effektiv festellen, ob Datensatz vorhanden ist?

am 09.05.2006 19:28:04 von Joachim Zobel

On Tue, 09 May 2006 14:26:14 +0200, Andreas Delp wrote:

> Was ist performanter? Gibt es da Unterschiede ob sich die DB auf dem
> gleichen Host befindet, oder irgendwo im Netz?

Ja.

Je nach Anwendung kann eine lokale Db erheblich performanter sein. Ggfs.
testen.

Gruß,
Joachim

--
Warnung: \" kann Augenkrebs verursachen.

Re: Wie effektiv festellen, ob Datensatz vorhanden ist?

am 10.05.2006 09:53:28 von Andreas Delp

Frank Schenk wrote:

> Andreas Delp wrote:
>> Hallo NG,
>>
>> im Grunde brauche ich die Daten nicht. Ich möcht nur wissen, ob es sie
>> gibt. Ich könnte nun:
>> SELECT COUNT(*) FROM xyz WHERE .....
>> und dann in der Client-Anwendung (perl) das Ergebnis auf 0 prüfen.
>>
>> Ich könnte aber auch
>> SELECT ID FROM xyz WHERE ..... LIMIT 1
>> und in der Client-Anwendung prüfen wieviel Datensätze gefunden werden.
>> if($dbh->execute(...) == 0) {...}
>>
>> Was ist performanter? Gibt es da Unterschiede ob sich die DB auf dem
>> gleichen Host befindet, oder irgendwo im Netz?
>>
>> TIA, Andreas
>>
>
> IMHO
> SELECT COUNT(*) as anz FROM xyz WHERE .....
>
> Siehe Handbuch, select count(*) wird optimiert
Aber IIRC nur wenn kein WHERE verwendet wird.

Andreas



--
Wer mir per Mail antworten möchte sollte 'erdbeere' im Betreff erwähnen,
sonst wird die Mail zusammen mit SPAM und Würmern ungelesen gelöscht.

Re: Wie effektiv festellen, ob Datensatz vorhanden ist?

am 10.05.2006 15:30:28 von Harald Stowasser

Andreas Delp schrieb:

> Hallo NG,
>
> im Grunde brauche ich die Daten nicht. Ich möcht nur wissen, ob es sie gibt.
> Ich könnte nun:
> SELECT COUNT(*) FROM xyz WHERE .....
> und dann in der Client-Anwendung (perl) das Ergebnis auf 0 prüfen.

Hier wird erstmal ein Zwischenergebnis erzeugt.

> Ich könnte aber auch
> SELECT ID FROM xyz WHERE ..... LIMIT 1
> und in der Client-Anwendung prüfen wieviel Datensätze gefunden werden.

Wenn du hier kein group/order einbaust, das eine Zwischentabelle
erfordert, dürfte in vielen Fällen diese Query performanter sein.
Genaueres dürfte dir ein Explain verraten.

> if($dbh->execute(...) == 0) {...}

Hier php zu posten ist Frevel :-)

> Was ist performanter? Gibt es da Unterschiede ob sich die DB auf dem
> gleichen Host befindet, oder irgendwo im Netz?

Natürlich. Der Ping auf localhost dürfte um einiges niedriger sein wie
zu weit.entfernter.rechner.auf.ws (Samoa) [1]

Kommt aber auf dein System an. Wenn du wenige längere Querys hast, ist
das Auslagern zu einer zweiten Maschine eventuell besser. Da der
fragende Prozess/Thread schön idelen kann. Und Prozessorzeit frei wird.
Bei vielen 'kleinen' Querys eventuell nicht. Weil viel Zeit für die
Kommunikation verpulvert wird.

Kommt auf die Bandbreite, Ergebnismenge, Abfragefrequenz, Ping,
Betriebssystem, Anzahl der Connections und noch ca. 100 andere Sachen
drauf an.

Am besten du machst dir erstmal keine Gedanken um die Optimierung des
Datenbank-Standorts. An dieser Schraube dreht man erst, wenn es wirklich
Probleme gibt. Und meist bringt das, dann auch nicht viel. Setze lieber
auf Stabilität.
Dem User ist es egal ob die Antwort 0.001 oder 0.01 Sekunden dauert!
Hauptsache sie kommt!



[1]
test:/data/mysql/logs # ping www.samoa.ws
PING gambit.samoa.ws (202.4.48.151) 56(84) bytes of data.
64 bytes from (202.4.48.151): icmp_seq=1 ttl=115 time=890 ms
64 bytes from (202.4.48.151): icmp_seq=2 ttl=115 time=889 ms
64 bytes from (202.4.48.151): icmp_seq=3 ttl=115 time=934 ms

Re: Wie effektiv festellen, ob Datensatz vorhanden ist?

am 10.05.2006 15:58:21 von Andreas Delp

Harald Stowasser wrote:

> Andreas Delp schrieb:
>
>> Hallo NG,
>>
>> im Grunde brauche ich die Daten nicht. Ich möcht nur wissen, ob es sie
>> gibt. Ich könnte nun:
>> SELECT COUNT(*) FROM xyz WHERE .....
>> und dann in der Client-Anwendung (perl) das Ergebnis auf 0 prüfen.
>
> Hier wird erstmal ein Zwischenergebnis erzeugt.
>
>> Ich könnte aber auch
>> SELECT ID FROM xyz WHERE ..... LIMIT 1
>> und in der Client-Anwendung prüfen wieviel Datensätze gefunden werden.
>
> Wenn du hier kein group/order einbaust, das eine Zwischentabelle
> erfordert, dürfte in vielen Fällen diese Query performanter sein.
> Genaueres dürfte dir ein Explain verraten.
>
>> if($dbh->execute(...) == 0) {...}
>
> Hier php zu posten ist Frevel :-)
>

Perl bitt'schön. Das ist das mit dem Kamel ;-)

Andreas


--
Wer mir per Mail antworten möchte sollte 'erdbeere' im Betreff erwähnen,
sonst wird die Mail zusammen mit SPAM und Würmern ungelesen gelöscht.