Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / partition pruning при условии только на subpartition / 25 сообщений из 39, страница 1 из 2
25.01.2018, 18:07
    #39591172
Alexus12
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
partition pruning при условии только на subpartition
Бодрого всем!
Oracle 12.1, есть фактовая таблица:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
  CREATE TABLE LOG
   (          
                "RUN_ID" NUMBER(38,0) NOT NULL ENABLE, 
                "CREATE_TS" TIMESTAMP (0) DEFAULT CURRENT_TIMESTAMP(0) NOT NULL ENABLE, 
                куча прочих полей

   ) PCTFREE 0 PCTUSED 92 INITRANS 1 MAXTRANS 255 
  STORAGE(INITIAL 16384 NEXT 106496
)
  PARTITION BY RANGE ("CREATE_TS") INTERVAL (INTERVAL '1' DAY) 
  SUBPARTITION BY HASH ("RUN_ID") 
  SUBPARTITIONS 128




логика заполнения:
RUN_ID - монотонно возрастающее число, идентифицирующее набор строк
CREATE_TS - монотонно возрастающее дата/время
удалений/правок в таблице нет

расчетное наполнение - 2,5 млрд строк в год,
ILM - 3 года хранения, т.е. пик наполнения ожидается на уровне 7,5 млрд строк

Для эффективного отбора из нее (чтобы сработал partition pruning по обоим уровням) необходимо в запросе указывать условия на оба поля - "CREATE_TS" и "RUN_ID"

При этом уже существуют запросы, отбирающие только по "RUN_ID",
план в этом случае выглядит как
Код: plsql
1.
2.
partition range ALL - CREATE_TS
partition range SINGLE - RUN_ID



- т.е. просматривается 1024К-2 субпартиций RUN_ID партиций ("CREATE_TS"), в которых в принципе искомого RUN_ID нет

вопрос: можно ли как-то ускорить эти запросы (в 1024К раз) без переписывания?

Спасибо!
...
Рейтинг: 0 / 0
25.01.2018, 18:29
    #39591194
Alexus12
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
partition pruning при условии только на subpartition
поправка - ускорить не в 1024К раз, а всего в 365*3 - 1 раз (столько лишних партиций накопится за 3 года)
...
Рейтинг: 0 / 0
25.01.2018, 18:59
    #39591234
partition pruning при условии только на subpartition
Alexus12,

Я правильно понял суть вопроса: нужно чтобы оракл отсек ненужные партиции и читал только одну нужную, и при этом в запросе не фильтровать по полю партиционирования, и не менять исходный запрос?

=)
...
Рейтинг: 0 / 0
25.01.2018, 19:00
    #39591236
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
partition pruning при условии только на subpartition
Alexus12
Код: plsql
1.
partition range SINGLE - RUN_ID

это и означает, что в секции просматривается только одна подсекция. Если было бы RUN_ID in (...), был бы PARTITION HASH INLIST , а полный - это PARTITION HASH ALL . Количество же просмотренных подсекций можно увидеть в STARTS.


Alexus12т.е. просматривается 1024К-2 субпартиций RUN_ID партиций ("CREATE_TS"), в которых в принципе искомого RUN_ID неткак такой вывод вообще был сделан? и считали-то как?
...
Рейтинг: 0 / 0
25.01.2018, 19:04
    #39591239
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
partition pruning при условии только на subpartition
Мимо крокодилAlexus12,

Я правильно понял суть вопроса: нужно чтобы оракл отсек ненужные партиции и читал только одну нужную, и при этом в запросе не фильтровать по полю партиционирования, и не менять исходный запрос?

=)ааа, вот теперь понял в чем вопрос


Alexus12,

Alexus12RUN_ID - монотонно возрастающее число, идентифицирующее набор строк

ораклу неоткуда брать информацию, в какой секции лежит какой диапазон RUN_ID (статистика не в счет, т.к. она ничего не гарантирует). В похожих случаях еще чек-контрейнты могли бы помочь, но не в вашем.
...
Рейтинг: 0 / 0
25.01.2018, 19:08
    #39591245
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
partition pruning при условии только на subpartition
Alexus12,

простейшее решение - это добавить таблицу (CREATE_DAY, RUN_ID_MIN, RUN_ID_MAX) и добавить условия по ней
...
Рейтинг: 0 / 0
25.01.2018, 23:07
    #39591361
Bobby Z.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
partition pruning при условии только на subpartition
Alexus12вопрос: можно ли как-то ускорить эти запросы (в 1024К раз) без переписывания?
Глобальный индекс на RUN_ID. Он, конечно, создаст хренову кучу проблем в других областях (в частности, как раз ILM, поскольку его придётся каждый раз перестраивать после изменений структуры таблицы, что с Вашими масштабами будет весьма дорого и долго), но зато ускорит выборки по RUN_ID до быстрее некуда. Без переписывания. Это если в лоб отвечать на поставленный вопрос так, как он задан.

А ещё zone map вполне может помочь в данном конкретном случае. Как раз для того и придуманы.
...
Рейтинг: 0 / 0
26.01.2018, 01:16
    #39591383
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
partition pruning при условии только на subpartition
Bobby Z.зато ускорит выборки по RUN_IDхм, ТС не говорил ни об уникальности RUN_ID, ни вообще о селективности, может там фулсканы нужны...
...
Рейтинг: 0 / 0
26.01.2018, 01:25
    #39591386
Bobby Z.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
partition pruning при условии только на subpartition
xtenderBobby Z.зато ускорит выборки по RUN_IDхм, ТС не говорил ни об уникальности RUN_ID, ни вообще о селективности, может там фулсканы нужны...
Alexus12RUN_ID - монотонно возрастающее число, идентифицирующее набор строк Я сванговал из этого, что селективность достаточно высокая. Да и само название колонки как бы намекает. Хотя может каждый run генерит миллионы строк, тогда индекс, конечно, только хуже сделает.

Кстати, забыл сказать, что Zone Maps доступны только на Exadata и Supercluster, к сожалению, так что могут оказаться неприменимы в силу платформы. К хорошему быстро привыкаешь... :)
...
Рейтинг: 0 / 0
26.01.2018, 11:16
    #39591492
partition pruning при условии только на subpartition
[quot Bobby Z.]xtender
Кстати, забыл сказать, что Zone Maps доступны только на Exadata и Supercluster, к сожалению, так что могут оказаться неприменимы в силу платформы.

Эм... Сейчас читаю про zone maps, не увидел этого ограничения, разве что появилась эта фича только в 12с. Можно ссылочку, где про доступность только на экзе написано? Или вы спутали со storage index?
...
Рейтинг: 0 / 0
26.01.2018, 11:40
    #39591507
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
partition pruning при условии только на subpartition
Мимо крокодил,

https://docs.oracle.com/database/121/DBLIC/options.htm#DBLIC152 Zone Maps (Available starting with Oracle Database 12c Release 1 (12.1.0.2); Requires Exadata or Supercluster)
...
Рейтинг: 0 / 0
26.01.2018, 11:48
    #39591512
Alexus12
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
partition pruning при условии только на subpartition
Спасибо!
Была надежда на что-то типа Zone Maps ... но:

https://docs.oracle.com/database/121/DBLIC/editions.htm#DBLIC109
Zone Maps - Requires the Partitioning option, and Exadata or Supercluster


про селективность:
RUN_ID - монотонно возрастающее число, идентифицирующее набор строк (в общем случае от 1000 строк до разумной бесконечности на один конкретный RUN_ID)
...
Рейтинг: 0 / 0
26.01.2018, 11:58
    #39591519
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
partition pruning при условии только на subpartition
Alexus12,

В принципе поможет даже локальный индекс по RUN_ID с адекватной статистикой - там где не будет нужного диапазона - будет index range scan, а в нужной подсекции в зависимости от статистики FTS или IRS
...
Рейтинг: 0 / 0
26.01.2018, 11:59
    #39591521
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
partition pruning при условии только на subpartition
IRS по подсекции где нет подходящего диапазона (high value/low value) будет моментальным
...
Рейтинг: 0 / 0
26.01.2018, 12:00
    #39591523
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
partition pruning при условии только на subpartition
Читай про трансформацию table expansion
...
Рейтинг: 0 / 0
26.01.2018, 12:00
    #39591525
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
partition pruning при условии только на subpartition
Перебейте на partition by range (RUN_ID).
Ввиду корреляции между run_id и create_ts subpartitioning не требуется.
...
Рейтинг: 0 / 0
26.01.2018, 12:02
    #39591527
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
partition pruning при условии только на subpartition
правда будет шанс нарваться на ограничение inlist в 1000 элементов при table expansion
...
Рейтинг: 0 / 0
26.01.2018, 12:05
    #39591528
Alexus12
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
partition pruning при условии только на subpartition
дополнительное условие по теме можно ли как-то ускорить эти запросы (в 1024К раз) без переписывания:
если известно, что
а) таблица всегда только дописывается, т.е. в старых партициях CREATE_TS не появляются новые run_id
б) под конкретным техн.юзером use case этой таблицы выглядит так:

1) заполнить, вставив набор строк с:
- конкретным run_id
- CREATE_TS, равным CURRENT_TIMESTAMP

2) прочитать (для сбора итогов или иных целей) "только что вставленное" на шаге 1, при этом:
- run_id известен и фильтруется (сейчас так работает тех.запрос)
- CREATE_TS не фильтруется и не известен тех.запросу, но его можно указать не точный, а на сутки назад от CURRENT_TIMESTAMP , т.к. это все равно решит задачу отсечения лишних 365*3 партиций

в этом use case применимым выглядит подклеивание к запросам этого юзера к этой таблице условия во where:
CREATE_TS > systimestamp - 1

сделать это можно, например, навесив vpd policy
https://docs.oracle.com/cd/B28359_01/network.111/b28531/vpd.htm#DBSEG98215
Essentially, Oracle Virtual Private Database adds a dynamic WHERE clause to a SQL statement that is issued against the table, view, or synonym to which an Oracle Virtual Private Database security policy was applied.

конечно, это нецелевое ее использование, но - рабочий вариант?
...
Рейтинг: 0 / 0
26.01.2018, 12:09
    #39591532
Alexus12
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
partition pruning при условии только на subpartition
andrey_anonymous,

есть adhoc-запросы по таблице, которые отбирают как раз по create_ts, поэтому не хочется...
...
Рейтинг: 0 / 0
26.01.2018, 12:15
    #39591536
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
partition pruning при условии только на subpartition
Alexus12,

проще и правильнее было бы воспользоваться interval-reference partitioning: создали родительскую таблицу из (CREATE_TS,RUN_ID) секционированную по CREATE_TS, а текущая уже была бы дочерней к ней
...
Рейтинг: 0 / 0
26.01.2018, 12:15
    #39591538
Alexus12
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
partition pruning при условии только на subpartition
xtender,

table expansion - хороший вариант, но не в нашем случае - читаем записанное почти сразу, см use case выше
...
Рейтинг: 0 / 0
26.01.2018, 12:23
    #39591542
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
partition pruning при условии только на subpartition
Alexus12xtender,

table expansion - хороший вариант, но не в нашем случае - читаем записанное почти сразу, см use case вышену и что? оверхед-то будет меньше чем в секунду ~1000 логических чтений корня индекса
...
Рейтинг: 0 / 0
26.01.2018, 12:23
    #39591543
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
partition pruning при условии только на subpartition
сейчас то у вас вообще ~1000 фулсканов
...
Рейтинг: 0 / 0
26.01.2018, 12:26
    #39591547
Alexus12
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
partition pruning при условии только на subpartition
xtender,
>проще и правильнее было бы воспользоваться interval-reference partitioning

возможно, но:
1) хочется обойтись без изменения таблиц и запросов
2) interval-reference partitioning требует явного неdisabled FK-ключа, на таких объемах очень не хочется...
...
Рейтинг: 0 / 0
26.01.2018, 12:29
    #39591550
Alexus12
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
partition pruning при условии только на subpartition
xtenderAlexus12xtender,

table expansion - хороший вариант, но не в нашем случае - читаем записанное почти сразу, см use case вышену и что? оверхед-то будет меньше чем в секунду ~1000 логических чтений корня индекса

да, в такой постановке 1000 логических чтений корня индекса лучше 1000 FTS

насколько это лучше/хуже моего варианта с vpd?
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / partition pruning при условии только на subpartition / 25 сообщений из 39, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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