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

Создание индексов в CONCURRENTLY режиме + доп.контроль #138

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

Comments

@sgrinko
Copy link

sgrinko commented Mar 19, 2024

Уважаемые разраюботчики,

сейчас для этого случая сроится очень даже хороший код.
Есть предложение встроить доп.контроль на валидность созданного индекса
сейчас:

CREATE INDEX CONCURRENTLY tmp1052687613_idx_legal_case_status_history_id_legal_case ON bankrupt.legal_case_status_history USING btree (id_legal_case, COALESCE(date_end, date_begin) DESC, id_message DESC NULLS LAST, id_report DESC) INCLUDE (id_legal_case_finalized_reason);

BEGIN TRANSACTION;
DROP INDEX bankrupt.idx_legal_case_status_history_id_legal_case;
ALTER INDEX bankrupt.tmp1052687613_idx_legal_case_status_history_id_legal_case RENAME TO idx_legal_case_status_history_id_legal_case;
COMMIT TRANSACTION;

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

предлагаю примерно такой код:

CREATE INDEX CONCURRENTLY tmp1052687613_idx_legal_case_status_history_id_legal_case ON bankrupt.legal_case_status_history USING btree (id_legal_case, COALESCE(date_end, date_begin) DESC, id_message DESC NULLS LAST, id_report DESC) INCLUDE (id_legal_case_finalized_reason);
--
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';

BEGIN TRANSACTION;
DROP INDEX bankrupt.idx_legal_case_status_history_id_legal_case;
ALTER INDEX bankrupt.tmp1052687613_idx_legal_case_status_history_id_legal_case RENAME TO idx_legal_case_status_history_id_legal_case;
COMMIT TRANSACTION;
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