Kommentare
- Wenn es wirklich 800 where-Klauseln gibt, sollten Sie meiner Meinung nach an Ihrer Anwendung arbeiten.
Antwort
Diese Abfrage kann folgendermaßen geschrieben werden:
SELECT * FROM member_copy WHERE id IN (17579, 17580, 17582);
Die eigentliche Frage ist jedoch, wo kam diese Liste von id
s? Wenn die Liste von id
s das Ergebnis einer anderen Datenbankabfrage ist, sollten Sie stattdessen entweder eine Unterauswahl oder einen Join durchführen.
Kommentare
- Hat perfekt funktioniert. Es war nicht aus einer Datenbankabfrage, jemand ging tatsächlich durch und wählte jede Nummer aus. Ich beneide sie nicht.
Antwort
Ein Test mit EXPLAIN ANALYZE VERBOSE
zeigt Ihnen, dass das Formular mit id IN (...)
in der Antwort von @ 200_success intern in Folgendes umgewandelt wird:
SELECT * FROM member_copy WHERE id = ANY ("{17579, 17580, 17582}");
.. was daher zunächst etwas schneller ist (keine Konvertierung erforderlich).
Auch das Formular in Ihrer Frage wird effektiv ausgeführt sehr ähnlich.
Bei großen Listen ist das Aufheben eines Arrays , gefolgt von einem JOIN
, im Allgemeinen schneller :
SELECT m.* FROM unnest("{17579, 17580, 17582}"::int[]) id JOIN member_copy m USING (id);
Da die Liste is the result of another database query
lautet, ist es am schnellsten, beide in one JOIN
.
Detailliertere Erklärung:
Antwort
Für eine einzelne ID hat die folgende Abfrage für mich funktioniert:
SELECT * FROM member_copy WHERE id IN ("17579");
Kommentare
- Können Sie erklären, wie dies das OP beantwortet?