SQL Server NOLOCK против READPAST в системе очереди

На работе я разрабатываю совершенно новый продукт, который должен скоро выйти в свет. Это преимущественно продукт ETL, который будет иметь дело с огромными объемами данных в операции типа очереди. Так что записи приходят, мы над ними работаем, а потом их собирают и отправляют обратно. Таким образом, все, что делается в этой системе, повторяется снова и снова, пока все записи не будут обработаны.

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

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

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

Интересно, что другие думают по этому поводу? Я понимаю, что это не замена правильному индексированию, и я также работаю над этим.


person hyphen    schedule 27.08.2019    source источник
comment
Мой начальник (открытый и разумный, это не требование) говорит мне, что я должен добавлять NOLOCK подсказки ко всем запросам. Объяснил ли ваш начальник причину этого? Прежде чем добавлять NOLOCK в любой запрос, нужно подумать о многом; пусть вместе одеяло добавить его к каждому отдельному.   -  person Larnu    schedule 27.08.2019
comment
Рассмотрим сервис-брокера. Он специально разработан, чтобы избежать всех ловушек, с которыми вы, естественно, столкнетесь при попытке реализовать очереди в виде таблиц. И уж точно не рассматривайте NOLOCK. Последнее, что вам нужно в системе очередей, это дублированные или пропущенные сообщения, что вполне возможно с NOLOCK. NOLOCK подходит только для запросов, где вам все равно, могут ли результаты быть неправильными, потому что вы можете легко запустить его повторно (например, запрос мониторинга).   -  person Jeroen Mostert    schedule 27.08.2019
comment
Существует еще один существующий продукт, в котором они решили использовать NOLOCK повсюду, вероятно, по уважительной причине, но это совершенно новый продукт, и мы не видели, чтобы он работал достаточно, чтобы даже увидеть проблемы с блокировкой.   -  person hyphen    schedule 27.08.2019
comment
Использование NOLOCK редко используется по уважительной причине — обычно это рефлекторная реакция на людей, которые видят, что их запросы терпят неудачу из-за взаимоблокировок, и не знают, как их разрешить (или считают это слишком обременительной задачей). . Это плохая привычка, и есть альтернативы (например, снимок изоляция).   -  person Jeroen Mostert    schedule 27.08.2019
comment
Я использовал только подсказку в реальной процедуре, которая извлекает записи для обработки на уровне приложения, основываясь на этом сообщении: mssqltips.com/sqlservertip/1257/   -  person hyphen    schedule 27.08.2019
comment
У меня никогда не было необходимости добавлять NOLOCK к чему-либо. Если вы решите использовать эту табличную подсказку, следует принять во внимание все последствия (запрос может увидеть грязные и противоречивые данные). См. также этот вопрос о переполнении стека: является ли NOLOCK (подсказка сервера Sql) плохой практикой?   -  person TT.    schedule 27.08.2019
comment
Я использовал READPAST в сочетании с UPDLOCK в основном так же, как они продемонстрировали в ссылке. Есть и другие части процесса, которые моя бэкэнд-система etl запускает против очереди. У меня нет никаких намеков на эти записи, но они работают только с уже завершенными записями. Я использую серию статусов для управления потоком записей, и уровень приложения просматривает только один набор статусов, а мой процесс ETL в основном просматривает другой. Поэтому я надеюсь, что блокировка не будет большой проблемой (?)..   -  person hyphen    schedule 27.08.2019
comment
Релевантно: Использование таблицы базы данных в качестве очереди   -  person TT.    schedule 27.08.2019