Вопрос

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

Теперь я работаю с DBA, который запретил NOLOCK При каких -либо обстоятельствах - даже когда мой отчет (из -за значительного отсутствия индексов на нескольких таблицах) останавливает репликацию и обновления системы. На мой взгляд, в этом случае NOLOCK было бы хорошо.

Поскольку большая часть моего обучения SQL вышла на различные DBA с совершенно разными мнениями, я хотел спросить об этом широкому разнообразию DBA.

Это было полезно?

Решение

Если ваш отчет блокирует обновления, что ваш DBA правильный: вы не должны использовать NOLOCK. Анкет Тот факт, что там находятся Конфликты - это четкое признак того, что если вы бы Используйте грязные чтения, вы получите неправильные отчеты.

На мой взгляд, всегда есть лучшие альтернативы, чем NOLOCK:

  • Ваши производственные таблицы читаются только в действии и никогда не изменяются? Отметьте только чтение базы данных!
  • Сканирование таблиц вызывает конфликты блокировки? Установите таблицы соответствующим образом, преимущества множественные.
  • Нельзя изменить/не знать, как индексировать надлежащим образом? Использовать Изоляция снимка.
  • Не можете изменить приложение, чтобы использовать снимки? Включить Читайте преданный снимок!
  • Вы измерили влияние строки версий и имеете доказательства, что это влияет на производительность? Вы не можете индексировать данные? И ты в порядке с Неправильные отчеты? Затем, по крайней мере, сделайте себе одолжение и используйте SET TRANSACTION ISOLATION LEVEL, не подсказка запроса. Позже будет проще исправить уровень изоляции вместо изменения каждого запроса.

Другие советы

Это не так всегда Плохо.

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

Единственные уровни изоляции, которые гарантируют, что вы не столкнетесь с какими -либо такими аномалиями, являются сериализуемыми/снимками. При повторяемых значениях чтения можно пропустить, если ряд перемещается (из -за обновления ключа) до того, как сканирование достигнет этой строки, в разделе «Завершенные значения» можно прочитать дважды, если обновление ключа приведет к продвижению ранее чтения строки.

Эти проблемы с большей вероятностью возникнут в nolock Однако, поскольку по умолчанию на этом уровне изоляции он будет использовать Заказанное сканирование распределения, когда оценивается, нужно прочитать более 64 страниц. Анкет Помимо категории проблем, возникающих, когда строки перемещаются между страницами из -за обновлений ключей индекса. Заказанные на распределении. Также уязвимы к проблемам с расщеплениями страниц (где строки можно пропустить, если недавно выделенная страница в файле находится ранее, чем в точке. Уже сканируется или прочитайте дважды, если уже отсканированная страница разделена на более позднюю страницу в файле).

По крайней мере, для простых (единственных таблиц) запросов можно отговорить об использовании этих сканирований и получить заказанный ключ на сканировании при nolock Просто добавив ORDER BY index_key к запросу, чтобы Ordered собственность IndexScan является true.

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

Но, конечно, вы не должны бросить его на все вопросы в надежде, что это волшебная «турбо». Помимо большей вероятности столкновения с аномальными результатами при этом уровне изоляции или вообще вообще нет («не мог продолжить сканирование с помощью ошибок в движении данных»). Есть даже случаи, когда производительность с nolock может быть намного хуже.

Ваши клиенты терпят непоследовательные результаты в отчетах? Если ответ - нет, вы не должны использовать Nolock - вы можете получить неправильные результаты при одновременной оценке. Я написал несколько примеров здесь, здесь, а также здесь. Анкет Эти примеры показывают непоследовательный вывод под приверженным чтением и повторяемым чтением, но вы можете настроить их и получить неправильные результаты и с Nolock.

Большинство отчетов, которые я создаю, не запускаются на текущих данных. Большинство клиентов работают от отчетов - это вчерашние данные. Будет ли ваш ответ измениться, если бы это было так?

Если это так, то у вас есть еще один возможный вариант:
Вместо того, чтобы запускать ваши запросы в производственной базе данных и возиться с замками и NOLOCK, вы можете запустить свои отчеты из копии производственной базы данных.

Вы можете настроить это так он автоматически восстанавливается из резервной копии каждую ночь.
По -видимому, ваши отчеты работают на серверах на сайтах клиентов, поэтому я не знаю, будет ли настройка этого жизнеспособным решением для вас.
(Но опять же ... у них все равно должно быть резервное копирование, так что все, что вам нужно, это пространство для их восстановления).

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с dba.stackexchange
scroll top