|
|
|
Сложный отбор данных из большой таблицы.
|
|||
|---|---|---|---|
|
#18+
Здравствуйте! Нужны свежие стратегические идеи для ускорения процесса) Условие задачи Есть широкая таблица (~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. Буду очень благодарен за любые идеи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2018, 15:04 |
|
||
|
Сложный отбор данных из большой таблицы.
|
|||
|---|---|---|---|
|
#18+
Shakti, авторРабота всегда идёт по месячной партиции, около 10М строк Я правильно понимаю, 10М записей в одном partition? А сколько их всего? Другими словами данные за какой период хранятся в таблице? Запросы динамические или параметры передаются в хранимые процедуры, выполняющие запрос? Есть ли соответствующие запросам индексы? Индексы локальные или глобальные? Когда собиралась статистика по partitions и в целом по таблице? Имеются ли гистограммы? Есть ли процесс, удаляющий старые данные? Каким именно образом удаляются данные? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2018, 20:50 |
|
||
|
Сложный отбор данных из большой таблицы.
|
|||
|---|---|---|---|
|
#18+
Спасибо за ответ! 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2018, 22:46 |
|
||
|
Сложный отбор данных из большой таблицы.
|
|||
|---|---|---|---|
|
#18+
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. Это как пример, без анализа планов сделать какие-либо выводы нельзя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2018, 07:24 |
|
||
|
Сложный отбор данных из большой таблицы.
|
|||
|---|---|---|---|
|
#18+
Shakti, Если заливка идёт не часто(один раз ночью) можно попробовать создание bitmap индексов они довольно неплохо должны работать при большом количестве условий. Сколько записей обычно возвращает запрос? Возможно имеет смысл ограничить пользователей каким-то набором обязательных и селективных условий, по которым построить индексы. Попробуйте выполнить запрос с фулсканом партиции, как в таком случае меняется время? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2018, 10:36 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=39690150&tid=1883580]: |
0ms |
get settings: |
6ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
150ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
37ms |
get tp. blocked users: |
1ms |
| others: | 196ms |
| total: | 413ms |

| 0 / 0 |
