Некоторые базы данных, такие как 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)
Ссылки