Що відбувається, коли ми додаємо індекс до існуючої таблиці з великою кількістю даних?


11

У мене є таблиця, яка містить близько 15 мільйонів записів. Тепер мені потрібно додати індекс до таблиці.

Додавання індексу потребує певного часу, щоб оновити кожен запис у таблиці.

Я дуже розгублений, чи додавання індексу спричинить простої.

Якщо так, то як я можу подолати простої?


Відповіді:


10

З простою CREATE INDEXтаблицею буде заблоковано для запису, але не для читання.

Використовуйте також, CREATE INDEX CONCURRENTLYщоб уникнути блокування запису.

З документів PostgreSQL проCREATE INDEX :

При використанні цієї опції PostgreSQL будує індекс, не беручи жодних блокувань, які запобігають одночасному вкладенню, оновленням або видаленню в таблиці; тоді як стандартна збірка індексу блокує записи (але не зчитування) на столі, поки це не буде зроблено. Існує кілька застережень, про які слід пам’ятати, використовуючи цю опцію - див. Створення індексів одночасно .

І конкретніше (як @ypercube коментує ):

PostgreSQL підтримує побудову індексів без блокування записів . Цей метод викликається, вказавши CONCURRENTLYопцію CREATE INDEX. Коли використовується цей параметр, PostgreSQL повинен виконати два сканування таблиці, а крім того, він повинен чекати, коли всі існуючі транзакції, які потенційно можуть використовувати індекс, припиняються. Таким чином, цей метод вимагає більше загальної роботи, ніж стандартна збірка індексу і займає значно більше часу. Однак, оскільки він дозволяє продовжувати нормальні операції під час побудови індексу, цей метод корисний для додавання нових індексів у виробниче середовище.

Сміливий акцент мій.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.