Производительность запроса, несколько «ИЛИ» против отдельных операторов - PullRequest
2 голосов
/ 08 июля 2010

Допустим, у меня есть таблица базы данных Oracle с 9-значными почтовыми кодами 40 мм, которая включает 4-значный почтовый код для каждого. У меня есть список из 800 5-значных почтовых индексов, и мне нужно найти все связанные 9-значные почтовые индексы. Всего 40K 5-значных почтовых индексов. Предположим, что мы проиндексировали 5-значное поле почтового индекса с индексом B * Tree (обычный). Учитывая производительность и масштабируемость базы данных, это лучший способ:

  1. Запросить все записи в одном выражении? Примерно так запустите один раз:

    ВЫБРАТЬ * ИЗ ZIPCODE ГДЕ ZIP5 IN (: 1,: 2, ...: 800)

  2. Запросить один раз для каждого из 5-значных почтовых индексов? Примерно так бегать 800 раз:

    ВЫБРАТЬ * ИЗ ZIPCODE ГДЕ ZIP5 =: 1

  3. Какой размер партии между двумя?

Что вы думаете и почему? Некоторые [необязательные] последующие мысли, если у вас хорошее настроение:

  • Какие тесты мы можем провести, чтобы проверить ваше мышление?
  • Меняется ли лучший метод при изменении громкости (например, если у нас есть 100 9-значных почтовых индексов, сопоставленных с 10 5-значными почтовыми кодами, для поиска 3 из этих 10)?
  • Отличается ли лучшая вещь для базы данных от лучшей вещи для серверов приложений, которые поглощают результаты запроса?

Ответы [ 2 ]

4 голосов
/ 08 июля 2010

Пусть сервер баз данных решит, как с этим справиться.Даже если он внутренне выполняет запрос 800 раз, он все равно будет работать быстрее.Он должен анализировать запрос только один раз и отправлять результаты только один раз.

Таким образом, используйте SELECT * FROM ZIPCODE WHERE ZIP5 IN (:1, :2,... :800)

2 голосов
/ 08 июля 2010

У вас есть возможность создать внешнюю таблицу? То есть.,

CREATE TABLE zip5 (zip5 varchar2(5))
ORGANIZATION EXTERNAL
(
  TYPE ORACLE_LOADER
  DEFAULT DIRECTORY <some oracle DIRECTORY object>
  LOCATION (<yourDirectory>:'zip5 filename.txt'
)

Поместите ваш текстовый файл zip5 в каталог ОС, указанный вашим объектом каталога Oracle, затем выполните:

SELECT * FROM zipcode JOIN zip5 ON (zipcode.zip5 = zip5.zip5);

Это более общее решение, чем перестройка запроса при каждом изменении списка ZIP5.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...