Когда таблица базы данных заблокирована? - PullRequest
2 голосов
/ 01 февраля 2010

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

Ответы [ 2 ]

4 голосов
/ 01 февраля 2010

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

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

3 голосов
/ 01 февраля 2010

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

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

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

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

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

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

...