Создание таблицы с использованием явного оператора create table в сравнении с выбором в

Существуют ли различия в производительности между использованием оператора явного создания таблицы и загрузки данных по сравнению с выбором. Этот пример показывает только 2 столбца, но вопрос связан с использованием очень больших таблиц. В приведенном ниже примере также используются временные таблицы, хотя мне также интересно, как это влияет на использование обычных таблиц. Я думаю, что они будут одинаковыми независимо от типа таблицы.

Сценарий таблицы Temp:

--- Explicitly creating temp table first and then loading.
create table #test1 (id int, name varchar(100))
insert into #test1 (id, name) select id, name from #bigTable

--- Creating temp table by selecting into.
select id,name into #test2 from #bigTable

или регулярные таблицы:

--- Explicitly creating table first and then loading.
create table test1 (id int, name varchar(100))
insert into test1 (id, name) select id, name from #bigTable

--- Creating table by selecting into.
select id,name into test2 from bigTable

Что все думают об этом? Я думаю, что явное создание таблицы и загрузки должно иметь лучшую производительность, чем выбор в качестве выбора, должен оценивать выражения в инструкции для создания таблицы.

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

http://msdn.microsoft.com/en-us/library/ms188029.aspx

Ответы

Ответ 1

CREATE TABLE дает вам лучший контроль над определением таблицы перед вставкой данных, например NOT NULL, ограничениями и т.д., которые вы не можете использовать с помощью SELECT INTO.

SELECT INTO - операция с минимальной регистрацией, но INSERT..SELECT также может быть минимально зарегистрирована при некоторых условиях.
См. Руководство по эффективности загрузки данных, особенно раздел: Подведение итогов минимальных условий ведения журнала.

Вкратце, если вам не нужны ограничения и т.д. (например, вы хотите быстро создать копию таблицы), преимущество SELECT..INTO IMHO - это более короткий код.
В противном случае вы должны использовать другой способ, и вы все равно сможете его минимально зарегистрировать.

Ответ 2

Выбор в имеет преимущества регистрации (не так много), поэтому в большинстве случаев производительность на самом деле лучше. Тем не менее, это ошибки, если таблица существует, и не создает такие вещи, как индексы или ограничения, только столбцы.

Зависит от того, для чего вам это нужно. Я знаю, что у нас есть некоторые действия, которые SELECT ... INTO затем переименовываются, потому что он быстрее, чем обновление старой таблицы (очевидно, с большим количеством пуха для восстановления табличных объектов и т.д.).

Помните, что наше использование не связано с временными таблицами, которые я только что заметил в вашем вопросе.

В случае таблиц с индексами, insert into должен будет поддерживать индексы как часть процесса вставки. Есть и другие объекты таблицы, которые могут вызвать большую обработку, например триггеры. Насколько мне известно, в случае выбора в таблице есть голые кости, поэтому начальная производительность вставки велика. Плюс эффект транзакционного журнала минимален (упоминается в этой ссылке по вашему вопросу).

Это действительно зависит от использования, для временных таблиц, я предполагаю, что они будут относительно недолговечными, поэтому выбор в сопровождении truncate/drop может работать хорошо. Если они имеют более длинные промежутки времени, но в противном случае выбрасываются, снова выберите, за которыми последует возможное падение, может работать.

Если им нужно долго жить после создания и не выбрасывать, то кроме первоначального создания и вставки данных (что будет быстро) вы будете обратно и квадратными с точки зрения последующих вставок - вы было бы лучше всего настроить только таблицу, чтобы принимать быстрые вставки, например, с минимальными индексами или путем отключения индексов до и повторного включения post insert.

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

Ответ 3

В моем случае выполнение явного CREATE, а затем INSERT INTO заметно улучшилось как в реальном времени выполнения, так и в оценочной стоимости оптимизатором.

Моя временная таблица была не большой (8 строк), но одним из значений было вычисленное строковое значение. В некоторых случаях эта временная таблица была объединена с набором результатов с сотнями тысяч строк. Я считаю, что когда я сделал SELECT INTO для моей временной таблицы, он не выбрал оптимальный тип данных для вычисленного значения. Поэтому, когда я явно определял типы данных столбцов, используя CREATE, SQL Server смог выполнить объединение более эффективно. Конечно, этот эффект был преувеличен, потому что было задействовано столько строк.

Таким образом, казалось бы, в некоторых случаях, особенно когда один из ваших столбцов является вычисленным значением, CREATE и INSERT могут быть лучшим вариантом. Конечно, ваш пробег может варьироваться, поэтому обязательно проведите несколько тестов!