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


Как не используя системных таблиц узнать имя партиции, в которой находится строка? Строки я фильтрую по полю с датой, но таблица секционирована по другой колонке.

Названия партиций такие:
partition NL_1600000 values less than (1600000)
partition NL_1700000 values less than (1700000)
partition NL_1800000 values less than (1800000)
...
partition NL_1600000 values less than (2100000)
...

То есть, число в названии увеличивается на 100 000. Названия мне нужны, чтобы в курсоре дергать отдельно эти партиции и джойнить с другой таблицей.
...
Рейтинг: 0 / 0
Как узнать имя партиции, которой принадлежит строка?
    #39286070
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
israelshamirдергать отдельно эти партицииRTFM partition_extension_clause (FAQ)
...
Рейтинг: 0 / 0
Как узнать имя партиции, которой принадлежит строка?
    #39286090
israelshamir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic,

ну да, ключ секционирования известен. Но как узнать какие именно партиции дергать? Таблица эта огроменная, я делаю выборку за прошедший месяц из нее, но секционирована она не по этому полю с датами, а по другому столбцу, и шоб не тянуть в курсор весь набор за месяц, я хочу обращаться к отдельным кускам.
...
Рейтинг: 0 / 0
Как узнать имя партиции, которой принадлежит строка?
    #39286111
pihel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
israelshamir,

без системной таблицы, думаю, не получится.
Вот способ по rowid или по любому полю из таблицы:
Код: plsql
1.
2.
3.
4.
5.
select uo.subobject_name from user_objects uo where uo.data_object_id = dbms_rowid.rowid_object(:ROWID);

execute immediate('select /*+ FIRST_ROWS(1) */ MAX( (select /*+ NO_UNNEST */ uo.subobject_name from user_objects uo where dbms_rowid.rowid_object(t.rowid) = uo.data_object_id ) ) as part_name
     from '||P_TABLE||' t
    where t.'||V_PART_COL||' = '||p_some_value||' and rownum = 1') INTO v_part;
...
Рейтинг: 0 / 0
Как узнать имя партиции, которой принадлежит строка?
    #39286133
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
israelshamirНо как узнать какие именно партиции дергать?Ты не увидел partition for?
...
Рейтинг: 0 / 0
Как узнать имя партиции, которой принадлежит строка?
    #39286143
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic,

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

большое спасибо за помощь!
...
Рейтинг: 0 / 0
Как узнать имя партиции, которой принадлежит строка?
    #39286945
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
israelshamir,

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

Короче, ситуация такая, что я стажер и меня не ввели в предметную область. Есть специальная таблица с датами и диапазонами значений. Я по ней вычисляю количество секций за месяц и генерю их названия(их там 146). Теперь вылез гемор с вложенными курсорами, ибо мне надо в циклах бежать по отдельным партициям + еще по одной таблице, в которой надо искать нужные строки и вставлять их в темповую таблицу. Цимес задачи в том, чтобы отточить навык говнокодинга на pl\sql. В общем, я не знаю, как правильно написать вложенные курсоры.

Вот что пока имею( я тут позаменял названия таблиц и схем):

Код: 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.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
DECLARE
v_tp_date_to_min ttt.column%TYPE;
v_tp_date_to_max ttt.column%TYPE;
v_count_part number;
v_min_value_part number;
v_unl_call_start_from zzz.col%type;
v_unl_call_start_to zzz.col%type;
v_cur_row_c1 ttt.table%ROWTYPE;
v_sql_stmt VARCHAR2(200);

BEGIN

select trunc(sysdate, 'DD')-7
into v_unl_call_start_from
from dual


select trunc(sysdate, 'DD')+1-1/86400
into v_unl_call_start_to
from dual

select trunc(add_months(sysdate, -4), 'MM')
into v_tp_date_to_min
from dual;


select add_months(trunc(last_day(sysdate)), -4)+1-1/86400
into v_tp_date_to_max
from dual


select floor(min(xxx.table)/100000) * 100000
into v_min_value_part
from xxx.table pc
where pc.dt >=  trunc(sysdate, 'DD') - 7
      and pc.dt < sysdate;


select ceil((max(pc.ps_to) - min(xxx.table))/100000) 
into v_count_part
from xxx.table pc
where pc.dt >=  trunc(sysdate, 'DD') - 7
      and pc.dt < sysdate;
      
sql_stmt := 'select unl.col1, unl.col2, unl.col3
from zzz.table partition(:1) unl  
where unl.call_start > :2
      and unl.call_start <= :3'      
      
      
CURSOR c1
IS
SELECT concat('NL_', v_min_value_part + (LEVEL - 1) * 100000)
FROM dual 
CONNECT BY LEVEL <= v_count_part
  
OPEN c1;

LOOP
  FETCH c1 INTO v_cur_row_c1;
  EXIT WHEN c1%NOTFOUND;
        
execute immediate sql_stmt using v_cur_row_c1, v_unl_call_start_from, v_unl_call_start_to               
          
   END LOOP;

   CLOSE c1;
END; 
-- это надо засунуть в курсоры (1)
select tp.*
      from ttt.table tp,
           vvv.table s
      where 
           tp.service_id = s.service_id
           and lower(s.description) like '%шо то там%' 
           and tp.date_to >= v_tp_date_to_min
           and tp.date_to <= v_tp_date_to_max
           and rownum <= 500
           
--и это (2)
sql_stmt := 'select unl.col1, unl.col2, unl.col3
from zzz.table partition(:1) unl  
where unl.call_start > :2
      and unl.call_start <= :3'  
/* в цикле для каждой строки из (1), 
   бежать по (2) и отсеивать нужные строки на основе сравнения соответствующих полей, 
   вставлять нужные строки в темповую таблицу*/
...
Рейтинг: 0 / 0
Как узнать имя партиции, которой принадлежит строка?
    #39287016
israelshamir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
israelshamir,

та таблица(огромная, за день не обсерешь), из которой мне нужны отдельные партиции находится в другой базе.
...
Рейтинг: 0 / 0
Как узнать имя партиции, которой принадлежит строка?
    #39287039
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
israelshamirКороче, ситуация такая, что я стажер и меня не ввели в предметную область.Так попроси чтоб тебя ввели.
Если ты делаешь какой-то говнокод без попыток понять данные ты гарантированно завалишь задачу.

Вместо того, чтоб вываливать полотно на форум с просьбой сделать за тебя лучше задай конкретные вопросы тому, кто тебя менторит.

Скажу по секрету, что я в случае работы со стажером больше обращал бы внимание как он думает и подходит к решению поставленных задач чем сколько он наговнокодил.

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

Теперь если у тебя таки есть зависимость. Например, если дата по которой ты фильтруешь гарантированно находится в пределах одного дня от ключа секционирования, то просто примени видоизмененный предикат к ключу секционирования. Оракл сам сделает partition pruning.

Кляузу partition [for] имеет смысл использовать поскольку в это случае по другому накладываются блокировки, особенно хороший профит может быть при параллельных запросах. Сомневаюсь, что это от тебя требуется.
...
Рейтинг: 0 / 0
Как узнать имя партиции, которой принадлежит строка?
    #39287042
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshopНапример, если дата по которой ты фильтруешь гарантированно находится в пределах одного дня от ключа секционированияТакой зависимости явно быть не может, поскольку ключ секционирования не дата. :)
...
Рейтинг: 0 / 0
Как узнать имя партиции, которой принадлежит строка?
    #39288522
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
israelshamir,

не по теме

select trunc(sysdate, 'DD')-7
into v_unl_call_start_from
from dual


заменить на
v_unl_call_start_from:=trunc(sysdate, 'DD')-7;

и тд

зы
вопрос по циклам не я не понял
мож Вам вместо execute immediate надо open ...

......
stax
...
Рейтинг: 0 / 0
Как узнать имя партиции, которой принадлежит строка?
    #39288588
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pihelisraelshamir,
Вот способ по rowid или по любому полю из таблицы:


Или прoще:

Код: 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.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
SQL> CREATE TABLE ORDERS_X(
  2                        ORDER_ID          NUMBER NOT NULL,
  3                        ORDER_DATE        TIMESTAMP(6),
  4                        ORDER_STATUS      NUMBER NOT NULL,
  5                        ORDER_STATUS_DATE TIMESTAMP(6) NOT NULL,
  6                        COMMENTS CLOB
  7                       )
  8    ENABLE ROW MOVEMENT
  9    PARTITION BY RANGE(ORDER_STATUS_DATE)
 10    INTERVAL(NUMTODSINTERVAL(1,'DAY'))
 11    SUBPARTITION BY RANGE(ORDER_STATUS)
 12      SUBPARTITION TEMPLATE 
 13        (SUBPARTITION IN_PROGRESS VALUES LESS THAN (5),
 14         SUBPARTITION COMPLETE    VALUES LESS THAN(6)
 15        )
 16    (
 17     PARTITION P0 VALUES LESS THAN (TIMESTAMP '2015-01-01 00:00:00')
 18    )
 19  /

Table created.

SQL> INSERT
  2    INTO ORDERS_X
  3    VALUES(
  4           1,
  5           SYSTIMESTAMP,
  6           0,
  7           SYSTIMESTAMP,
  8           'ORDER 1'
  9          )
 10  /

1 row created.

SQL> SELECT  (
  2           SELECT  SUBOBJECT_NAME
  3             FROM  USER_OBJECTS
  4             WHERE OBJECT_ID = DBMS_MVIEW.PMARKER(X.ROWID)
  5          ) SUBPARTITION_NAME
  6    FROM  ORDERS_X X
  7    WHERE ORDER_ID = 1
  8  /

SUBPARTITION_NAME
-------------------------------------------------------------------------
SYS_SUBP3468

SQL> UPDATE ORDERS_X
  2     SET ORDER_STATUS = 5
  3  /

1 row updated.

SQL> SELECT  (
  2           SELECT  SUBOBJECT_NAME
  3             FROM  USER_OBJECTS
  4             WHERE OBJECT_ID = DBMS_MVIEW.PMARKER(X.ROWID)
  5          ) SUBPARTITION_NAME
  6    FROM  ORDERS_X X
  7    WHERE ORDER_ID = 1
  8  /

SUBPARTITION_NAME
-------------------------------------------------------------------------
SYS_SUBP3469

SQL> 



SY.
...
Рейтинг: 0 / 0
Как узнать имя партиции, которой принадлежит строка?
    #39289769
Maxim Demenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYpihelisraelshamir,
Вот способ по rowid или по любому полю из таблицы:


WHERE DATA_OBJECT_ID = DBMS_MVIEW.PMARKER(X.ROWID)



Best regards

Maxim
...
Рейтинг: 0 / 0
Как узнать имя партиции, которой принадлежит строка?
    #39289982
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Demenko WHERE DATA_OBJECT_ID = DBMS_MVIEW.PMARKER(X.ROWID)


Абсолютно без разницы.

SY.
...
Рейтинг: 0 / 0
Как узнать имя партиции, которой принадлежит строка?
    #39289988
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYАбсолютно без разницы.

Код: 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.
create table testpart(a number, b varchar2(100))
segment creation immediate
partition by range(a)
(partition p1 values less than (3)
,partition pm values less than (maxvalue)
) 
create table succeeded.

insert into testpart select rownum, rownum from dual connect by level < 6
5 rows inserted

alter table testpart move partition P1
 alter table testpart succeeded.

SELECT  (
           SELECT  SUBOBJECT_NAME
             FROM  USER_OBJECTS
            WHERE object_id = DBMS_MVIEW.PMARKER(X.ROWID)
          ) SUBPARTITION_NAME
    FROM  testpart X

SUBPARTITION_NAME              
------------------------------ 
                               
                               
PM                             
PM                             
PM                             

5 rows selected

SELECT  (
           SELECT  SUBOBJECT_NAME
             FROM  USER_OBJECTS
            WHERE DATA_object_id = DBMS_MVIEW.PMARKER(X.ROWID)
          ) SUBPARTITION_NAME
    FROM  testpart X

SUBPARTITION_NAME              
------------------------------ 
P1                             
P1                             
PM                             
PM                             
PM                             

5 rows selected
...
Рейтинг: 0 / 0
Как узнать имя партиции, которой принадлежит строка?
    #39289996
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ладно, не всякий DBA делает move своим partitions.
Но split/merge - тоже в списке:

Код: 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.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
SELECT  (  SELECT  SUBOBJECT_NAME
             FROM  USER_OBJECTS
            WHERE OBJECT_ID = DBMS_MVIEW.PMARKER(X.ROWID)
          ) partname_by_object_id
      , (  SELECT  SUBOBJECT_NAME
             FROM  USER_OBJECTS
            WHERE DATA_object_id = DBMS_MVIEW.PMARKER(X.ROWID)
          ) partname_by_data_object_id
    FROM  testpart X

PARTNAME_BY_OBJECT_ID          PARTNAME_BY_DATA_OBJECT_ID     
------------------------------ ------------------------------ 
P1                             P1                             
P1                             P1                             
PM                             PM                             
PM                             PM                             
PM                             PM                             

5 rows selected

alter table testpart merge partitions p1,pm into partition pm
 alter table testpart succeeded.

SELECT  (  SELECT  SUBOBJECT_NAME
             FROM  USER_OBJECTS
            WHERE OBJECT_ID = DBMS_MVIEW.PMARKER(X.ROWID)
          ) partname_by_object_id
      , (  SELECT  SUBOBJECT_NAME
             FROM  USER_OBJECTS
            WHERE DATA_object_id = DBMS_MVIEW.PMARKER(X.ROWID)
          ) partname_by_data_object_id
    FROM  testpart X

PARTNAME_BY_OBJECT_ID          PARTNAME_BY_DATA_OBJECT_ID     
------------------------------ ------------------------------ 
                               PM                             
                               PM                             
                               PM                             
                               PM                             
                               PM                             

5 rows selected

alter table testpart split partition pm at (4) into ( partition p1, partition pm)
 alter table testpart succeeded.

SELECT  (  SELECT  SUBOBJECT_NAME
             FROM  USER_OBJECTS
            WHERE OBJECT_ID = DBMS_MVIEW.PMARKER(X.ROWID)
          ) partname_by_object_id
      , (  SELECT  SUBOBJECT_NAME
             FROM  USER_OBJECTS
            WHERE DATA_object_id = DBMS_MVIEW.PMARKER(X.ROWID)
          ) partname_by_data_object_id
    FROM  testpart X

PARTNAME_BY_OBJECT_ID          PARTNAME_BY_DATA_OBJECT_ID     
------------------------------ ------------------------------ 
P1                             P1                             
P1                             P1                             
P1                             P1                             
                               PM                             
                               PM                             

5 rows selected
...
Рейтинг: 0 / 0
Как узнать имя партиции, которой принадлежит строка?
    #39290042
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Согласен. Не учел что сегмент может "пeрeехать".

SY.
...
Рейтинг: 0 / 0
Как узнать имя партиции, которой принадлежит строка?
    #39290050
Maxim Demenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я имел в виду скорее (исходя из своего совершенно субъективного опыта DWH проектов) довольно распространенные операции truncate partition + insert / exchange partition.

Best regards

Maxim
...
Рейтинг: 0 / 0
Как узнать имя партиции, которой принадлежит строка?
    #39290533
israelshamir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем спасибо за помощь и пищу для размышлений!
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как узнать имя партиции, которой принадлежит строка?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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