2016-08-03 4 views
1

У меня есть 45 active транзакция параллельной вставки, которую каждая транзакция пытается вставить (только вставить без какого-либо выбора или обновления) около 250 строк в некоторые таблицы.Запретить блокировку блокировки параллелизма SQL Server

Проблема заключается в том, когда транзакция хочет вставить данные в таблицы, существует около 1000 замков X и IX() на нескольких строках индекса и страницах индекса.

Я переместил индексы на SSD, но это не имеет никакого смысла, и у меня много ожидающих транзакций, и каждая транзакция занимает от 200 мс до 4000 мс, которая должна быть завершена в соответствии с Adult logout на профилировщике SQL.

Буферный ввод-вывод, защелка буфера, блокировка, защелка, регистрация. Время ожидания 0 или очень мало в мониторе активности.

Я попытался увеличить количество транзакций, но я не имеет никакого смысла и количество исполнений в Activity monitor было таким же.

Моя система информации:

  • 2x E5,
  • SSD Raid 0 для лог-файлов,
  • HDD Raid 10 для данных,
  • SSD Raid 0 для индексов,
  • + 64GB DDR3,
  • SQL Server 2014 SP2

ответ

0

Там может быть умножают предложения в зависимости от того, что именно вызывает проблему:

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

  2. IDENTITY Обсуждение колонки. Попробуйте заменить столбцы IDENTITY на UNIQUEIDENTIFIER.

  3. Дополнительный ввод-вывод, связанный с разбиением страницы. Регулярно перестраивайте кластеризованный индекс с более низким FILLFACTOR (Экстремальный сценарий: < 50%).

  4. Конфликт PFS. Создайте несколько файлов в своей базе данных и разделите их индексы/таблицы.

  5. Вы находитесь на SQL2014. Попытайтесь использовать функции In-Memory.

+0

1. Я уже отключил/удалил множество индексов. 2. Я изменил все Первичные как неидентичные, bigint и инициализировал его на уровне бизнеса. 3. Коэффициенты заполнения более 90. 4. Я сделаю это и, но он внесет какие-либо изменения, если я использую отдельный раздел для каждой таблицы? потому что ввод-вывод будет таким же. 5. В-памяти невозможно, я думаю, в соответствии с ограничениями на 2014 год и размером db (4TB) – Milad

+0

Для № 3 вам нужно посмотреть фрагментацию и количество разбиений страниц во время вставки. Если это так, вы можете снизить Fillfactor до 50% и даже ниже. Данные не должны быть последовательными по кластерному индексу, после чего вы можете вставлять сразу несколько страниц. Для # 4 вы можете разделить одну таблицу на несколько файлов. –

+0

Большое спасибо за советы, я уменьшил коэффициент заполнения для некоторых индексов до 20%, а страницы заполнили до 70% с минимальной фрагментацией.Также я добавил два файла для больших таблиц (одна группа файлов) и переместил их на другой жесткий диск. В этом случае вставки и выделения будут иметь лучшую производительность, поскольку на двух жестких дисках выполняются операции (один для небольших таблиц и другой для больших, которые используют RAID10). Кроме того, я создал последовательный идентификатор диапазона, а не последовательный, который позволяет создавать несколько индексных страниц с минимальной блокировкой. Наконец, я делаю объемные вставки с «Вставить объем», что увеличивает производительность до 400%. – Milad

Смежные вопросы