МЕЖДУ оператором против> = И <=: Есть ли разница в производительности? - PullRequest
11 голосов
/ 22 апреля 2010

Эти два утверждения логически эквивалентны:

SELECT * FROM table WHERE someColumn BETWEEN 1 AND 100

SELECT * FROM table WHERE someColumn >= 1 AND someColumn <= 100

Есть ли потенциальные преимущества в производительности для одного по сравнению с другим?

Ответы [ 4 ]

5 голосов
/ 22 апреля 2010

Никакой выгоды, только синтаксический сахар.

Используя версию BETWEEN, вы можете избежать переоценки функций в некоторых случаях.

1 голос
/ 22 апреля 2010

Хм, тут был удивительный результат. У меня нет SQL Server здесь, поэтому я попробовал это в Postgres. Очевидно, применяются заявления об отказе от ответственности: это не обязательно даст те же результаты, ваш пробег может варьироваться, проконсультируйтесь с врачом перед использованием Но все же ...

Я просто написал простой запрос двумя разными способами:

select *
from foo
where (select code from bar where bar.barid=foo.barid) between 'A' and 'B'

и

select *
from foo
where (select code from bar where bar.barid=foo.barid)>='A'
and (select code from bar where bar.barid=foo.barid)<='B'

Удивительно для меня, у обоих были почти идентичные времена выполнения. Когда я сделал EXPLAIN PLAN, они дали идентичные результаты. В частности, первый запрос выполнил поиск по строке дважды, один раз для теста> = и еще раз для теста

Вывод: По крайней мере, в Postgres BETWEEN - это просто синтаксический сахар.

Лично я регулярно использую его, потому что он понятнее читателю, особенно если проверяемое значение является выражением. Выяснить, что два сложных выражения идентичны, может быть нетривиальным упражнением. Выяснить, что два сложных выражения ДОЛЖНЫ БЫТЬ ОДНОВРЕМЕННЫ, даже если они не являются, еще сложнее.

1 голос
/ 22 апреля 2010

Нет никакого выигрыша в производительности, просто проще читать / писать.

1 голос
/ 22 апреля 2010

Нет, производительность не выгодна. Это просто маленькая конфетка.

Если бы вы проверяли сравнение запросов, что-то вроде

DECLARE @Table TABLE(
        ID INT
)

SELECT  *
FROM    @Table
WHERE   ID >= 1 AND ID <= 100

SELECT  *
FROM    @Table 
WHERE   ID BETWEEN 1 AND 100

и проверьте план выполнения, вы должны заметить, что он точно такой же .

...