Перейти до вмісту

Впровадила часовпорядковані ідентифікатори UUID v7 (PostgreSQL 18) як ключі сутностей, щоб зменшити фрагментацію індексів B‑tree та пришвидшити запити.

впорядковані в часі ключі тримають індекси щільними

Ситуація. Кожній сутності потрібен унікальний id, і рефлекторний вибір — випадковий UUID. Проблема в тому, що випадкові id розкидані по всьому B‑tree‑індексу. Вставки розсіюються, індекс фрагментується, і зі зростанням таблиць за це платять і записи, і range‑скани. На платформі, яка й далі має зростати, це повільна витрата, яку краще не закладати в архітектуру.

Завдання. Зберегти глобальну унікальність UUID, але позбутися фрагментації, яку спричиняє випадковість.

Дія. Стандартом став UUID v7 — часово впорядкований формат: перші біти є міткою часу, тож нові рядки вбудовуються в індекс, а не розсипають його. PostgreSQL 18 підтримує це нативно як uuidv7(), обгорнуте в невелику функцію uuid_generate_v7(), щоб той самий виклик коректно поводився на Azure Flexible Server, і зроблено значенням за замовчуванням для первинних ключів сутностей у всій схемі. Нічого екзотичного; це саме те рішення, яке дешеве, якщо прийняти його рано, і болісне, якщо доводиться впроваджувати заднім числом.

Результат. Id лишилися глобально унікальними, індекс перестав фрагментуватися так, як це роблять випадкові UUID, а часово впорядковані вставки й range‑запити стали швидшими — рівномірно, на всіх таблицях, без потреби комусь про це думати. Як бонус, кожна сутність отримує ключ, за яким можна безкоштовно сортувати за часом.

Одна частина довшого переліку — і він увесь на цьому сайті.

Кожен запис написано однаково: ситуація, завдання, що ми зробили і що змінилося.

Переглянути весь перелік