2012-02-28 16 views
28

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).

+0

Powinny być równoważne. Spójrz na plan wykonania, aby mieć pewność. –

+0

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. –

+0

Przetestowałem na stole z 6 milionami wierszy. I mieć wpływ na wiersze to 150 tysięcy wierszy.Odpowiedź jest taka sama. – shenhengbin

Odpowiedz

15

Te dwa konkretne stwierdzenia są równoważne optymalizator (pan porównać planów wykonania?), Ale myślę, że bardziej istotne korzyści można uzyskać z tych ostatnich jest to, że

WHERE id = 1 OR id = 2 OR id = 3 OR id = 4 OR id = 5 

Może być wyrażony jako po znacznie bardziej zwięzły i czytelny (ale semantycznie równoważne optymalizator) wersja:

WHERE id IN (1,2,3,4,5) 

problemem jest to, że kiedy te ostatnie wyrażone jako większość ludzi, że mogą przekazać ciąg, jak @list = '1,2,3,4,5' a potem mówią:

WHERE id IN (@list) 

To nie działa, ponieważ @list jest pojedynczy łańcuch skalarne, a nie tablicą liczb całkowitych.

W przypadkach, w których masz jedną wartość, nie widzę, w jaki sposób "optymalizacja" pomaga cokolwiek. Nie napisałeś mniej kodu SQL, tak naprawdę napisałeś więcej. Czy możesz bardziej szczegółowo opisać, w jaki sposób doprowadzi to do zmniejszenia liczby zapytań SQL?

+0

nie mam teraz przed serwerem SQL Server. Przed rozpoczęciem pracy potrzebowałem opinii ze świata SQL Server. tj. nie chciał wykonać konkretnej zmiany DBMS w ten sposób bez sprawdzenia poprawności. Dziękuję bardzo. – sgtz

+0

Nadal zgadzam się z innymi, że nie wydaje się, aby zmiana była logiczna, jaki jest cel? Czy nie ma ważniejszych rzeczy, na których warto się skoncentrować na tym naprzemiennym składni? –

+0

re: less SQL. Powiedz, że instrukcja jest dość masywna z wieloma połączeniami. Miałoby to mniej SQL, ponieważ cały ten blok nie byłby duplikowany i nie musiałbyś robić ani dynamicznej kompozycji. – sgtz