Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Перенос из таблицы в партицию  [new]
Леонов Юрий
Member

Откуда: Украина, Харьков
Сообщений: 542
Добрый день!

В доках не нашел четкого описания проблемы, хотелось бы уточнить у знатоков.
Есть таблица MasterTable с полями (id, key, ...), которая партицирована по полю key by range.
Есть промежуточная непартицированная таблица TempTable с аналогичной структурой полей.
Внимание, вопрос:
При вызове
ALTER TABLE MASTERTABLE EXCHANGE PARTITION F100 WITH TABLE TEMPTABLE WITHOUT VALIDATION

из таблицы TempTable перенесутся абсолютно все данные или только те, которые удовлетворяют условию партиции?
Партиция F100 имеет ограничение values less than 101, например.
Допускается, что в таблице TempTable могут быть данные по разному значению KEY (100, 101, 102...)

Спасибо
8 ноя 19, 13:24    [22012285]     Ответить | Цитировать Сообщить модератору
 Re: Перенос из таблицы в партицию  [new]
-2-
Member

Откуда:
Сообщений: 14995
Леонов Юрий
В доках не нашел четкого описания
Что означает WITHOUT VALIDATION?
8 ноя 19, 13:27    [22012296]     Ответить | Цитировать Сообщить модератору
 Re: Перенос из таблицы в партицию  [new]
Леонов Юрий
Member

Откуда: Украина, Харьков
Сообщений: 542
-2-
Что означает WITHOUT VALIDATION?

Значит, что можно выполнить без проверки корректности ключей
8 ноя 19, 13:34    [22012304]     Ответить | Цитировать Сообщить модератору
 Re: Перенос из таблицы в партицию  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15454
Леонов Юрий,

разумеется, только те, которые удовлетворяют условию партиции
если же есть и те, которые не удовлетворяют условию партиции - словите exception по всей морде
8 ноя 19, 13:51    [22012325]     Ответить | Цитировать Сообщить модератору
 Re: Перенос из таблицы в партицию  [new]
Леонов Юрий
Member

Откуда: Украина, Харьков
Сообщений: 542
orawish
Леонов Юрий,

разумеется, только те, которые удовлетворяют условию партиции
если же есть и те, которые не удовлетворяют условию партиции - словите exception по всей морде


то есть если я указываю партицию для key=100, то при наличии данных в обычной таблице с key=100 перенос мне выдаст ошибку?
8 ноя 19, 14:08    [22012342]     Ответить | Цитировать Сообщить модератору
 Re: Перенос из таблицы в партицию  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15454
Леонов Юрий
orawish
Леонов Юрий,

разумеется, только те, которые удовлетворяют условию партиции
если же есть и те, которые не удовлетворяют условию партиции - словите exception по всей морде


то есть если я указываю партицию для key=100, то при наличии данных в обычной таблице с key=100 перенос мне выдаст ошибку?


то есть если я указываю партицию для key=100, то при наличии данных в обычной таблице с key<>100 перенос мне выдаст ошибку
8 ноя 19, 14:17    [22012350]     Ответить | Цитировать Сообщить модератору
 Re: Перенос из таблицы в партицию  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 17717
orawish
то есть если я указываю партицию для key=100, то при наличии данных в обычной таблице с key<>100 перенос мне выдаст ошибку

Серьезно?
create table dropme_t(key, val)
partition by range(key)
(partition p99 values less than (100)
,partition p100 values less than (101)
)as
select rownum+98, case rownum+98 when 100 then 'partition p100' else 'partition p99' end from dual connect by level < 3
;
Table created

select * from dropme_t partition (p100);
       KEY VAL
---------- --------------
       100 partition p100
create table dropme_t_tmp as select * from dropme_t where 1=1
;
Table created

select * from dropme_t_tmp
;
       KEY VAL
---------- --------------
        99 partition p99
       100 partition p100

alter table dropme_t exchange partition (p100) with table dropme_t_tmp
;

alter table dropme_t exchange partition (p100) with table dropme_t_tmp
ORA-14099: Не все строки таблицы могут быть занесены в данную секцию

alter table dropme_t exchange partition (p100) with table dropme_t_tmp WITHOUT VALIDATION
;
Table altered

select * from dropme_t partition (p100)
;
       KEY VAL
---------- --------------
        99 partition p99
       100 partition p100

SQL> 
8 ноя 19, 14:58    [22012387]     Ответить | Цитировать Сообщить модератору
 Re: Перенос из таблицы в партицию  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 17717
Ну и спецэффекты:

SQL> select * from dropme_t where key <= 99;
       KEY VAL
---------- --------------
        99 partition p99

SQL> select * from dropme_t where key <= 100;
       KEY VAL
---------- --------------
        99 partition p99
        99 partition p99
       100 partition p100

SQL> 
8 ноя 19, 15:00    [22012392]     Ответить | Цитировать Сообщить модератору
 Re: Перенос из таблицы в партицию  [new]
Леонов Юрий
Member

Откуда: Украина, Харьков
Сообщений: 542
andrey_anonymous,

спасибо за разъяснение
8 ноя 19, 15:31    [22012413]     Ответить | Цитировать Сообщить модератору
 Re: Перенос из таблицы в партицию  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 9635
andrey_anonymous
Ну и спецэффекты:


Избегаем спецэффектов:

SQL> select * from dropme_t partition (p100);

       KEY VAL
---------- --------------
        99 partition p99
       100 partition p100

SQL> alter table dropme_t enable row movement;

Table altered.

SQL> update dropme_t set key = key; -- умный, гад :)

3 rows updated.

SQL> select * from dropme_t partition (p100);

       KEY VAL
---------- --------------
        99 partition p99
       100 partition p100

SQL> update dropme_t set key = key - 0; -- совсем умный, гад :)

3 rows updated.

SQL> select * from dropme_t partition (p100);

       KEY VAL
---------- --------------
        99 partition p99
       100 partition p100

SQL> update dropme_t set key = key - 10; -- а мы его туда

3 rows updated.

SQL> update dropme_t key = key + 10; -- и обратно

3 rows updated.

SQL> select * from dropme_t partition (p100);

       KEY VAL
---------- --------------
       100 partition p100

SQL> 


SY.
P.S. Процесс пожно соптимизировать если известно какие партиции будут задеты.

Сообщение было отредактировано: 9 ноя 19, 00:33
8 ноя 19, 23:14    [22012631]     Ответить | Цитировать Сообщить модератору
 Re: Перенос из таблицы в партицию  [new]
xtender
Member

Откуда: Мск
Сообщений: 5250
SY
SQL> update dropme_t set key = key - 10; -- а мы его туда

3 rows updated.

SQL> update dropme_t key = key + 10; -- и обратно
как-то сложно и кажется ненадежным. Имхо так лучше:
analyze table dropme_t partition (p100) validate structure cascade into INVALID_ROWS
/
select * from INVALID_ROWS r, dropme_t t where t.rowid=r.head_rowid
/
insert into dropme_t
select t.* from INVALID_ROWS r, dropme_t t where t.rowid=r.head_rowid
/
delete from dropme_t partition (p100) t
where t.rowid in (select r.head_rowid from INVALID_ROWS r)
/


или сразу все секции:
truncate table INVALID_ROWS
/
analyze table dropme_t validate structure cascade into INVALID_ROWS
/
select * from INVALID_ROWS r, dropme_t t where t.rowid=r.head_rowid
/
insert into dropme_t
select t.* from INVALID_ROWS r, dropme_t t where t.rowid=r.head_rowid
/
delete from dropme_t t
where t.rowid in (select r.head_rowid from INVALID_ROWS r)
/
9 ноя 19, 01:21    [22012649]     Ответить | Цитировать Сообщить модератору
 Re: Перенос из таблицы в партицию  [new]
jan2ary
Member

Откуда: Киев
Сообщений: 1777
Леонов Юрий,

Легко же проверяется самостоятельно, разве нет?
https://livesql.oracle.com
11 ноя 19, 10:51    [22013330]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить