Как стать автором
Обновить

Комментарии 17

А нельзя отдельно представить только начало графика?
Сейчас можно судить только о 2й половине тестов, т.к. 1-ая на графиках не проявилась.
спасибо за обзор. сам недавно столкнулся с такой задачей, но проводить сравнение методов не было времени
Спасибо, отлично! А в процедуре происходило какое-нибудь действие? Ведь это тоже важно как обработать потом параметры.
ну да, но если учесть относительность тестов друг друга, то этот функционал можно вынести за скобки и сократить. тестируется лишь адекватный переход в t-sql, то бишь параметр преобразуется в список и заполняет временную переменную.
Смотрите о чем я. Когда используется SqlBulkCopy или table-valued parameters — то у вас уже на входе в процедуру есть таблица, с которой можно работать, когда varbinary или xml — вам еще нужно создать эту таблицу (или не нужно создавать, а сразу использовать что есть). То есть в тестах SqlBulkCopy (.net app -> #table -> @table -> процедура) сравнивался с xml (.net app -> xml -> @table -> процедура), так? Хотя может приведение к @table — это уже окончательная операция. Интереснее, наверное, было бы что-то вроде «insert into @table (id) select t1.id from @temptable t1 left join @table t2 on t1.id = t2.id where t2.id is null» (то есть вставка значений, которых еще не было), ну и это само собой нужно бы сделать несколько раз и взять среднее. Тут мне кажется уже будут другие результаты, хотя нужно пробовать.
вы правы в том, что в случаях с балккопи и табличным типом у меня нет необходимости создавать временную переменную, можно использовать уже пришедший параметр.

если следовать вашей логике и создавать прикладной функционал в тестируемых хранимых процедурах, то получается, что сервер в любом случае будет делать index seek при подстановке в join \ select in. стало быть если откинуть этот функционал, то «лишними» действиями относительно балккопи\табличный тип является выделение памяти.

значит, если сделать в балкопи \ табличном типе такое же выделение памяти, как и в других методах, то тесты подводятся к общему знаменателю и прикладным функционалом тестируемых хранимых процедур можно пренебречь.
Это теория, интересна практика. В общем, спасибо, а то что у table стоит 65 при 1000 — действительно странно — видимо звезды… Нужны средние.
У вас в таблице нет опечатки?
По данным в таблице получается, что для 1000 элементов table передача самая медленная ( со значением 65).
По логике больше похоже на 6.5.
опечатки нет. наводка, может?:) по хорошему, нужно прогнать эти тесты раз 100 на своих выборках, потом посчитать среднее. но все же, не думаю, что картина будет кардинально отличаться.
Если нет, то график не верный.
Для 1000 элементов, табличный метод самый медленный.
Посмотрите внимательнее, там точно опечатка.
А за статью больше спасибо. Этот вопрос встает у многих, если не у каждого разработчика.
Вопрос актуальный, особенно для начинающих разработчиков, спасибо.
Очень познавательно и интересно. Еще хотелось бы увидеть на сколько медленней работает тривиальный insert в цикле?

И еще хочу добавить один минус table метода — хотя по перфомансу и удобству он лучше остальных но к сожалению драйвер для него есть только под .Net.
За чистый инсерт не скажу, но многократный вызов хранимки, инсертящий по одной записи за раз заставил нас как то уйти курить на пол часа при 400к строк)
Ну так транзакции, ничего удивительного. Банальная внешня транзакция ускорила бы процесс радикально.
НЛО прилетело и опубликовало эту надпись здесь
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации