Что это за хинт запроса 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? Так вот вы и получаете неверные результаты запроса
Обратные ссылки
Автор не разрешил комментировать эту запись
Комментарии
Показывать комментарии Как список | Древовидной структурой