Модераторы: LSD
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Рефакторинг запроса с IN и OR, участники группы с совпадением в полях 
:(
    Опции темы
Entry_N3
  Дата 9.12.2011, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 446
Регистрация: 8.2.2007

Репутация: нет
Всего: нет



Есть запрос, схематично которой можно записать в виде

Код

select *
from table_1
where (field_1 IN ('значение_1', 'значение_2', 'значение_3', 'значение_4')
or field_2 IN ('значение_1', 'значение_2', 'значение_3', 'значение_4')
or field_3 IN ('значение_1', 'значение_2', 'значение_3', 'значение_4')
or field_4 IN ('значение_1', 'значение_2', 'значение_3', 'значение_4')
)


Т.е. значение из одно и того же множества значений проверяется на совпадение в одном из 4х атрибутов.

Если на примере, то, допустим, есть выделенная группа экспертов '1' {'значение_1', 'значение_2', 'значение_3', 'значение_4'}. Допустим, эксперт ('значение_1') на сайте вызывает диалог, в результате которого должны отобразиться все заявки ('table_1'). При этом должны вывестись такие заявки, где этот эксперт ('значение_1') или остальные эксперты из его группы '1' ('значение_2', 'значение_3', 'значение_4') являются либо рецензентами ('field_1'), либо field_2, либо field_3, либо field_4.

Предлагается переделать структура запроса либо структуру данных (вплоть до дополнительных таблиц) так, чтобы не было OR и/или IN (мотивация: на больших данных запрос долго работает). Есть идеи?

Используется Oracle 10g.
PM MAIL   Вверх
Zloxa
Дата 9.12.2011, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 37
Всего: 161



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

в случае, если выводится значение ключа, несколько or предикатов можно заменить на union с одним предикатом. Что-то вроде
Код

select *
from table_1
where (field_1 IN ('значение_1', 'значение_2', 'значение_3', 'значение_4')
union
select *
from table_1
where field_2 IN ('значение_1', 'значение_2', 'значение_3', 'значение_4')
....

в некоторых случаях можно попробовать.


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Entry_N3
  Дата 19.12.2011, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 446
Регистрация: 8.2.2007

Репутация: нет
Всего: нет



Цитата(Zloxa @  9.12.2011,  22:54 Найти цитируемый пост)
какова селективность предикатов?

Возвращается порядка 100-500 строк.
Цитата(Zloxa @  9.12.2011,  22:54 Найти цитируемый пост)
есть ли по ним индексы?

Индексы есть.
Цитата(Zloxa @  9.12.2011,  22:54 Найти цитируемый пост)
используются ли они?

Используеются.

Насчет приема с union`ом, понятно. Спасиб. Но не решает проблему.

Есть еще идеи?
PM MAIL   Вверх
Zloxa
Дата 19.12.2011, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 37
Всего: 161



Цитата(Entry_N3 @  19.12.2011,  17:11 Найти цитируемый пост)
Используеются.

Как смотрите?

100-500 строк отобрать по индексам не должно представляться проблематичным.


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Entry_N3
  Дата 20.12.2011, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 446
Регистрация: 8.2.2007

Репутация: нет
Всего: нет



Zloxa, по плану выполнения.



Цитата(Zloxa @  19.12.2011,  17:34 Найти цитируемый пост)
100-500 строк отобрать по индексам не должно представляться проблематичным. 

Даже из миллиона записей, распиханным по нескольким таблицам?
PM MAIL   Вверх
Zloxa
Дата 20.12.2011, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 37
Всего: 161



Цитата(Entry_N3 @  20.12.2011,  14:13 Найти цитируемый пост)
Zloxa, по плану выполнения.

А план смотрите где?
Посмотреть реально действующий план запроса можно - в трассе, в gv$sql_plan или же с помощью dbms_xplan.display_cursor.

План, полученный другими способами может отличаться от реально действующего.

Цитата(Entry_N3 @  20.12.2011,  14:13 Найти цитируемый пост)
Даже из миллиона записей

Даже из миллиарда записей.

Цитата(Entry_N3 @  20.12.2011,  14:13 Найти цитируемый пост)
распиханным по нескольким таблицам? 

Это - новость. Ранее фигурировала только одна таблица.


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Oracle"
Zloxa
LSD

Данный раздел предназначен для обсуждения проблем с Oracle Database, другие продукты Oracle здесь не обсуждаются. Просьба при создании темы, придерживаться следующих правил:

  • при создании темы давайте ей осмысленное название, описывающее суть проблемы
  • указывайте используемую версию базы, способ соединения и язык программирования
  • при ошибках обязательно приводите код ошибки и сообщение сервера
  • приводите код в котором возникла ошибка, по возможности дайте тестовый пример демонстрирующий ошибку
  • при вставке кода используйте соответсвующие теги: [code=sql] [/code] для подсветки SQL и PL/SQL кода, [code=java] [/code] - для Java, и т.д.

  • документация по Oracle: 9i, 10g, 11g
  • книги по Oracle можно поискать здесь
  • действия модераторов можно обсудить здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, LSD.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Oracle | Следующая тема »


 




[ Время генерации скрипта: 0.0453 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.