Выполнение множественной вставки в запрос говорит, что таблица заблокирована

Я пытаюсь переместить данные таблицы 1, содержащие 3000000 строк, в таблицу 2.

Строки таблицы перемещаются на основе номера строки, поэтому я выполняю три одновременных запроса Insert into, разделяя строки на 1000000 записей для каждых трех запросов на основе номеров строк в условии.

Моя целевая таблица — table2, а источник — table1 для всех трех запросов.

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

Пожалуйста, помогите мне, что я сделал неправильно, и как я могу выполнить три запроса одновременно !!!!!


person CIPHER    schedule 25.11.2014    source источник


Ответы (1)


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

    USE MASTER;
    ALTER DATABASE <yourDB>;
    SET ALLOW_SNAPSHOT_ISOLATION ON;
    GO

    USE <yourDB>;
    SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
    GO

    <your SQL here>

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

person Raj    schedule 25.11.2014
comment
Возможно, это также снизит производительность его tempdb;) - person TomTom; 25.11.2014
comment
Истинный. Но он хочет иметь одновременные вставки в одну и ту же таблицу :) - person Raj; 25.11.2014
comment
Он также может просто соединить три соединения для использования одной и той же транзакции ;) Не так уж сложно ;) - person TomTom; 25.11.2014
comment
@TomTom, @Raj Спасибо, ребята, за вашу поддержку, я нашел альтернативное решение, которое MAXDOP решает запросы, которые выполняются параллельно и с самоблокировкой..... Теперь я могу выполнять запросы параллельно без блокировки.... .Но недостатком является увеличение времени выполнения.... - person CIPHER; 25.11.2014