powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Автовыбор партиции в селекте
5 сообщений из 5, страница 1 из 1
Автовыбор партиции в селекте
    #40083232
Arists
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.

Допустим у нас есть таблица journal, содержащая в себе поля: ID_ACCOUNT, RUB, DATE_FROM, DATE_TO.
Эта таблица партиционирована помесячно на поле DATE_FROM
ID_ACCOUNT - ID счета
RUB - остаток в рублях
DATE_FROM - дата начала действия остатка
DATE_TO - дата конца действия остатка

Допустим есть функция GET_RUB (P_ID_ACCOUNT number, P_DATE datе), которая возвращает данные по селекту:
Код: plsql
1.
2.
3.
select RUB into L_RUB from journal
where ID_ACCOUNT = P_ID_ACCOUNT and P_DATE between date_from and date_to;
return L_RUB;



Можно ли каким то образом сделать так, чтобы автоматически (возможно через хинты, возможно ещё как то) выбиралась нужная партиция в селекте?
...
Рейтинг: 0 / 0
Автовыбор партиции в селекте
    #40083233
Arists
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В голову приходит использовать USER_TAB_PARTITIONS. Потом записывать имя нужно партиции в переменную и через динамический SQL подставлять в запрос.
Но не хочется связываться с динамическим SQL, может можно как то по-другому?
...
Рейтинг: 0 / 0
Автовыбор партиции в селекте
    #40083261
flexgen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arists,

А почитать документацию?

Предположим, что имена partitions имеют вид P0, P1 ...P(N).

Соответственно, запрос будет выглядеть вот так:
Код: plsql
1.
2.
select RUB into L_RUB from journal PARTITION (P0)
where ID_ACCOUNT = P_ID_ACCOUNT;



Вместо P0 подставь имя необходимого partition.
...
Рейтинг: 0 / 0
Автовыбор партиции в селекте
    #40083265
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arists

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


Оптимизатор прекрасно знает какие партиции читать и какие нет.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
DROP TABLE JOURNAL PURGE
/
CREATE TABLE JOURNAL(ID_ACCOUNT NUMBER,RUB NUMBER,DATE_FROM DATE, DATE_TO DATE)
PARTITION BY RANGE(DATE_FROM)
INTERVAL(INTERVAL '1' MONTH)
(
PARTITION P0 VALUES LESS THAN(DATE '2021-01-01')
)
/
EXPLAIN PLAN FOR
select RUB from journal
where ID_ACCOUNT = :P_ID_ACCOUNT and :P_DATE between date_from and date_to
/
SET LINESIZE 100
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY)
/
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
Plan hash value: 2112404017

----------------------------------------------------------------------------------------------------
| Id  | Operation                | Name    | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
----------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT         |         |     1 |    44 |     2   (0)| 00:00:01 |       |       |
|   1 |  PARTITION RANGE ITERATOR|         |     1 |    44 |     2   (0)| 00:00:01 |     1 |   KEY |
|*  2 |   TABLE ACCESS FULL      | JOURNAL |     1 |    44 |     2   (0)| 00:00:01 |     1 |   KEY |
----------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
---------------------------------------------------

   2 - filter("ID_ACCOUNT"=TO_NUMBER(:P_ID_ACCOUNT) AND "DATE_FROM"<=:P_DATE AND
              "DATE_TO">=:P_DATE)

Note
-----
   - dynamic statistics used: dynamic sampling (level=2)

19 rows selected.

SQL>



SY.
...
Рейтинг: 0 / 0
Автовыбор партиции в селекте
    #40083266
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если есть локальный индекс на DATE_FROM то план:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
DROP TABLE JOURNAL PURGE
/
CREATE TABLE JOURNAL(ID_ACCOUNT NUMBER,RUB NUMBER,DATE_FROM DATE, DATE_TO DATE)
PARTITION BY RANGE(DATE_FROM)
INTERVAL(INTERVAL '1' MONTH)
(
PARTITION P0 VALUES LESS THAN(DATE '2021-01-01')
)
/
CREATE INDEX JOURNAL_IDX1
  ON JOURNAL(DATE_FROM)
  LOCAL
/
EXPLAIN PLAN FOR
select RUB from journal
where ID_ACCOUNT = :P_ID_ACCOUNT and :P_DATE between date_from and date_to
/
SET LINESIZE 125
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY)
/

PLAN_TABLE_OUTPUT
-----------------------------------------------------------------------------------------------------------------------------
Plan hash value: 2847763976

---------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                                  | Name         | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
---------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                           |              |     1 |    44 |     0   (0)| 00:00:01 |       |       |
|   1 |  PARTITION RANGE ITERATOR                  |              |     1 |    44 |     0   (0)| 00:00:01 |     1 |   KEY |
|*  2 |   TABLE ACCESS BY LOCAL INDEX ROWID BATCHED| JOURNAL      |     1 |    44 |     0   (0)| 00:00:01 |     1 |   KEY |
|*  3 |    INDEX RANGE SCAN                        | JOURNAL_IDX1 |     1 |       |     0   (0)| 00:00:01 |     1 |   KEY |
---------------------------------------------------------------------------------------------------------------------------


PLAN_TABLE_OUTPUT
-----------------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------

   2 - filter("ID_ACCOUNT"=TO_NUMBER(:P_ID_ACCOUNT) AND "DATE_TO">=:P_DATE)
   3 - access("DATE_FROM"<=:P_DATE)

Note
-----
   - dynamic statistics used: dynamic sampling (level=2)

20 rows selected.

SQL>



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


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