Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Неблокирующее перестроение PK таблицы (по отдельной опции конечно) #139

Open
sgrinko opened this issue Mar 19, 2024 · 0 comments

Comments

@sgrinko
Copy link

sgrinko commented Mar 19, 2024

Уважаемые разработчики,
предлагаю реализовать неблокирующее перестроение PK таблицы (по отдельной опции конечно)
сейчас выполняется обычный DROP/CREATE

ALTER TABLE bankrupt.message
	DROP CONSTRAINT pk_message;

ALTER TABLE bankrupt.message
	ADD CONSTRAINT pk_message PRIMARY KEY (id_message) INCLUDE (id_annulment_message);

или так:

ALTER TABLE bankrupt.message
	DROP CONSTRAINT pk_message;

DO $$
BEGIN
	ALTER TABLE bankrupt.message
		ADD CONSTRAINT pk_message PRIMARY KEY (id_message) INCLUDE (id_annulment_message);
EXCEPTION WHEN OTHERS THEN
	IF (SQLSTATE = '42P16') THEN
		RAISE NOTICE '%, skip', SQLERRM;
	ELSE
		RAISE;
	END IF;
END; $$
LANGUAGE 'plpgsql';

Предлагаю вот такой механизм замены PK

CREATE UNIQUE INDEX CONCURRENTLY tmp1052687613_unq ON bankrupt.message USING btree (id_message) INCLUDE (id_annulment_message);
--
DO $$ 
DECLARE
    v_indexname text;
BEGIN
    v_indexname = (SELECT c.relname FROM pg_index i INNER JOIN pg_class c ON i.indexrelid = c.oid WHERE NOT indisvalid LIMIT 1); -- In INVALID state
    IF v_indexname is not null THEN
            RAISE 'In INVALID state - CREATE INDEX CONCURRENTLY %', v_indexname;
    END IF;
END; $$
LANGUAGE 'plpgsql';

ALTER TABLE bankrupt.message DROP CONSTRAINT pk_message,
    ADD CONSTRAINT pk_message PRIMARY KEY USING INDEX tmp1052687613_unq;

т.е. создаем в конкурентном режиме новый индекс, а потом одной командой выполняем удаление и добавление. 1 команда 1 транзакция.

Кстати на сейчас pgcodekeeper такие команды считает ошибочными:
изображение

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants