Лучший способ избежать блокировок на сильно читаемом столе? - PullRequest
2 голосов
/ 06 мая 2010

У меня большая база данных (~ 4 ГБ), с 2 большими таблицами (~ 3M записей), имеющими ~ 180K SELECTs / час, ~ 2k UPDATEs / час и ~ 1k INSERTs + DELETEs / час.

Каков наилучший способ гарантировать отсутствие блокировок для задач чтения при вставке / обновлении / удалении?

Я думал об использовании подсказки NOLOCK, но об этом так много говорят (хорошо, плохо, это зависит), что я немного растерялся. Должен сказать, что я попробовал это в среде разработчиков и не обнаружил никаких проблем, но я не хочу запускать его в производство, пока не получу какую-то обратную связь ...

ОБНОВЛЕНИЕ : Я уточняю это после получения комментария - из-за бизнеса, связанного с этим приложением, я не возражаю, если запись SELECTed устарела из-за одновременного удаления / обновления. Следующее чтение вернет новое, и это нормально.

ОБНОВЛЕНИЕ 2 : В этом приложении, когда запись вставляется или обновляется, весьма вероятно, что она останется нетронутой как минимум в течение месяца. (может быть, я смогу разбить таблицу по столбцу lastUpdated?)

Спасибо! * 1015 Луиджи *

Ответы [ 5 ]

2 голосов
/ 06 мая 2010

На основании ОБНОВЛЕННОЙ части вашего вопроса, NOLOCK в порядке.

0 голосов
/ 23 сентября 2010

При использовании NOLOCK также проверьте этот блог (возможны не только грязные чтения).

0 голосов
/ 06 мая 2010

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

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

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

0 голосов
/ 06 мая 2010

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

0 голосов
/ 06 мая 2010

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

...