[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-postgresql-chto-takoe-partitsionirovanie-partitioning-tablits":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":15,"progress":16,"seo":17},1053,"chto-takoe-partitsionirovanie-partitioning-tablits",28,"postgresql","PostgreSQL","🐘","Что такое партиционирование (partitioning) таблиц?","Партиционирование — это разбиение большой таблицы на несколько физических частей (партиций), при этом логически они остаются единой таблицей. Повышает производительность запросов (partition pruning) и упрощает обслуживание. С PostgreSQL 10 поддерживается декларативное партиционирование.\n\n### RANGE-партиционирование (по диапазону)\n\n```sql\nCREATE TABLE transactions (\n    id bigserial,\n    account_id bigint NOT NULL,\n    amount numeric(15, 2) NOT NULL,\n    created_at timestamptz NOT NULL,\n    PRIMARY KEY (id, created_at)\n) PARTITION BY RANGE (created_at);\n\nCREATE TABLE transactions_2024_01 PARTITION OF transactions\n    FOR VALUES FROM ('2024-01-01') TO ('2024-02-01');\nCREATE TABLE transactions_2024_02 PARTITION OF transactions\n    FOR VALUES FROM ('2024-02-01') TO ('2024-03-01');\nCREATE TABLE transactions_default PARTITION OF transactions DEFAULT;\n```\n\n### LIST-партиционирование (по списку значений)\n\n```sql\nCREATE TABLE accounts (\n    id bigserial,\n    client_id bigint,\n    currency char(3) NOT NULL,\n    balance numeric(15, 2),\n    PRIMARY KEY (id, currency)\n) PARTITION BY LIST (currency);\n\nCREATE TABLE accounts_rub PARTITION OF accounts FOR VALUES IN ('RUB');\nCREATE TABLE accounts_usd PARTITION OF accounts FOR VALUES IN ('USD');\nCREATE TABLE accounts_eur PARTITION OF accounts FOR VALUES IN ('EUR');\nCREATE TABLE accounts_other PARTITION OF accounts DEFAULT;\n```\n\n### HASH-партиционирование (по хешу)\n\n```sql\nCREATE TABLE session_data (\n    session_id uuid NOT NULL,\n    data jsonb,\n    PRIMARY KEY (session_id)\n) PARTITION BY HASH (session_id);\n\nCREATE TABLE session_data_0 PARTITION OF session_data\n    FOR VALUES WITH (MODULUS 4, REMAINDER 0);\n-- ... и так далее для REMAINDER 1, 2, 3\n```\n\n### Преимущества\n\n- **Partition pruning** — PostgreSQL сканирует только нужные партиции\n- Быстрое удаление старых данных: `DROP TABLE transactions_2023_01` вместо `DELETE`\n- Индексы меньше — быстрее обслуживаются\n- VACUUM работает на отдельных партициях\n\n### Рекомендации\n\n- Партиционирование имеет смысл для таблиц от нескольких миллионов строк\n- Ключ партиционирования должен входить в PRIMARY KEY\n- Индексы создаются на каждой партиции отдельно (или автоматически при создании на родительской таблице)\n\n> **На собеседовании:** три типа (RANGE, LIST, HASH) — назовите с примером. RANGE для временных рядов (логи, транзакции), LIST для дискретных значений (валюта, регион), HASH для равномерного распределения. Упомяните partition pruning и быстрое удаление партиций через DROP вместо DELETE.","","middle",[7],[],null,{"title":18,"description":19,"ogTitle":18,"ogDescription":20,"keywords":21,"schemaAnswer":22,"featuredSnippetReady":23},"Что такое партиционирование (partitioning) таблиц? — Gymterview","Партиционирование — это разбиение большой таблицы на несколько физических частей (партиций), при этом логически они остаются единой таблицей. Повышает производи","Партиционирование — это разбиение большой таблицы на несколько физических частей (партиций), при этом логически они оста",[7,13],"Партиционирование — это разбиение большой таблицы на несколько физических частей (партиций), при этом логически они остаются единой таблицей. Повышает производительность запросов (partition pruning) и упрощает обслуживание. С PostgreSQL 10 поддерживается декларативное партиционирование.",true]