powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Сложный отбор данных из большой таблицы.
6 сообщений из 6, страница 1 из 1
Сложный отбор данных из большой таблицы.
    #39690004
Shakti
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!

Нужны свежие стратегические идеи для ускорения процесса) Условие задачи
Есть широкая таблица (~80 колонок) все колонки это либо varchar2 либо number, либо date. Работа всегда идёт по месячной партиции, около 10М строк, есть ПК.
Пользователь пишет условие(идентифицируется ID_УСЛОВИЯ) вида (COL1 >50 and COL2 LIKE '%ZZZ%') or (COL3 BETWEEN TO_DATE('01.07.2017') AND TO_DATE( '15.07.2017' ) . Количество таких последовательных условий может быть технически любым, на практике, обычно, 4-5.
Каждая строка в исходной таблице может соответствовать любому количеству пользовательских условий от 0 до N.
Соответственно, задача - разметить каким-то образом строки исходной таблицы, сложив в другую таблицу данные как (PK,ID_УСЛОВИЯ).

Сейчас количество уникальных ID_УСЛОВИЯ для прохода равно ~100. Добавились условия вида (COL4 IN (SELECT VAL FROM LOOKUPS WHERE lookup_id =12345))
Испробовано 1) отдельные запросы для каждого условия, выполняется 2.5 часа
2) Один огромный кейс(не влезает в varchar2(32000)) выполняется 1.5 часа.
Очень хочется утоптать всё это хотя бы в час. База Oracle 11g.

Буду очень благодарен за любые идеи.
...
Рейтинг: 0 / 0
Сложный отбор данных из большой таблицы.
    #39690084
flexgen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shakti,

авторРабота всегда идёт по месячной партиции, около 10М строк

Я правильно понимаю, 10М записей в одном partition? А сколько их всего? Другими словами данные за какой период хранятся в таблице?

Запросы динамические или параметры передаются в хранимые процедуры, выполняющие запрос?

Есть ли соответствующие запросам индексы? Индексы локальные или глобальные?

Когда собиралась статистика по partitions и в целом по таблице? Имеются ли гистограммы?

Есть ли процесс, удаляющий старые данные? Каким именно образом удаляются данные?
...
Рейтинг: 0 / 0
Сложный отбор данных из большой таблицы.
    #39690105
Shakti
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за ответ!

10М записей в одном partition? А сколько их всего? Другими словами данные за какой период хранятся в таблице?
Всё верно, 10М в одной партиции. сейчас хранятся данные за полтора года, со временем вырастет до трех лет.

Запросы динамические или параметры передаются в хранимые процедуры, выполняющие запрос?
Запросы динамические,при чём есть грех пренебрежения бинд-переменными, не смог придумать как можно такое собрать на процедурах)


Есть ли соответствующие запросам индексы? Индексы локальные или глобальные?
Запросы динамические, соответственно индексы тоже придется создавать каждый раз под конкретный набор условий. Думал эту мысль, но не попробовал. Стоит испытать? Сейчас есть только уникальный индекс на одно поле, два индекса для других запросов на определённые поля с айдюками и индекс на поле с датой по которой идет партиционирование (partition by range DATE interval MONTH). Индексы все локальные.


Когда собиралась статистика по partitions и в целом по таблице? Имеются ли гистограммы?
Статистику собираем каждую ночь после заливки в таблицу актуальных данных. Открыл для себя гистограммы, буду думать. Их, получается, имеет смысл делать на числовых колонках, где часто возникают условия <>?

Есть ли процесс, удаляющий старые данные? Каким именно образом удаляются данные?
Сейчас при обновлении(данные вытягиваются через dblink из другой базы) делается drop partiton for (MONTH_DATE)

Последнее время явно добавляю ко всем запросам select * from t partition for (to_date('01.07.2018'))

Сейчас, судя по собранной глазами статистике, сильнее всего производительность угнетают условия типа (COL4 IN (SELECT VAL FROM LOOKUPS WHERE lookup_id =12345)). При этом табличка lookups перед запуском наполняется только релевантными данными, там ничего лишнего, около 2000 строк всего. В ней есть, соответственно, индекс на lookup_id и val, в плане стоит index_join.
...
Рейтинг: 0 / 0
Сложный отбор данных из большой таблицы.
    #39690150
flexgen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shakti,

авторЗапросы динамические,при чём есть грех пренебрежения бинд-переменными, не смог придумать как можно такое собрать на процедурах)
Не самый лучший вариант, но и с этим можно жить. Но все же по возможности надо использовать переменные либо , если в условии запроса имеются одни и те же значения, то вносить их непосредственно в текст запроса.

авториндексы тоже придется создавать каждый раз под конкретный набор условий. Думал эту мысль, но не попробовал. Стоит испытать?
Сколько всего таких запросов? Есть между ними что-то общее, какие-либо условия, существующие в каждом запросе? Если да - то вот для этих условий надо создавать индексы. Так что пробовать однозначно стоит.

авторсильнее всего производительность угнетают условия типа (COL4 IN (SELECT VAL FROM LOOKUPS WHERE lookup_id =12345)). При этом табличка lookups перед запуском наполняется только релевантными данными, там ничего лишнего, около 2000 строк всего. В ней есть, соответственно, индекс на lookup_id и val, в плане стоит index_join.

Нужно анализировать планы, возможно, изменять запрос, скажем вместо
авторCOL4 IN (SELECT VAL FROM LOOKUPS WHERE lookup_id =12345)
использовать
Код: plsql
1.
2.
join (SELECT VAL FROM LOOKUPS WHERE lookup_id =12345) a
on COL4 = a. VAL


Это как пример, без анализа планов сделать какие-либо выводы нельзя.
...
Рейтинг: 0 / 0
Сложный отбор данных из большой таблицы.
    #39690270
feagor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shakti,

Если заливка идёт не часто(один раз ночью) можно попробовать создание bitmap индексов они довольно неплохо должны работать при большом количестве условий.
Сколько записей обычно возвращает запрос?
Возможно имеет смысл ограничить пользователей каким-то набором обязательных и селективных условий, по которым построить индексы.

Попробуйте выполнить запрос с фулсканом партиции, как в таком случае меняется время?
...
Рейтинг: 0 / 0
Сложный отбор данных из большой таблицы.
    #39690391
Игорь Ковалев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shakti,
попробуйте запрос
Код: plsql
1.
SELECT VAL FROM LOOKUPS WHERE lookup_id =12345



использовать в конструкции with с хинтом materialize
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Сложный отбор данных из большой таблицы.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]