Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Bulk insert  [new]
sergivan
Member

Откуда:
Сообщений: 91
SQL Server 2008 R2 (SP1) - 10.50.2772.0 (X64) Enterprise Edition
Как можно убедиться, что при
insert into ... select
идёт именно bulk (ну если идёт вообще)?
25 окт 11, 13:09    [11494841]     Ответить | Цитировать Сообщить модератору
 Re: Bulk insert  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
sp_who2 например
25 окт 11, 13:11    [11494860]     Ответить | Цитировать Сообщить модератору
 Re: Bulk insert  [new]
sergivan
Member

Откуда:
Сообщений: 91
по sp_who2 вижу выполнение просто insert.
как тогда заставить выполнять именно bulk для
insert into dbo.table with(tablock) (id, p1, p2)
select
id, p1, p2
from
dbo.table_data
??
таблица назначения "куча"
25 окт 11, 14:03    [11495464]     Ответить | Цитировать Сообщить модератору
 Re: Bulk insert  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Модель то восстановления базы у вас какая? Уж не полная ли случаем?
25 окт 11, 14:14    [11495605]     Ответить | Цитировать Сообщить модератору
 Re: Bulk insert  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
А почему вообще bulk должен идти, если выполняется обычный инсерт из одной таблицы в другую?
25 окт 11, 14:17    [11495641]     Ответить | Цитировать Сообщить модератору
 Re: Bulk insert  [new]
sergivan
Member

Откуда:
Сообщений: 91
tpg,

simple конечно
25 окт 11, 14:17    [11495645]     Ответить | Цитировать Сообщить модератору
 Re: Bulk insert  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
sergivan
tpg,

simple конечно
И флаг трассировки 610 включен?
25 окт 11, 14:21    [11495697]     Ответить | Цитировать Сообщить модератору
 Re: Bulk insert  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
http://msmvps.com/blogs/gladchenko/archive/2010/03/09/1761298.aspx
Куча

Инструкция INSERT, которая получает строки от операции SELECT и вставляет их в кучу, будет протоколироваться минимально, когда для таблицы назначения используется подсказка WITH (TABLOCK).
Для того чтобы получить минимальное протоколирование операций вставки в кучу, используйте следующий синтаксис Transact-SQL:

INSERT INTO <ТаблицаНазначения> (<Колонки>) WITH (TABLOCK)
SELECT <Колонки> FROM <НекоторыеУтверждения>

Обратите внимание, что куча, куда направлена вставка, не должна быть пуста. Наряду с тем фактом, что таблица назначения может находиться в любой файловой группе (или даже использовать схему секционирования), эта методика предлагает больше гибкости, чем вариант с SELECT INTO.
25 окт 11, 14:21    [11495702]     Ответить | Цитировать Сообщить модератору
 Re: Bulk insert  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
SomewhereSomehow
А почему вообще bulk должен идти, если выполняется обычный инсерт из одной таблицы в другую?
Читаем - http://msmvps.com/blogs/gladchenko/archive/2010/03/09/1761298.aspx
25 окт 11, 14:23    [11495725]     Ответить | Цитировать Сообщить модератору
 Re: Bulk insert  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
Гавриленко Сергей Алексеевич,

Ах там TABLOCK, совершенно не подумал про это! спасибо.
25 окт 11, 14:24    [11495757]     Ответить | Цитировать Сообщить модератору
 Re: Bulk insert  [new]
sergivan
Member

Откуда:
Сообщений: 91
пробовал как с пустой назначения так и не пустой, как с флагом 610 так и без...
переводил модель восстановления в булк_логед.
всё одинаково, sp_who2 показывает insert.
в чём может быть дело?
25 окт 11, 14:30    [11495826]     Ответить | Цитировать Сообщить модератору
 Re: Bulk insert  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
А индекс на таблице-куче есть?
25 окт 11, 14:36    [11495886]     Ответить | Цитировать Сообщить модератору
 Re: Bulk insert  [new]
sergivan
Member

Откуда:
Сообщений: 91
tpg,

нет индексов нет
25 окт 11, 14:37    [11495900]     Ответить | Цитировать Сообщить модератору
 Re: Bulk insert  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5115
sergivan,
sp_who2 вам не покажет этот bulk (ибо команда то именно insert).
смотрите профайлером с включёнными эвентами блокировок, там увидите что-то вроде bulk_operation.
а для проверки просто закомментьте в вашем инсерте tablock и посмотрите на время выполнеия.
25 окт 11, 15:13    [11496219]     Ответить | Цитировать Сообщить модератору
 Re: Bulk insert  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
И все-таки, явно про bulk в документации не сказано (ну или я не нашел).
BOL
Рекомендации по массовому импорту данных
Использование инструкции INSERT INTO…SELECT для массового импорта данных с минимальным протоколированием

Инструкция INSERT INTO <целевая_таблица> SELECT <столбцы> FROM <исходная_таблица> может эффективно перенести большое количество строк из одной таблицы, например промежуточной, в другую таблицу с минимальным протоколированием. Минимальное протоколирование может повысить производительность выполнения инструкции и снизить вероятность того, что во время операции будет заполнен весь журнал транзакций.

Для минимального протоколирования этой инструкции необходимо выполнение следующих требований.

Модель восстановления базы данных настроена на простое или неполное протоколирование.

Целевой таблицей является пустая или непустая куча.

Целевая таблица не используется в репликации.

Для целевой таблицы указана подсказка TABLOCK.

Для строк, которые вставляются в кучу в результате действия вставки в инструкции MERGE, также может применяться минимальное протоколирование.

В отличие от инструкции BULK INSERT, которая удерживает менее строгую блокировку массового обновления, инструкция INSERT INTO…SELECT с подсказкой TABLOCK удерживает монопольную блокировку (X) таблицы. Это означает, что не поддерживается возможность вставки строк с помощью параллельных операций вставки. Дополнительные сведения о блокировках см. в разделе Режимы блокировки.

может быть мы и не должны увидеть bulk insert?

Кстати, если в порядке эексперимента, посмотреть командой dbcc log(). Делал на БД Northwind, предварительно увеличив кол-во строк в БД Products примерно до до 150000 (раз уж реч о более менее больших таблицах).
+
DBCC TRACEON (610)
go
dbcc freeproccache
go
use Northwind
go
checkpoint
go
dbcc log(6)
go
insert into dbo._Products with(tablockx) (ProductName,SupplierID,CategoryID,QuantityPerUnit,UnitPrice,UnitsInStock,UnitsOnOrder,ReorderLevel,Discontinued)
select ProductName,SupplierID,CategoryID,QuantityPerUnit,UnitPrice,UnitsInStock,UnitsOnOrder,ReorderLevel,Discontinued from dbo.Products
go
dbcc log(6)
go
insert into dbo._Products (ProductName,SupplierID,CategoryID,QuantityPerUnit,UnitPrice,UnitsInStock,UnitsOnOrder,ReorderLevel,Discontinued)
select ProductName,SupplierID,CategoryID,QuantityPerUnit,UnitPrice,UnitsInStock,UnitsOnOrder,ReorderLevel,Discontinued from dbo.Products
go
dbcc log(6)

После первой вставки добавляется около 4000 тыс строк, после второй в журнале уже около 180 тыс. Чем не минимальное журналирование? При этом sp_who2 не показывает никаких bulk-ов..
25 окт 11, 15:16    [11496250]     Ответить | Цитировать Сообщить модератору
 Re: Bulk insert  [new]
Ray D
Member

Откуда: from the middle of nowhere
Сообщений: 3598
Блог
Еще можно посмотреть с помощью dbcc page, там в allocation status будет пометка была ли страница minimally logged.
http://sqlserverpedia.com/blog/sql-server-2005/interrogating-prerequisites-for-minimal-logging-in-bulk-import-%E2%80%93-part-1/
25 окт 11, 15:17    [11496259]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить