Обход таблицы с несколькими операциями в ALTER TABLE - PullRequest
0 голосов
/ 14 мая 2018

Некоторые базы данных, такие как MySQL [1] и PostgreSQL [2] , поддерживают объединение некоторых совместимых операторов ALTER TABLE (как нестандартный SQL).

Например, мы можем иметь:

ALTER TABLE `my_table`
    DROP COLUMN `column_1`,
    DROP COLUMN `column_2`,
    ...

или

ALTER TABLE
    MODIFY `column_1` ... ,
    MODIFY `column_2` ... ,

вместо отдельных заявлений:

ALTER TABLE `my_table` DROP COLUMN `column_1`;
ALTER TABLE `my_table` DROP COLUMN `column_2`;

или

ALTER TABLE `my_table` MODIFY `column_1` ... ;
ALTER TABLE `my_table` MODIFY `column_2` ... ;

и т.д.

Для сравнения той же функции PostgreSQL [2] , которая также реализует это, будет выполнять все операции за одно сканирование:

Основная причина предоставления возможности указать несколько изменений в одной ALTER TABLE заключается в том, что несколько сканирований или перезаписей таблиц могут быть объединены в один проход по таблице.

Хотя для DROP COLUMN особенно часто это даже не требуется:

Форма DROP COLUMN физически не удаляет столбец, а просто делает его невидимым для операций SQL ...

Вопросы:

  • Не приведет ли оператор из нескольких столбцов к обходу всех строк только один раз и выполнению всех необходимых изменений?
  • Как MySQL фактически выполняет DROP COLUMN? Он также сначала «скрывает» столбцы или сразу удаляет данные?

Предположения:

  • Использование InnoDB
  • Ни в одном из столбцов, которые мы хотим изменить / удалить, нет индексов / сложных значений по умолчанию (поэтому в основном это изменения, которые не требуют временной таблицы при запуске в качестве отдельных операторов alter)

Ссылки

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Я получил несколько полезных отзывов, но решил ответить на свой вопрос, чтобы дать более конкретный набор ответов.

Не приведет ли оператор из нескольких столбцов к обходу всех строк только один раз и выполнению всех необходимых изменений?

Да , если оператор alter приводит к перестройке таблицы, то это нужно сделать только один раз. *

* Этот ответ прибывает из моего собственного тестирования и других в основном неофициальных доказательств (включая @Uueerdo в этом посте). Для этого было бы полезно иметь официальные документы ...

Как MySQL фактически выполняет DROP COLUMN? Он также сначала «скрывает» столбцы или сразу удаляет данные?

MySQL перестроит таблицу на месте (вместо того, чтобы создавать копию или просто изменять метаданные) для большинства операций с столбцами. Каждый конкретный случай можно найти в документах Online DDL для InnoDB .

Некоторые операции, такие как переименование столбца или установка значения по умолчанию, просто изменят метаданные, поэтому они не требуют перестроения таблицы.

Однако, удаление столбца НЕ требует полной перестройки таблицы .

0 голосов
/ 23 мая 2018

InnoDB MySQL:

(Это действительно , а не действительно отвечает на вопросы, но дает немного больше понимания большого вопроса ALTER.)

  • Если кому-либо из изменяющих необходимо скопировать таблицу, вам , вероятно, будет лучше поместить все изменяющие в один оператор.Например, для изменения PRIMARY KEY требуется перестроить данные, кластеризованные с помощью PK.

  • Некоторые изменения могут быть достигнуты простым изменением схемы;это практически мгновенно, и может быть сделано с помощью отдельных операторов alter.Добавление опции к ENUM было реализовано очень давно.

  • Некоторые изменения требуют некоторой формы сканирования, но могут делать это «в фоновом режиме».DROP INDEX можно сделать, быстро «спрятав» его, затем освободив BTree в фоновом режиме.

  • Я исключил серую область, в которой вы пакетируете «простые» изменения.Можно было бы надеяться, что ALTER достаточно умен, чтобы просто быстро их просмотреть, вместо того, чтобы копировать таблицу.

...