Существует хранимая процедура:Параллелизм в SQL Server 2008
CREATE PROCEDURE [dbo].[TestProc]
AS
BEGIN
SET NOCOUNT ON;
create table #thistable (rid char(32))
insert into #thistable(rid)
select A0RID from tblCdbA0 with (nolock)
END
Когда процедура выполняется в одиночку он занимает 400-500 мс, но при 10 потоков выполнения той же процедуры, параллельно, то первый поток заканчивается в 1300 мс, последний - через 6000 мс и средний - 4800 мс. Как вы можете видеть, нет блокировки, когда потоки ожидают, когда другой конец будет выполнен. Кроме того, серверный процессор загружается менее чем на 100%, т. Е. Для их выполнения достаточно ресурсов. Как это могло быть?
EDIT: Нашел хорошая статья о параллельных вставок: Resolving PAGELATCH Contention on Highly Concurrent INSERT Workloads
Кажется, что вставлять то же самое 8 раз. Это верно? Если так, возможно, сделать декартовое соединение на 8-строчной производной таблице будет быстрее (или это просто демо-тест для тестирования)? –
спасибо за комментарий, вопрос не в производительности кода, а в параллелизме: почему, когда 10 потоков выполняют эту простую процедуру, она, похоже, заблокирована? (точно это демонстрация) – Tim
@tim - Вы пробовали loking на 'sys.dm_os_wait_stats', чтобы узнать, что ждет? NB: Чтобы очистить это до тестирования, вы можете сделать «DBCC SQLPERF (« sys.dm_os_wait_stats », CLEAR)' –