bulkCopy.WriteToServer() vs. cmd.ExecuteNonQuery()

Понятно, что групповая операция быстрее. Но то, что она быстрее в любом контексте?... Это странно. Получил результаты, что организовать таблицу на стороне клиента и записать на сервер это быстрее, чем сделать insert into ... и выполнить стандартную cmd.ExecuteNonQuery().

Forums: 

Изображение пользователя st.

bulk copy, насколько я помню,

bulk copy, насколько я помню, это средство быстрой массированной закачки даных на сервер.
Копирование проходит "ниже" уровня SQL, т.е. все транзакции, ограничения целостности и триггеры идут лесом.
Примерно как уровень прямой записи в плоский файл.

Изображение пользователя ipanshin.

"ниже" у

"ниже" уровня SQL

Да, спасибо,что напомнил мне, а то я забывать начал. Я хочу сказать, что отсюда выплывает стоимость API, которое мы платим за его использование. Типа вот тебе дудочка, девочка. Подуй и все ягоды твои, но только отдай мне свое лукошко. Либо лукошко, либо дудочка.

Разделим таблицы в БД на индивидуальные и общественные.
Для индивидуальных - bulkCopy.WriteToServer()
для общественных - cmd.ExecuteNonQuery(). Это будет честно.

Индивидуальные - это те таблицы, которые имеют в своем имени newid() типа tbl_newid(). Общественные - это все остальные.

Теперь использование макросов. К чему писать разные casp and golds, если ты имеешь под рукой sql сервер? Делаю класс объектов "macro". Закачиваю быстро код скрипта в БД в индивидуальную таблицу. Пишу маленький скрипт макроподстановки, который ее и выполняет. Дальше просто либо выгружаешь скрипт, либо его выполняешь.

30

Тех мыслей прения судебные безмолвны,
Когда вдруг совесть вспоминает о прошедших
Растратах лучших лет, когда мы бездуховны
Стремимся тщетно к целям, ум наш ведших.

Давно иссохшие глаза тогда озера слез
О тех, кто скрыт вдруг смерти покрывалом,
Я заново живу любовью тех белеющих берез,
Что уж давно не зеленеют на пригорке талом.

Переживания повторят вновь и вновь,
За шагом шаг все прежние страданья
И я опять плачу за дружбу, за любовь
За все в слезах моих озер воспоминанья.

Как только те последние часы ко мне придут,
Так все потери и печали, друг мой, отойдут.

Блин, чтото часто болит голова. :(

Изображение пользователя ipanshin.

Небольшие тесты показали, что

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

По производительности bulkcopy из обычного command.com работает (я бы сказал чуть быстрее), чем Insert из queryanalyser. С записью по одной строке в цикле я уже не сравниваю (insert на порядок медленнее).
------------------------------------------------------------------------

99182 rows copied.
Network packet size (bytes): 4096
Clock Time (ms.) Total : 3750 ms Average : (26448.53 rows per sec.)
-----------------------------------------------------------------------
print convert(char,getdate(),109)
insert into test1..dvgrp_syscript(scr_txt,kto)
select scr_txt,kto from dvgrp_syscript where kto='IP'
print convert(char,getdate(),109)

Mar 30 2007 4:38:39:543PM
(99182 row(s) affected)
Mar 30 2007 4:38:45:103PM
select 45103-39543=5560 ms

Т.е. самое быстрое средство для сервера приложений накопить пакет и выплюнуть его bulkcopy сервер БД. Ессно, это применимо только для таблиц, в которых используются только операции inserd and delete. Например, для постоянного писания лога.

Не кажется ли Вам, что это мы:
Рисунки хрупкие на пыльных стеклах
Хранилищ Мироздания из тьмы
Оттенков и теней чуть-чуть поблеклых?

Забавы ради призрачных идей,
Которых смысл нам честно непонятен,
На ускользавших смыслом сущностей
Нанесены мы пылью серых пятен.

Смерть - это Дождь так просто
Омывший пятна нашей пыли,
Чтоб в чьих то стеклах небо было звездно,
А наши образы ? - Их смыли.

Изображение пользователя ipanshin.

В рамках контекста клиента bul

В рамках контекста клиента bulkcopy работает. А как выполнить балккопи в контексте ХП (не файл-таблица, а таблица-таблица) я не нашел (?) Может кто подскажет?

Изображение пользователя st.

В рамках контекста

В рамках контекста клиента bulkcopy работает. А как выполнить балккопи в контексте ХП (не файл-таблица, а таблица-таблица) я не нашел (?) Может кто подскажет?

А код посмотреть можно?

Изображение пользователя ipanshin.

А код посмотреть м

А код посмотреть можно?

why not?
// заполнили таблицу
DataRow row = code.NewRow();
row["scr_txt"] = sql;
row["kto"] = "dvgrp_bulkcopy";
//row["onum"] = i;
code.Rows.Add(row);

// пошли по содержимому сгенерированного кода
// для того, чтобы записать его в БД

using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection))
{
bulkCopy.DestinationTableName =
"[dbo].[dvgrp_syscript]";

try
{
// Write from the source to the destination.
bulkCopy.WriteToServer(code);

Изображение пользователя ipanshin.

OPENROWSET(BULK...

OPENROWSET(BULK...)

К сожалению, здесь указывается только файл, а таблицу указать не получается.

Изображение пользователя ipanshin.

print convert(char,getdate(),1

print convert(char,getdate(),109)
insert into dvgrp_syscript(scr_txt)
select scr_txt from xxx
print convert(char,getdate(),109)

Apr 3 2007 11:16:21:670AM

(53668 row(s) affected)
Apr 3 2007 11:16:22:343AM
select 2343-1670=673 ms

-- это и есть bulk copy operation, I think

print convert(char,getdate(),109)
select * into xxx_4 from xxx
print convert(char,getdate(),109)
Apr 3 2007 11:17:02:703AM

(53668 row(s) affected)
Apr 3 2007 11:17:03:173AM
select 3173-2703=470 ms

27

Дороги утомляют плоти суть
На склоне лет тебя всегда спасает
Мозг, что торопит снова в путь
Иной, что в голове ум освещает.

Мысли бредут пешком и на арбе,
Паломниками заполняют Мекку
И странствуют глаза во тьме
Фантазий, что присущи человеку.

Воображаемое сердца видят Боги,
Идя навстречу тени твоея,
Камнями истины приткнулись на дороге,
И снова молод Духом Бытия.

И днем и ночью я шагаю,
Движенье – жизнь, иное – погибаю.