Как правило, для любого rdb условия OR
не могут быть оптимизированы;Индексы пропуска AFAIK реализуются большинством RDB, что означает возможность оптимизации условий нескольких диапазонов.Однако в вашем случае, поскольку ваши условия LIKE
начинаются с %
и, таким образом, не соответствуют префиксам, они не могут быть оптимизированы по индексам, поскольку они не являются условиями диапазона.Тем не менее, вы должны использовать композицию OR
: она легче читается, верно для цели запроса, и очень вероятно, что запрос UNION
выполнит многократное сканирование таблицы, по одному для каждого подзапроса, в то время как запрос ORскорее всего, сделает одно сканирование, которое должно быть быстрее.Я говорю «вероятно», потому что с идеальным оптимизатором запросов все эквивалентные запросы должны быть разрешены в соответствии с наилучшим планом выполнения - в данном случае, одним сканированием.Но оптимизаторы далеки от «идеала».Поэтому, работая с различными YMMV для rdb, следуйте запросу OR
.
С таким запросом, однако, если вы ищете слова, вам следует рассмотреть возможность использования полнотекстовых индексов, если они доступны, и они доступныв большинстве rdbs, но с разными синтаксисами запросов.https://www.mssqltips.com/sqlservertutorial/9136/sql-server-full-text-indexes/