2010-01-31 2 views
2

Является ли таблица заблокированной каждый раз, когда я вставляю что-то в нее? Потому что я хочу вставлять тысячи строк каждую секунду, поэтому я хочу знать, эффективно ли работает несколько потоков для вставки. Если каждая вставка блокирует таблицу, то один поток почти такой же эффективный, как, например, 10 потоков. Если это зависит от механизма базы данных, я использую SQL Server 2008.Когда таблица базы данных заблокирована?

ответ

4

VoidPointer не всегда корректен. Он тоже не обязательно неверен. Это зависит от того, почему у вас многопоточное приложение. Если потоки чисто предназначены как механизм для «вставки большего количества данных», то нет, вероятно, это не улучшит производительность. Если, однако, потоки выполняют какую-то другую цель, то это говорит о том, что ваша латентность, возможно, находится в другом месте в системе, и вы не должны слишком беспокоиться о базе данных. Почему у вас есть все эти темы? Предположительно, вы пытаетесь сделать некоторые другие операции более эффективными - например, несколько связанных вызовов ввода-вывода, которые завершаются с неизвестными интервалами, но уменьшают общую задержку до длины самого длинного потока? Без немного большего контекста о том, чего вы пытаетесь достичь, и почему вы не можете просто заявить, что многопоточное решение неверно.

Посмотрите some of the locking hint options SQL Server supports ..

Я думать SQL Server поддерживает параллельные вставки

+0

Ну положил. Нет причин думать, что несколько потоков НЕ помогут в этот момент, если единственная цель - ускорить вставки. –

+0

Хорошая точка. Я почему-то предполагал, что работа, выполняемая нитями, не была узким местом. Это вполне может быть так. – VoidPointer

3

Учитывая, что база данных является «узким местом», а не работой, которую выполняют потоки, делая все вставки из разных потоков (с использованием индивидуального подключения) не помогайте вашей работе. Особенно, если вы вставляете каждую новую транзакцию. Каждый раз, когда транзакция фиксируется, база данных должна работать, чтобы обеспечить целостность данных. Это особенно плохо, так как все ваши транзакции будут конкурировать за изменения одного и того же объекта.

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

BEGIN TRANSACTION; 
INSERT INTO myTable (Col1, Col2) 'First' ,1; 
INSERT INTO myTable (Col1, Col2) 'Second' ,2; 
... 
COMMIT; 

N.B. - можно также сделать все вставки в одном stament, но это не делает различия в производительности мудрым:

INSERT INTO myTable (Col1, Col2) 
    SELECT 'First' ,1 
    UNION ALL 
    SELECT 'Second' ,2 
    UNION ALL 
    SELECT 'Third' ,3; 

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