У меня такой сценарий:
SELECT * FROM PACKAGE WHERE PACKAGE_TYPE IN ('BOX','CARD')
Таблица разделена по полю PACKAGE_TYPE
. Предположим, что существует двадцать возможных значений для поля PACKAGE_TYPE
. Итак, имеется двадцать разделов, включая разделы BOX
, CARD
и DEFAULT
. При выполнении приведенного выше запроса удаление разделов происходит правильно, и сканируются только разделы BOX
и CARD
. Результат быстрый.
Однако, когда тот же запрос написан так:
SELECT * FROM PACKAGE WHERE PACKAGE_TYPE IN (SELECT PACKAGE_TYPE FROM PACKAGE_LIST_TABLE)
, где столбец PACKAGE_TYPE
в PACKAGE_LIST_TABLE
содержит два значения BOX
и CARD
.
При выполнении вышеуказанного запроса сканируются все 20 разделов. Это ухудшает производительность.
Кажется, что компилятор не может правильно идентифицировать второй запрос, и в результате получают доступ ко всем разделам.
Любые обходные пути, чтобы преодолеть это?
Заранее спасибо.