Wenn ich habe folgendes Spielzeug AbfrageUnterstützt Postgresql plpgsql/sql in der Where-Klausel einen Kurzschluss?
SELECT *
FROM my_tables
WHERE my_id in (
SELECT my_other_id
FROM my_other_tables
) AND some_slow_func(arg) BETWEEN 1 AND 2;
Würde die erste Bedingung in dem Kurzschluss WHERE-Klausel der zweite Bedingung, die eine komplexe Laufzeit haben würde?
Ich arbeite an einigen SQL, die tatsächlich Teil eines FOR LOOP in Plpgsql ist, und ich könnte Iterationen über alle Datensätze, die in den my_other_tables existieren, und dann im Rahmen der FOR LOOP mit der some_slow_func (). Aber ich bin gespannt, ob SQL unterstützt, oder plpgsql unterstützt Kurzschlüsse.
Einige Forschung: sah ich in den Postgres Mailinglisten und fand dies im allgemeinen sagen, SQL nicht Kurzschlüsse unterstützt:
http://www.postgresql.org/message-id/[email protected]
Aber eine der Antworten sagt, dass, um durch durchgesetzt werden kann Subselects. Ich bin mir nicht sicher, wovon er spricht. Ich weiß, was ein Subselect ist, aber ich bin mir nicht sicher, wie die Order durchgesetzt wird. Könnte jemand das für mich klären?
Ich denke nicht, dass ein Kurzschluss relevant ist; SQL soll satzorientiert sein und das Ergebnis sollte nicht von der Reihenfolge der Auswertung abhängen. Eine Ausnahme hiervon könnte * eine UNION von zwei Unterabfragen sein, sowohl mit einem LIMIT als auch einem zusätzlichen LIMIT für die Abfrage als Ganzes. Aber LIMIT ist sowieso grenzwertig ... Nebenwirkungen einer Evaluation sollten in einem wirklich relationalen RSBMS nicht möglich sein (vielleicht außer LATERAL).Kurz gesagt: Die Reihenfolge der Auswertung beeinflusst nur die Leistung und nicht (die Richtigkeit der) Ergebnisse, IMHO. Deshalb sollten wir die Reihenfolge der Auswertung dem Planer überlassen. – wildplasser