2013-06-17 4 views
0

У меня есть таблица со 100 миллионами строк. Я должен использовать оператор BETWEEN, и запрос выполняется очень медленно. Необходимо получить все строки, которые находятся в диапазоне от суммы и цены, или все с этим городом и штатом.Производительность Oracle на столе

У меня есть 2 указателя один на t.name, а другой на t.city & t.state.

Выполнение этого запроса происходит очень медленно. Как я могу улучшить этот запрос.

SELECT t.trader_id, t.name, t.city, t.state 
    FROM trader t 
    WHERE t.name = 'john test' AND 
     is_valid = 1 AND 
     ((t.amount BETWEEN (-2500.0000 , 2800.000) AND 
      t.price between (25.00000 , 58.000000)) OR 
     (t.city='city' AND 
     t.state='state')) 

имеет отличные уникальные индексы, присутствующие на

  1. t.name
  2. t.city, t.state

для (имя и is_valid) существует около 78000 строк. Для (цена и количество) существует около 331809 строк. Для (города и штата) имеется около 13500 строк.

+0

Разделен ли стол? Индексируются? Каков план выполнения запроса? Вызывается динамическая выборка (об этом говорит план выполнения). Сколько строк соответствует первым двум критериям? –

+0

таблица индексируется. Имейте 2 индекса один на t.name и другой на t.city & t.state. Выполняя план выполнения, он показывает, что для суммы, цены, города и состояния выполняется INDEX BY ROWID. в то время как для имени t.name используется индекс. Проблема связана с t.price, t.amount, t.city и t.state. – user12121

+0

David, это не дубликат, этот запрос рассматривает только 1 таблицу, а не несколько таблиц. – user12121

ответ

1

Вы не предоставили много твердой информации, такой как объяснение планов, наличие индексов или распределение данных. Это уменьшает любой ответ на догадку.

Однако, ваш вопрос, вероятно, неверно назван. Оператор BETWEEN вряд ли станет основной причиной низкой производительности. У вас есть предложение OR, которое определяет два совершенно разных набора критериев. Таким образом, база данных не может использовать какой-либо индекс в AMOUNT, PRICE, CITY или STATE. Это накладывает бремя на остальные критерии. Если у вас нет составного индекса (NAME, IS_VALID) и, эта комбинация возвращает очень небольшой процент строк, которые вы просматриваете при полном сканировании таблицы. Для полного сканирования таблицы в 100 миллионов строк потребуется некоторое время.

Что вы можете сделать, это зависит от деталей, которые я указал в своем вступительном слове. Угадывание решений на вершине угаданного диагноза - всего лишь пустая трата времени каждого. Предоставьте некоторые детали, и мы сможем обсудить их дальше.

+0

Спасибо всем за вашу помощь. Ниже приведена информация по запросу. Неионный, Неисторический Индекс присутствует на 1) t.name 2) t.city и t.state По имени и is_valid существует около 78000 строк цена и сумма около 331809 строк. Для этих критериев выполняется полный стол SCAN. город и государство, есть около 13500 строк. – user12121

+0

Комментарии должны быть одноразовыми. Пожалуйста, * отредактируйте свой вопрос * при публикации дополнительной информации. Помимо всего прочего форматирование отстой.Кто может понять план объяснения? – APC

+0

РАБОТА \t \t ИМЯ_ОБЪЕКТА ВАРИАНТЫ \t COST ВЫБРАТЬ ЗАЯВЛЕНИЕ ТАБЛИЦА ДОСТУП \t \t TRADER индексным ROWID \t \t Фильтр PREDICATES \t \t \t И \t \t \t \t t.valid_listing = 1 \t \t ИЛИ \t \t \t \t И \t \t \t \t t.price> = 10.00 \t \t \t \t t.amount <= 40000,00 \t \t \t \t t.amount> = 100000,00 \t \t \t \t t.price <= 1,00 \t \t \t \t NVL (t.price, 1) <> 1 \t \t \t \t NVL (t.amount, 2) <> 2 \t \t \t \t И \t \t t.city = 'Baltimore' \t \t \t \t t.state = 'MD' ИНДЕКС \t \t TRADER_NAME диапазон сканирования \t Доступ к предикатам \t T.NAME = 'trader1' – user12121

Смежные вопросы