Страницы

Поиск по вопросам

четверг, 12 декабря 2019 г.

Большое ли преимущество использования IN вместо множества OR в sql?

#sql


На примере 

select *
from table
where property in ('a','b','c')


или

select *
from table
where property='a' or property='b' or property='c'

    


Ответы

Ответ 1



Если говорить про абстрактный SQL - никакой разницы нет. Есть много способов попросить достать одни и те же данные. Впрочем, с точки зрения читаемости человеком in явно выигрывает из-за компактности. А если рассматривать конкретные реализации - то различия могут быть. Например, мой локальный postgresql строит разные планы: melkij=> explain select * from bigtable where id = 1 or id = 3 or id=4; QUERY PLAN ---------------------------------------------------------------------------------- Bitmap Heap Scan on bigtable (cost=13.34..25.34 rows=3 width=12) Recheck Cond: ((id = 1) OR (id = 3) OR (id = 4)) -> BitmapOr (cost=13.34..13.34 rows=3 width=0) -> Bitmap Index Scan on bigtable_pkey (cost=0.00..4.45 rows=1 width=0) Index Cond: (id = 1) -> Bitmap Index Scan on bigtable_pkey (cost=0.00..4.45 rows=1 width=0) Index Cond: (id = 3) -> Bitmap Index Scan on bigtable_pkey (cost=0.00..4.45 rows=1 width=0) Index Cond: (id = 4) melkij=> explain select * from bigtable where id in (1,3,4); QUERY PLAN -------------------------------------------------------------------------------- Index Scan using bigtable_pkey on bigtable (cost=0.44..17.37 rows=3 width=12) Index Cond: (id = ANY ('{1,3,4}'::integer[])) Как можно заметить, in был переписан в другую форму и оценён дешевле, чем несколько эквивалентных or Какие-то другие СУБД может быть переписывают оба запроса в идентичное представление, или же переписывают in в группу or. Вопросы производительности необходимо рассматривать только в рамках какой-то конкретной реализации.

Ответ 2



В дополнение к сказанному @Мелкий. MS SQL Server на оба запроса генерирует абсолютно одинаковые планы не зависимо от наличия индекса. В MySQL, согласно документации in использует бинарный поиск, т.е. теоретически должен быть быстрее, чем or. На практике оказывается, что при наличии индекса разницы почти нет, а при отсутствии in работает примерно на 30% быстрее.

Комментариев нет:

Отправить комментарий