Jeśli mam następujące zapytanie zabawkaCzy Postgresql plpgsql/sql obsługuje zwarcie w klauzuli where?
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;
Czy pierwszy warunek w klauzuli WHERE zwarcia drugi warunek, które mają złożoną czas pracy?
Pracuję nad pewnym sql, który jest faktycznie częścią FOR LOOP w plpgsql, i mógłbym zrobić iteracje nad wszystkimi rekordami istniejącymi w my_other_tables, a następnie przetestować w ramach FOR LOOP z some_slow_func (). Ale jestem ciekawy, czy obsługuje sql, lub plpgsql obsługuje zwarcie.
rozeznanie: Spojrzałem na listach dyskusyjnych PostgreSQL oraz SQL, które oceniły tę mówiąc w ogóle nie obsługuje zwarcia:
http://www.postgresql.org/message-id/[email protected]
Ale jedną z odpowiedzi mówi, że zamówienie może być egzekwowane przez subselects. Nie jestem do końca pewien, o czym on mówi. Wiem, co to jest selekcja podrzędna, ale nie jestem pewien, w jaki sposób będzie egzekwowane zamówienie? Czy ktoś może mi to wyjaśnić?
Nie sądzę, że zwarcie jest istotne; SQL ma być zorientowany na ustawienie, a wynik nie powinien zależeć od kolejności oceny. Wyjątkiem od tego * może * być UNION z dwóch podzapytań, oba z LIMIT plus dodatkowy LIMIT na kwerendzie jako całość. Ale LIMIT jest tak czy inaczej ... Efekty uboczne oceny nie powinny być możliwe w prawdziwie relacyjnych RSBMS (może poza NIESTANDARDOWYM).W skrócie: kolejność oceny wpływa tylko na wydajność, a nie (poprawność) wyników, IMHO. Dlatego powinniśmy zostawić kolejność oceny planiście. – wildplasser