s
Позиция: 32
Size: a a a
s
АС
s
АС
АС
s
CREATE TABLE measurement (Всё, поменяли местами.
city_id int not null,
logdate date not null,
peaktemp int,
unitsales int
) PARTITION BY RANGE (logdate);
CREATE TABLE measurement_y2006m02 PARTITION OF measurement
FOR VALUES FROM ('2006-02-01') TO ('2006-03-01');
CREATE TABLE measurement_y2006m03 PARTITION OF measurement
FOR VALUES FROM ('2006-03-01') TO ('2006-04-01');
CREATE TABLE measurement_y2006m04 PARTITION OF measurement
FOR VALUES FROM ('2006-04-01') TO ('2006-05-01');
-- Заполняем заменяемую позже партицию
insert into measurement values(1,'2006-03-02',0,0);
--Создаём таблицу для обмена с партицией
CREATE TABLE measurement_y2006m03_2
(LIKE measurement INCLUDING DEFAULTS INCLUDING CONSTRAINTS);
ALTER TABLE measurement_y2006m03_2 ADD CONSTRAINT y2006m03
CHECK ( logdate >= DATE '2006-03-01' AND logdate < DATE '2006-04-01' );
-- Заполняем новую таблицу чем нужно
insert into measurement_y2006m03_2 values(2,'2006-03-02',1,1), values(3,'2006-03-03',2,2);
--Меняем местами живую партицию и новую исправленную в транзакции (имена меняю по сути для красоты)
BEGIN;
ALTER TABLE measurement DETACH PARTITION measurement_y2006m03;
ALTER TABLE measurement_y2006m03 RENAME TO measurement_y2006m03_old;
ALTER TABLE measurement_y2006m03_2 RENAME TO measurement_y2006m03;
ALTER TABLE measurement ATTACH PARTITION measurement_y2006m03 FOR VALUES FROM ('2006-03-01') TO ('2006-04-01');
ALTER TABLE measurement_y2006m03_old RENAME TO measurement_y2006m03_2;
COMMIT;
s
ALTER TABLE measurement_y2006m03_2 ADD CONSTRAINT y2006m03
CHECK ( logdate >= DATE '2006-03-01' AND logdate < DATE '2006-04-01' );
Вешается, чтобы при её добавлении в качестве партиции, не нужно было сканировать таблицу и проверять ограничения секции. удерживая блокировку ACCESS EXCLUSIVE в секции и SHARE UPDATE EXCLUSIVE в родительской таблице. После выполнения команды ATTACH PARTITION это ставшее ненужным ограничение CHECK при желании можно удалить.АС
CREATE TABLE measurement (Всё, поменяли местами.
city_id int not null,
logdate date not null,
peaktemp int,
unitsales int
) PARTITION BY RANGE (logdate);
CREATE TABLE measurement_y2006m02 PARTITION OF measurement
FOR VALUES FROM ('2006-02-01') TO ('2006-03-01');
CREATE TABLE measurement_y2006m03 PARTITION OF measurement
FOR VALUES FROM ('2006-03-01') TO ('2006-04-01');
CREATE TABLE measurement_y2006m04 PARTITION OF measurement
FOR VALUES FROM ('2006-04-01') TO ('2006-05-01');
-- Заполняем заменяемую позже партицию
insert into measurement values(1,'2006-03-02',0,0);
--Создаём таблицу для обмена с партицией
CREATE TABLE measurement_y2006m03_2
(LIKE measurement INCLUDING DEFAULTS INCLUDING CONSTRAINTS);
ALTER TABLE measurement_y2006m03_2 ADD CONSTRAINT y2006m03
CHECK ( logdate >= DATE '2006-03-01' AND logdate < DATE '2006-04-01' );
-- Заполняем новую таблицу чем нужно
insert into measurement_y2006m03_2 values(2,'2006-03-02',1,1), values(3,'2006-03-03',2,2);
--Меняем местами живую партицию и новую исправленную в транзакции (имена меняю по сути для красоты)
BEGIN;
ALTER TABLE measurement DETACH PARTITION measurement_y2006m03;
ALTER TABLE measurement_y2006m03 RENAME TO measurement_y2006m03_old;
ALTER TABLE measurement_y2006m03_2 RENAME TO measurement_y2006m03;
ALTER TABLE measurement ATTACH PARTITION measurement_y2006m03 FOR VALUES FROM ('2006-03-01') TO ('2006-04-01');
ALTER TABLE measurement_y2006m03_old RENAME TO measurement_y2006m03_2;
COMMIT;
s
s
E
WITH xxx as ( select * from (values (1,2)) as t(id) )
select * from my_fn( 'xxx' );
YS
WITH xxx as ( select * from (values (1,2)) as t(id) )
select * from my_fn( 'xxx' );
E
Д
E
E
Д
E
Д
Д