Каковы преимущества использования синтаксиса Row Constructor в операторе вставки T-Sql? - PullRequest
6 голосов
/ 29 марта 2012

В SQL Server 2008 вы можете использовать синтаксис Row Constructor для вставки нескольких строк одним оператором вставки, например ::

insert into MyTable (Col1, Col2) values
  ('c1v', 0),
  ('c2v', 1),
  ('c3v', 2);

Есть ли преимущества в этом, вместо того, чтобы иметь один оператор вставки для каждой записи, кроме читабельности?

Спасибо.

Ответы [ 4 ]

2 голосов
/ 28 мая 2016

Ответы на этот вопрос до сих пор были чрезвычайно вводящими в заблуждение (и демонстрировали полное отсутствие усилий / понимания), так как существует довольно большая разница в производительности между:

declare @numbers table (n int not null primary key clustered);

insert into @numbers (n)
values (0)
     , (1)
     , (2)
     , (3)
     , (4);

и

declare @numbers table (n int not null primary key clustered);

insert into @numbers (n) values (0);
insert into @numbers (n) values (1);
insert into @numbers (n) values (2);
insert into @numbers (n) values (3);
insert into @numbers (n) values (4);

Тот факт, что каждый оператор insert имеет свою собственную неявную транзакцию, гарантирует это. Вы можете легко доказать это, просмотрев планы выполнения для каждого оператора или выбрав время выполнения, используя set statistics time on;. Существует фиксированная стоимость, связанная с «установкой» и «разрывом» контекста для каждой отдельной вставки, и второй запрос должен платить это штраф пять раз, тогда как первый платит только один раз.

Мало того, что метод list более эффективен, но вы также можете использовать его для построения производной таблицы:

select *
from (values
    (0)
  , (1)
  , (2)
  , (3)
  , (4)
) as Numbers (n);

Этот формат преодолевает ограничение в 1000 значений и позволяет вам присоединиться и отфильтровать свой список до его вставки. Можно также заметить, что мы вообще не связаны с оператором insert! Как таблица де-факто, эта конструкция может использоваться везде, где ссылка на таблицу будет действительной.

2 голосов
/ 29 марта 2012

Да - вы увидите улучшения производительности.Особенно с большим количеством записей.

1 голос
/ 29 марта 2012

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

Например:

USE AdventureWorks2008R2;
GO
CREATE TABLE dbo.MyProducts (Name varchar(50), ListPrice money);
GO
-- This statement fails because the third values list contains multiple columns in the subquery.
INSERT INTO dbo.MyProducts (Name, ListPrice)
VALUES ('Helmet', 25.50),
       ('Wheel', 30.00),
       (SELECT Name, ListPrice FROM Production.Product WHERE ProductID = 720);
GO

потерпит неудачу; Вы должны сделать это так:

INSERT INTO dbo.MyProducts (Name, ListPrice)
VALUES ('Helmet', 25.50),
       ('Wheel', 30.00),
       ((SELECT Name FROM Production.Product WHERE ProductID = 720),
        (SELECT ListPrice FROM Production.Product WHERE ProductID = 720));
GO

см. Ограничения и ограничения конструктора табличных значений

0 голосов
/ 29 марта 2012

Как упоминал Абэ, выигрыш в производительности отсутствует.

Порядок конструктора столбцов - это требуемый порядок значений (или оператора select).Вы можете перечислять столбцы в любом порядке - значения должны следовать этому порядку.

Если вы случайно переключите столбцы в операторе выбора (или в разделе значений), и типы данных будут совместимы, то при использовании конструкции столбцов будетпомочь вам найти проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...