Безбожний спосіб створити кластерний індекс на величезній таблиці?


22

Тож у нас є веб-сайт із замовниками, який скаржиться на деякі серйозно повільні показники. Я взяв один погляд і очевидно, що проблема полягає в тому, що хтось інший (grrrr) спроектував таблицю, яка містить десь 20 мільйонів записів без кластерного індексу.

Тепер я хочу створити кластерний індекс на цій таблиці - але в моєму тестовому середовищі моя create indexкоманда працює протягом години, і це все ще не виконується. Сайт клієнтів - це магазин, який працює цілодобово і не може дозволити собі час простою, поки я створюю індекс.

Чи існує якийсь менш брутальний метод створення індексу, який або швидко закінчить завдання, або зробить це якось розумним способом, який не повністю знищить продуктивність сервера, поки він зайнятий?

Ми використовуємо SQL Server Enterprise Edition.

Відповіді:


26
  • Якщо вашим сервером sql є Enterprise + Edition та у таблиці немає жодних полів BLOB - CREATE CLUSTERED INDEX ... WITH(ONLINE=ON)

  • Якщо ні - немає жодного способу, крім як створити таблицю з тією ж схемою збоку і розумно передати їй дані, включаючи всі операції INSERT / UPDATE / DELETE (наприклад, за допомогою тригера), а потім точно скинути стару таблицю та перейменувати Новим для того ж імені, що і попередні: мінуси: повільний, додає додаткове навантаження на сервер та сховище


12

Не впевнений, яку версію SQL-сервера використовує ваш клієнт. На підприємстві ви можете побудувати індекс за допомогою (ONLINE = ON), тому таблиця буде доступна до створення індексу.


8
  • Створіть нову таблицю, ідентичну оригіналу (очевидно, знадобиться інша назва)
  • Створіть кластерний індекс у новій таблиці
  • Завантажте дані в нову таблицю
  • Відкиньте оригінальний стіл
  • Перейменуйте нову таблицю, використовуючи оригінальну назву

Переконайтеся, що ви застосовуєте будь-які дозволи, необхідні для оригіналу.

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