BETWEEN
трябва превъзхожда IN
в този случай (но направете измервайте и проверявайте и плановете за изпълнение!), особено като n
расте и като статистиката все още е точна. Да предположим:
m
е размерът на вашата масаn
е размерът на вашия диапазон
Може да се използва индекс (n
е малко в сравнение с m
)
-
На теория
BETWEEN
може да се реализира с едно "сканиране на диапазон" (Oracle speak) на индекса на първичния ключ и след това преминаване най-многоn
индексни листни възли. Сложността ще бъдеO(n + log m)
-
IN
обикновено се изпълнява като серия (цикл) отn
"сканиране на диапазон" на индекса на първичния ключ. Сm
тъй като размерът на таблицата е, сложността винаги ще бъдеO(n * log m)
... което винаги е по-лошо (незначително за много малки таблициm
или много малки диапазониn
)
Индексът не може да се използва (n
е значителна част от m
)
Във всеки случай ще получите пълно сканиране на таблицата и ще оцените предиката на всеки ред:
-
BETWEEN
трябва да оцени два предиката:един за долната и един за горната граница. Сложността еO(m)
-
IN
трябва да оцени най-многоn
предикати. Сложността еO(m * n)
... което отново винаги е по-лошо, или може биO(m)
ако базата данни може да оптимизираIN
списък да бъде хеш-карта, а не списък с предикати.