powered by simpleCommunicator - 2.0.29     © 2024 Programmizd 02
Map
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Выбор max(id) только из крайнего сегмента таблицы
33 сообщений из 33, показаны все 2 страниц
Выбор max(id) только из крайнего сегмента таблицы
    #40130145
alHaos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день уважаемые.

Есть сегментированная по диапазону таблица ключ сегментирования поле "DATE", содержит поле "ID" number.

Первичный ключ "ID", "DATE" локальный.
Клиентское приложения периодически запрашивает MAX(ID) для инкрементирования.

При перемещении архивного сегмента возникла проблема, так как часть индекса таблицы после перемещения сегмента стала неиспользуемой, планы выполнения у пользователей поменялись и они выборкой MAX(ID) стали нагружать систему, и виснуть сами, так как первичный ключ перестал использоваться. Пока не перестроил часть этого сегмента.

Я задумался чтобы в клиентском приложении добавить выборку MAX(ID) только из текущего сегмента добавив условие DATE > trunc(sysdate, 'YEAR')

Но индекс перестает использоваться.

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

Прошу разъяснить.
...
Рейтинг: 0 / 0
Выбор max(id) только из крайнего сегмента таблицы
    #40130159
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alHaos,

1. ID скорее всего уникальная последовательность, оптимизатор не может применить INDEX SKIP SCAN.

2. В индексе нет выражения trunc(DATE , 'YEAR')
...
Рейтинг: 0 / 0
Выбор max(id) только из крайнего сегмента таблицы
    #40130162
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PaulWist

2. В индексе нет выражения trunc(DATE , 'YEAR')

у него > trunc( sysdate , 'YEAR')

......
stax
...
Рейтинг: 0 / 0
Выбор max(id) только из крайнего сегмента таблицы
    #40130168
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax

у него > trunc( sysdate , 'YEAR')

......
stax


Ааа, у ТС два индекса по ID и DATE, если внимательно вчитаться в текст.

Тогда надо смотреть на кардинальность индекса по DATE, и что в этом поле лежит на самом деле.

DDL таблицы индексов в студию.
...
Рейтинг: 0 / 0
Выбор max(id) только из крайнего сегмента таблицы
    #40130224
alHaos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PaulWist,
> Первичный ключ "ID", "DATE" локальный.

Индексов у меня пять, но по другим полям и интересует именно этот.
Индекс первичного ключа, в нем два поля "ID", "DATE", если что то неоднозначно сформулировал, готов уточнить, если это поможет решению.
...
Рейтинг: 0 / 0
Выбор max(id) только из крайнего сегмента таблицы
    #40130225
alHaos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может какое другое решение предложите.
...
Рейтинг: 0 / 0
Выбор max(id) только из крайнего сегмента таблицы
    #40130228
Никанор Кузьмич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alHaos
Может какое другое решение предложите.
alHaos
Клиентское приложения периодически запрашивает MAX(ID) для инкрементирования.
Использовать sequence для инкрементирования.
...
Рейтинг: 0 / 0
Выбор max(id) только из крайнего сегмента таблицы
    #40130229
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alHaos
так как часть индекса таблицы после перемещения сегмента стала неиспользуемой ...

за выходные (ночью) починить индекс

.....
stax
...
Рейтинг: 0 / 0
Выбор max(id) только из крайнего сегмента таблицы
    #40130233
alHaos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax, Так и делается сейчас, хотел бы как то в момент нагрузки.
...
Рейтинг: 0 / 0
Выбор max(id) только из крайнего сегмента таблицы
    #40130234
alHaos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Никанор Кузьмич, Поменять запрос, разработчики еще сделают, а вот менять логику тут все печально... Время, ресурсы, приоритеты...
...
Рейтинг: 0 / 0
Выбор max(id) только из крайнего сегмента таблицы
    #40130238
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
alHaos
Первичный ключ "ID", "DATE" локальный

alHaos
MAX(ID)
как же вы раньше не заметили, что MAX(ID) постоянно все секции перебирает...

alHaos
Клиентское приложения периодически запрашивает MAX(ID) для инкрементирования.
интересно, как вы раньше не нарвались на проблемы консистентности? "Одновременно" две сессии никогда не инкрементировали? Не проще вам было эмулировать сиквенс, например, завести отдельную таблицу для "текущего max(id)" - и брать его оттуда с увеличением в автономке и уже потом возвращать.

Насчет текущего: Допустим у вас такая таблица:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
create table t (
  id int,
  dt date,
  constraint t_pk primary key(id,dt)
    using index local
)
  partition by range (dt) 
  interval(numtodsinterval(1, 'day'))
  (
  PARTITION p0 VALUES LESS THAN (date'2022-01-01')
  )
/
begin
  insert into t 
    select level, date'2022-01-01' + numtodsinterval(level,'hour')
    from dual
    connect by level<=24*30;
  dbms_stats.gather_table_stats('','T');
end;
/



max(id) тогда будет с перебором всех секций
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Plan hash value: 2937412234

----------------------------------------------------------------------------------------------------
| Id  | Operation                   | Name | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
----------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |      |     1 |     4 |     1   (0)| 00:00:01 |       |       |
|   1 |  SORT AGGREGATE             |      |     1 |     4 |            |          |       |       |
|   2 |   PARTITION RANGE ALL       |      |     1 |     4 |     1   (0)| 00:00:01 |     1 |1048575|
|   3 |    INDEX FULL SCAN (MIN/MAX)| T_PK |     1 |     4 |     1   (0)| 00:00:01 |     1 |1048575|
----------------------------------------------------------------------------------------------------


max(dt) тоже будет не быстрым - см IFFS
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
----------------------------------------------------------------------------------------------------
| Id  | Operation                   | Name | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
----------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |      |     1 |     8 |    10   (0)| 00:00:01 |       |       |
|   1 |  PARTITION RANGE ALL MIN/MAX|      |     1 |     8 |            |          |1048575|     1 |
|   2 |   SORT AGGREGATE            |      |     1 |     8 |            |          |       |       |
|   3 |    INDEX FAST FULL SCAN     | T_PK |   720 |  5760 |    10   (0)| 00:00:01 |1048575|     1 |
----------------------------------------------------------------------------------------------------


select max(id) from t partition for (date'...') или просто partition (имя секции) конечно работать будут, но это вам надо будет получать сначала или макс дату или имя секции:
select max(id) from t partition for (date'2022-01-28')
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
----------------------------------------------------------------------------------------------------
| Id  | Operation                   | Name | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
----------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |      |     1 |     4 |     1   (0)| 00:00:01 |       |       |
|   1 |  SORT AGGREGATE             |      |     1 |     4 |            |          |       |       |
|   2 |   PARTITION RANGE SINGLE    |      |     1 |     4 |     1   (0)| 00:00:01 |    29 |    29 |
|   3 |    INDEX FULL SCAN (MIN/MAX)| T_PK |     1 |     4 |     1   (0)| 00:00:01 |    29 |    29 |
----------------------------------------------------------------------------------------------------


Можете, конечно, сделать функцию, которая будет сначала получать имя секции или дату и уже потом селектить по ней, но тогда лучше еще индекс завести например
Код: plsql
1.
create index t_ix_dt_id on t(dt,id) local;
...
Рейтинг: 0 / 0
Выбор max(id) только из крайнего сегмента таблицы
    #40130244
Никанор Кузьмич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alHaos
Никанор Кузьмич, Поменять запрос, разработчики еще сделают, а вот менять логику тут все печально...
А в чем печаль?
Сейчас они делают
Код: plsql
1.
select max(id) from table

и прибавляют к нему единицу, а нужно изменить всего лишь на
Код: plsql
1.
select table_seq.nextval from dual

и не прибавлять единицу... А еще можно сделать
Код: plsql
1.
select table_seq.nextval - 1 from dual

и даже прибавление единицы не убирать, если разрабы уж совсем ленивые заняты.
...
Рейтинг: 0 / 0
Выбор max(id) только из крайнего сегмента таблицы
    #40130245
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
alHaos
Никанор Кузьмич, Поменять запрос, разработчики еще сделают, а вот менять логику тут все печально... Время, ресурсы, приоритеты...
так это и будет "поменять запрос" тупо на некствал. Что вам ещё менять? Хуже текущего у вас уже все равно не придумать
...
Рейтинг: 0 / 0
Выбор max(id) только из крайнего сегмента таблицы
    #40130248
alHaos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sayan Malakshinov, даже не знаю, не думал как две сессии одновременно инкрементируют..., я не разработчик этой системы, может в рамках одной транзакции все...

имя секции в запросе, интересно но как быть в момент смены текущей секции.
...
Рейтинг: 0 / 0
Выбор max(id) только из крайнего сегмента таблицы
    #40130249
alHaos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Благодарю уважаемые за информацию к размышлению, дальнейшие ответы опционы.
...
Рейтинг: 0 / 0
Выбор max(id) только из крайнего сегмента таблицы
    #40130256
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alHaos
PaulWist,
> Первичный ключ "ID", "DATE" локальный.

Индексов у меня пять, но по другим полям и интересует именно этот.
Индекс первичного ключа, в нем два поля "ID", "DATE", если что то неоднозначно сформулировал, готов уточнить, если это поможет решению.


Повторяю:

DDL таблицы индексов в студию, перевожу, скрипты create table, create index.
...
Рейтинг: 0 / 0
Выбор max(id) только из крайнего сегмента таблицы
    #40130262
alHaos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PaulWist, Будьте любезны

Код: 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 "target_table"
(
  field_01 DATE,
  field_02 NUMBER,
  field_03 NUMBER,
  "DATE"   DATE not null, 
  field_04 NUMBER(10),
  field_05 NUMBER,
  field_06 VARCHAR2(10),
  field_07 VARCHAR2(2000),
  field_08 VARCHAR2(6),
  field_09 NUMBER(1) default 0,
  field_10 NUMBER,
  "id"     NUMBER not null, 
  field_11 NUMBER,
  field_12 VARCHAR2(2000),
  field_13 NUMBER,
  field_14 VARCHAR2(6),
  field_15 NUMBER,
  field_16 NUMBER,
  field_17 NUMBER,
  field_18 DATE,
  field_19 DATE
)
partition by range (DATE)
(
  partition PART_2003 values less than (TO_DATE(' 2004-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))

...

  partition PART_2021 values less than (TO_DATE(' 2022-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
  partition PART_2022 values less than (TO_DATE(' 2023-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
  partition PART_MAX values less than (MAXVALUE)
);
create index IDX_1 on "target_table" (field_10)
  compress  nologging  local;
create index IDX_2 on "target_table" (field_04, "DATE", field_03)
  compress  nologging  local;
create index IDX_3 on "target_table" (field_05)
  compress  nologging  local;
create index IDX_4 on "target_table" (field_17, "DATE", field_03)
  compress  nologging  local;
alter table "target_table"
  add constraint PK primary key (ID, "DATE")
  using index 
  local;
alter index PK nologging;
...
Рейтинг: 0 / 0
Выбор max(id) только из крайнего сегмента таблицы
    #40130290
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alHaos,

авторalter table "target_table"
add constraint PK primary key (ID, "DATE")
а почему ID без кавычек ? и нужно соблюдать регистр
...
Рейтинг: 0 / 0
Выбор max(id) только из крайнего сегмента таблицы
    #40130301
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
123ййа почему ID без кавычек ?

Потому что в отличии от DATE он не является зарезервированным словом, очевидно...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Выбор max(id) только из крайнего сегмента таблицы
    #40130303
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

посмотри create table.
...
Рейтинг: 0 / 0
Выбор max(id) только из крайнего сегмента таблицы
    #40130347
Фотография Владимир СА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alHaos
PaulWist, Будьте любезны

Код: 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 "target_table"
(
  field_01 DATE,
  field_02 NUMBER,
  field_03 NUMBER,
  "DATE"   DATE not null, 
  field_04 NUMBER(10),
  field_05 NUMBER,
  field_06 VARCHAR2(10),
  field_07 VARCHAR2(2000),
  field_08 VARCHAR2(6),
  field_09 NUMBER(1) default 0,
  field_10 NUMBER,
  "id"     NUMBER not null, 
  field_11 NUMBER,
  field_12 VARCHAR2(2000),
  field_13 NUMBER,
  field_14 VARCHAR2(6),
  field_15 NUMBER,
  field_16 NUMBER,
  field_17 NUMBER,
  field_18 DATE,
  field_19 DATE
)
partition by range (DATE)
(
  partition PART_2003 values less than (TO_DATE(' 2004-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))

...

  partition PART_2021 values less than (TO_DATE(' 2022-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
  partition PART_2022 values less than (TO_DATE(' 2023-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
  partition PART_MAX values less than (MAXVALUE)
);
create index IDX_1 on "target_table" (field_10)
  compress  nologging  local;
create index IDX_2 on "target_table" (field_04, "DATE", field_03)
  compress  nologging  local;
create index IDX_3 on "target_table" (field_05)
  compress  nologging  local;
create index IDX_4 on "target_table" (field_17, "DATE", field_03)
  compress  nologging  local;
alter table "target_table"
  add constraint PK primary key (ID, "DATE")
  using index 
  local;
alter index PK nologging;


Хм ... уникальность по ID, "DATE" ?
И где такой индекс ?
Или я может чего то не понимаю ?
...
Рейтинг: 0 / 0
Выбор max(id) только из крайнего сегмента таблицы
    #40130348
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alHaos
Stax, Так и делается сейчас, хотел бы как то в момент нагрузки.


Ключ в "При перемещении архивного сегмента". Это alter table move partition? Если да:

Код: 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.
88.
89.
90.
91.
SQL> CREATE TABLE TEST(
  2                    ID  NUMBER ,
  3                    DT DATE
  4                   )
  5    PARTITION BY RANGE (DT)
  6    (
  7    PARTITION P0 VALUES LESS THAN (DATE '2022-01-01'),
  8    PARTITION P1 VALUES LESS THAN (MAXVALUE)
  9    )
 10  /

Table created.

SQL> INSERT
  2    INTO TEST
  3    SELECT  LEVEL,
  4            DATE '2021-12-14' + LEVEL
  5      FROM  DUAL
  6      CONNECT BY LEVEL <= 30
  7  /

30 rows created.

SQL> CREATE UNIQUE INDEX TEST_PK
  2    ON TEST(
  3            ID,
  4            DT
  5           )
  6    LOCAL
  7  /

Index created.

SQL> ALTER TABLE TEST
  2    ADD CONSTRAINT TEST_PK
  3      PRIMARY KEY(
  4                  ID,
  5                  DT
  6                 )
  7
SQL> /

Table altered.

SQL> SELECT  PARTITION_NAME,
  2          STATUS
  3    FROM  USER_IND_PARTITIONS
  4    WHERE INDEX_NAME = 'TEST_PK'
  5  /

PARTITION_NAME  STATUS
--------------- --------
P0              USABLE
P1              USABLE

SQL> ALTER TABLE TEST
  2    MOVE PARTITION P1
  3  /

Table altered.

SQL> SELECT  PARTITION_NAME,
  2          STATUS
  3    FROM  USER_IND_PARTITIONS
  4    WHERE INDEX_NAME = 'TEST_PK'
  5  /

PARTITION_NAME  STATUS
--------------- --------
P0              USABLE
P1              UNUSABLE

SQL> ALTER TABLE TEST
  2    MOVE PARTITION P1
  3    ONLINE
  4  /

Table altered.

SQL> SELECT  PARTITION_NAME,
  2          STATUS
  3    FROM  USER_IND_PARTITIONS
  4    WHERE INDEX_NAME = 'TEST_PK'
  5  /

PARTITION_NAME  STATUS
--------------- --------
P0              USABLE
P1              USABLE

SQL>



SY.
...
Рейтинг: 0 / 0
Выбор max(id) только из крайнего сегмента таблицы
    #40130350
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
SQL> ALTER TABLE TEST
  2    MOVE PARTITION P1
  3    UPDATE INDEXES
  4  /

Table altered.

SQL> SELECT  PARTITION_NAME,
  2          STATUS
  3    FROM  USER_IND_PARTITIONS
  4    WHERE INDEX_NAME = 'TEST_PK'
  5  /

PARTITION_NAME  STATUS
--------------- --------
P0              USABLE
P1              USABLE

SQL>



SY.
...
Рейтинг: 0 / 0
Выбор max(id) только из крайнего сегмента таблицы
    #40130353
alHaos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир СА, Developer так нагноил скрипты, есть он там создался автоматически для первичного ключа.

уберите USING INDEX из DDL.
...
Рейтинг: 0 / 0
Выбор max(id) только из крайнего сегмента таблицы
    #40130364
Фотография SeaGate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sayan Malakshinovmax(id) тогда будет с перебором всех секций
...
max(dt) тоже

max(dt) практически никогда не будет перебирать все секции, т.к. в плане "PARTITION RANGE ALL MIN/MAX" и обратный просмотр партиций (от max к min).
Выполнение завершится на первой секции с данными.
Код: 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.
SQL> select --+ gather_plan_statistics
  2         max(id)
  3    from t;

   MAX(ID)
----------
       720

SQL> select * from dbms_xplan.display_cursor(format=>'allstats last partition');

PLAN_TABLE_OUTPUT
---------------------------------------------------------------------------------------------------------------
SQL_ID  cdjjpbx2x2a81, child number 0
-------------------------------------
select --+ gather_plan_statistics        max(id)   from t

Plan hash value: 2937412234

--------------------------------------------------------------------------------------------------------------
| Id  | Operation                   | Name | Starts | E-Rows | Pstart| Pstop | A-Rows |   A-Time   | Buffers |
--------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |      |      1 |        |       |       |      1 |00:00:00.01 |      31 |
|   1 |  SORT AGGREGATE             |      |      1 |      1 |       |       |      1 |00:00:00.01 |      31 |
|   2 |   PARTITION RANGE ALL       |      |      1 |      1 |     1 |1048575|     31 |00:00:00.01 |      31 |
|   3 |    INDEX FULL SCAN (MIN/MAX)| T_PK |     32 |      1 |     1 |1048575|     31 |00:00:00.01 |      31 |
--------------------------------------------------------------------------------------------------------------


15 rows selected.

SQL> select --+gather_plan_statistics
  2         max(dt)
  3    from t;

MAX(DT)
-----------
31-jan-2022

SQL> select * from dbms_xplan.display_cursor(format=>'allstats last partition');

PLAN_TABLE_OUTPUT
---------------------------------------------------------------------------------------------------------------
SQL_ID  3kjm4tjy24z9p, child number 0
-------------------------------------
select --+gather_plan_statistics        max(dt)   from t

Plan hash value: 1139818808

--------------------------------------------------------------------------------------------------------------
| Id  | Operation                   | Name | Starts | E-Rows | Pstart| Pstop | A-Rows |   A-Time   | Buffers |
--------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |      |      1 |        |       |       |      1 |00:00:00.01 |       4 |
|   1 |  PARTITION RANGE ALL MIN/MAX|      |      1 |      1 |1048575|     1 |      1 |00:00:00.01 |       4 |
|   2 |   SORT AGGREGATE            |      |      1 |      1 |       |       |      1 |00:00:00.01 |       4 |
|   3 |    INDEX FAST FULL SCAN     | T_PK |      1 |    720 |1048575|     1 |      1 |00:00:00.01 |       4 |
--------------------------------------------------------------------------------------------------------------

...
Рейтинг: 0 / 0
Выбор max(id) только из крайнего сегмента таблицы
    #40130366
alHaos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY, Благодарю. Завтра попробую. оба варианта.
...
Рейтинг: 0 / 0
Выбор max(id) только из крайнего сегмента таблицы
    #40130371
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
SeaGate,

Да, я там не то имел ввиду, неправильно написал: я имел ввиду, что не будет быстро - не будет IFS(min/max) по одной последней секции, а только full scan последние секции: IFFS как у меня показано или FTS
...
Рейтинг: 0 / 0
Выбор max(id) только из крайнего сегмента таблицы
    #40130374
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Поправил.
...
Рейтинг: 0 / 0
Выбор max(id) только из крайнего сегмента таблицы
    #40130663
alHaos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY, Вариант с UPDATE INDEXES работает так же как и MOVE затем REBUILD.
...
Рейтинг: 0 / 0
Выбор max(id) только из крайнего сегмента таблицы
    #40130664
alHaos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY, MOVE ONLINE выдал

Код: plaintext
ORA-14020: this physical attribute may not be specified for a table partition

Код: plaintext
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0
...
Рейтинг: 0 / 0
Выбор max(id) только из крайнего сегмента таблицы
    #40130732
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alHaos

Код: plaintext
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0


Будет тебе наука оглашать версию особенно если ты на древней.

SY.
...
Рейтинг: 0 / 0
Выбор max(id) только из крайнего сегмента таблицы
    #40130735
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alHaos
SY, Вариант с UPDATE INDEXES работает так же как и MOVE затем REBUILD.


Код: 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.
SQL> SELECT  VERSION
  2    FROM  V$INSTANCE
  3  /

VERSION
-----------------
11.2.0.4.0

SQL> SELECT  PARTITION_NAME,
  2          STATUS
  3    FROM  USER_IND_PARTITIONS
  4    WHERE INDEX_NAME = 'TEST_PK'
  5  /

PARTITION_NAME                 STATUS
------------------------------ --------
P0                             USABLE
P1                             UNUSABLE

SQL> ALTER TABLE TEST
  2    MOVE PARTITION P1
  3    UPDATE INDEXES
  4  /

Table altered.

SQL> SELECT  PARTITION_NAME,
  2          STATUS
  3    FROM  USER_IND_PARTITIONS
  4    WHERE INDEX_NAME = 'TEST_PK'
  5  /

PARTITION_NAME                 STATUS
------------------------------ --------
P0                             USABLE
P1                             USABLE

SQL>



SY.
...
Рейтинг: 0 / 0
Выбор max(id) только из крайнего сегмента таблицы
    #40130756
alHaos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY, я не о том, когда запускаешь с атрибутом UPDATE INDEXES, система делает MOVE, по завершению индексы становятся UNUSABLE и до завершения перестроения остаются UNUSABLE, просто это все делается в одной команде, по крайней мере 11 ведет себя именно так, я надеялся, что они вывалятся уже перестроенные, но это не так.

Так, что UPDATE INDEXES на сценарий особо не влияет.

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


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