Skip to content

Что это за хинт запроса READPAST?

Пересказ статьи Chad Callihan. What is the READPAST Query Hint?


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

Давайте сравним NOLOCK и READPAST, чтобы вы знали, чего следует ожидать, если вы хотите правильно использовать эти хинты запросов.

Поспешайте не спеша


Будем использовать в этом примере таблицу VoteTypes в базе данных StackOverflow2013. Можно увидеть, что “Offensive” соответствует id=4.



Давайте обновим этот Name, скажем, на “Rude”. Мы начнем транзакцию и выполним наше обновление в одном окне. Прежде чем зафиксировать или откатить транзакцию, попробуем сделать выборку из таблицы VoteTypes в другом окне:



Мы находимся в состоянии ожидания с нашим SELECT, пока первый запрос либо зафиксируется, либо будет выполнен откат. В этом случае мы выполним откат:



Соперничество вариантов


Теперь повторим этот сценарий, но добавим хинт NOLOCK:



В этом случае наш SELECT завершается почти мгновенно, и мы видим изменение в таблице - “Offensive” поменялось на “Rude”. Пока наша транзакция остается открытой, давайте попробуем использовать вместо NOLOCK хинт READPAST:



Вы видите разницу? Наш запрос по-прежнему завершился почти мгновенно, но, поскольку id 4 обновился в левом окне, наш запрос в правом окне прочитал прошлый id 4. Мы перескочили с id 3 к id 5, т.к. id 4 даже не существует.

Обращайтесь осторожно


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

Ссылки по теме
1. Основы использования хинта NOLOCK в SQL Server
2. Простая лабораторная работа для демонстрации опасности NOLOCK в операторах INSERT
3. Это ведь NOLOCK хорошо, когда данные не меняются, правильно?
4. Используете NOLOCK? Так вот вы и получаете неверные результаты запроса

Обратные ссылки

Нет обратных ссылок

Комментарии

Показывать комментарии Как список | Древовидной структурой

Нет комментариев.

Автор не разрешил комментировать эту запись

Добавить комментарий

Enclosing asterisks marks text as bold (*word*), underscore are made via _word_.
Standard emoticons like :-) and ;-) are converted to images.

To prevent automated Bots from commentspamming, please enter the string you see in the image below in the appropriate input box. Your comment will only be submitted if the strings match. Please ensure that your browser supports and accepts cookies, or your comment cannot be verified correctly.
CAPTCHA

Form options

Добавленные комментарии должны будут пройти модерацию прежде, чем будут показаны.