Załóżmy, że ktoś podszedł do ciebie i powiedział, że zmniejszymy ilość SQL, którą piszemy, zastępując liczbę równą IN
. Użycie będzie dotyczyło zarówno pojedynczych wartości skalarnych, jak i list liczb.Wyrażenia sql z equals vs in
SELECT *
FROM table
WHERE id = 1
LUB
SELECT *
FROM table
WHERE id IN (1)
Czy to stwierdzenie równowartość co optymalizator produkuje?
Wygląda to naprawdę prosto na powierzchni, ale prowadzi do uproszczenia z dwóch powodów: 1. dużych bloków SQL nie trzeba duplikować, a 2. nie nadużywamy dynamicznego SQL.
To jest wymyślny przykład, ale rozważ następujące.
select a.* from tablea a
join tableb b on a.id = b.id
join tablec c on b.id2 = c.id2
left join tabled d on c.id3 = c.id3
where d.type = 1
... i znowu to samo dla więcej niż jednego przypadku
select a.* from tablea a
join tableb b on a.id = b.id
join tablec c on b.id2 = c.id2
left join tabled d on c.id3 = c.id3
where d.type in (1,2,3,4)
(to nie jest nawet duży rachunek)
conceivably można zrobić ciąg konkatenacji, ale nie jest to pożądane w świetle wykorzystania ORM, a dynamiczna konkatenacja ciągów SQL zawsze zaczyna się od dobrych intencji (przynajmniej w tych częściach).
Powinny być równoważne. Spójrz na plan wykonania, aby mieć pewność. –
Sądzę, że są bardziej odpowiednie style, na których należy się skupić, takie jak aliasy tabel, niewykorzystywanie opcji "SELECT *" itp. Plan zapytań to jedyna rzecz, która powie Ci, co widzi optymalizator, i może zmieniać się w zależności od indeksy i statystyki. –
Przetestowałem na stole z 6 milionami wierszy. I mieć wpływ na wiersze to 150 tysięcy wierszy.Odpowiedź jest taka sama. – shenhengbin