В моих обстоятельствах NOLOCK, Snapshot или что-то еще?
У меня есть таблица SQL Server 2012, которая будет содержать 2,5 миллиона строк одновременно. Элементы всегда записываются в таблицу, но самые старые строки таблицы усекаются в конце каждого дня в течение периода обслуживания.
У меня есть инструментальные панели отчетности на основе.NET, которые обычно отчитываются по сводным таблицам, хотя в нечетном случае необходимо извлечь несколько строк из этой таблицы, используя набор индексов.
Когда он отправляет отчет по этой таблице, он может предотвратить запись новых строк в эту таблицу на срок до 1 минуты, что очень плохо для продукта.
Поскольку это платформа отчетности, и строки в этой таблице никогда не обновляются (только вставляются - например, потоковая передача через Twitter, но для другого типа данных), не всегда нужно ждать промежутка в транзакциях, который приводит к вставке строк в эту таблицу.
Когда дело доходит до выбора данных для составления отчетов, будет ли разумным использовать уровень изоляции SNAPSHOT в транзакции для выбора данных или NOLOCK/READ UNCOMITTED? Будет ли создание SQLTransaction вокруг оператора select все еще блокировать вставку? На данный момент я не оборачиваю свой экземпляр SQLCommand в транзакцию, хотя понимаю, что это все равно вызовет блокировку.
В идеале я хотел бы получить результат, при котором записи никогда не блокируются, а информационные панели максимально отзывчивы. Какая моя лучшая игра?
1 ответ
Разместить запрос
Теоретически, выбор не должен блокировать вставки.
По умолчанию выбор принимает только общую блокировку.
Общие блокировки автоматически обнаруживаются во время операций чтения и не позволяют пользователю изменять данные.
Это не должно блокировать вставки в otherTable или joinTable
select otherTable.*, joinTable.*
from otherTable
join joinTable
on otherTable.jionID = joinTable.ID
Но у него есть накладные расходы на получение блокировки чтения (он не знает, что вы не обновляете).
Но если он только извлекает несколько строк из joinTable, он должен брать только несколько общих блокировок.
Разместите свой запрос, план запроса и определения таблиц.
Я подозреваю, что у вас происходят какие-то странные вещи, когда требуется гораздо больше блокировок, чем нужно.
Это может быть блокировка каждой строки или перерастание в блокировку страницы или таблицы.
И посмотрите на вставки. Это сумасшедшие замки, которые ему не нужны.