W PostgreSQL dokładnie to, co tu otrzymasz, zależy od tabeli bazowej, więc powinieneś użyć EXPLAIN ANALYZE w niektórych przykładowych zapytaniach względem użytecznego podzbioru danych, aby dokładnie określić, co optymalizator ma zamiar zrobić (upewnij się, że tabele bieganie przeciwko również zostały ANALIZOWANE). IN można przetwarzać na kilka różnych sposobów i dlatego musisz przyjrzeć się niektórym próbkom, aby dowiedzieć się, która alternatywa jest używana dla twoich danych. Nie ma prostej ogólnej odpowiedzi na Twoje pytanie.
Jeśli chodzi o konkretne pytanie, które dodałeś w swojej wersji, w porównaniu z trywialnym zestawem danych bez żadnych indeksów, oto przykład dwóch planów zapytań, które otrzymasz:
postgres=# explain analyze select * from x where s in ('123','456');
Seq Scan on x (cost=0.00..84994.69 rows=263271 width=181) (actual time=0.015..1819.702 rows=247823 loops=1)
Filter: (s = ANY ('{123,456}'::bpchar[]))
Total runtime: 1931.370 ms
postgres=# explain analyze select * from x where s='123' or s='456';
Seq Scan on x (cost=0.00..90163.62 rows=263271 width=181) (actual time=0.014..1835.944 rows=247823 loops=1)
Filter: ((s = '123'::bpchar) OR (s = '456'::bpchar))
Total runtime: 1949.478 ms
Te dwa środowiska wykonawcze są zasadniczo identyczne, ponieważ rzeczywisty czas przetwarzania jest zdominowany przez sekwencyjne skanowanie całej tabeli; wielokrotne uruchamianie pokazuje, że różnica między nimi jest poniżej marginesu błędu uruchomienia do uruchomienia. Jak widać, PostgreSQL przekształca przypadek IN w użycie filtra DOWOLNEGO, który zawsze powinien działać szybciej niż seria OR. Ponownie, ten trywialny przypadek niekoniecznie odzwierciedla to, co zobaczysz w poważnym zapytaniu, w którym zaangażowane są indeksy i tym podobne. Niezależnie od tego, ręczne zastępowanie IN serią instrukcji OR nigdy nie powinno być szybsze, ponieważ optymalizator wie, co należy zrobić, jeśli ma dobre dane do pracy.
Ogólnie rzecz biorąc, PostgreSQL zna więcej sztuczek dotyczących optymalizacji skomplikowanych zapytań niż optymalizator MySQL, ale również w dużym stopniu polega na tym, że dostarczyłeś optymalizatorowi wystarczającą ilość danych do pracy. Pierwsze linki w sekcji „Optymalizacja wydajności” wiki PostgreSQL obejmują najważniejsze rzeczy potrzebne do uzyskania dobrych wyników z optymalizatora.