Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Когда использовать WITH (NOLOCK)?  [new]
anc32
Member

Откуда: Кострома
Сообщений: 146
Документацию читал, но:
1. Когда следует использовать WITH (NOLOCK)?
2. Когда не следует использовать WITH (NOLOCK)?
Просьба отвечать своими словами, а не кидать ссылки столетней давности.
31 авг 16, 21:01    [19614484]     Ответить | Цитировать Сообщить модератору
 Re: Когда использовать WITH (NOLOCK)?  [new]
iljy
Member

Откуда:
Сообщений: 8711
anc32,

отвечаю своими словами: никогда, за исключением крайне редких случаев, когда вы четко понимаете, зачем вам это нужно и чем лично вам это грозит. Если вы этого четко не понимаете, то значит точно не нужно.
31 авг 16, 21:35    [19614604]     Ответить | Цитировать Сообщить модератору
 Re: Когда использовать WITH (NOLOCK)?  [new]
3unknown
Member

Откуда: New York
Сообщений: 140
Если не боитесь грязных чтений, то пользуйтесь, если боитесь - не пользуйтесь
31 авг 16, 21:41    [19614625]     Ответить | Цитировать Сообщить модератору
 Re: Когда использовать WITH (NOLOCK)?  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
Когда собираете некую не критичную к точности (или обобщенную) информацию
31 авг 16, 22:46    [19614863]     Ответить | Цитировать Сообщить модератору
 Re: Когда использовать WITH (NOLOCK)?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
anc32
Документацию читал, но:
1. Когда следует использовать WITH (NOLOCK)?
2. Когда не следует использовать WITH (NOLOCK)?
Просьба отвечать своими словами, а не кидать ссылки столетней давности.
Когда вы не понимаете, следует ли использовать nolock, то его не следует использовать.
1 сен 16, 00:32    [19615353]     Ответить | Цитировать Сообщить модератору
 Re: Когда использовать WITH (NOLOCK)?  [new]
it17
Member

Откуда:
Сообщений: 108
anc32,

В организации 100 кассиров набивают платежки
После отправки документа, кассир должен увидеть список своих документов
Правки документов других пользователей ему не интересны, а блокировки только затормозят работу
В этом случае нужно использовать NOLOCK

Если вы работаете в OLTP системе и делаете выборки за прошлый период в котором данные гарантировано не поменяются.
1 сен 16, 11:05    [19616140]     Ответить | Цитировать Сообщить модератору
 Re: Когда использовать WITH (NOLOCK)?  [new]
o-o
Guest
it17
Если вы работаете в OLTP системе и делаете выборки за прошлый период в котором данные гарантировано не поменяются.

и что, что за прошлый период данные не меняются.
может, там кластерный клиуч guid.
пока вы свой период вычитываете, рядом одним из ваших гуидов вставили новый,
и он не влез на ту страницу.
ваши данные и еще полстраницы ушли на новую, вы эти данные уже посчитали в своем отчете.
и еще раз прочтете, тк. у вас идет allocation order scan, а прочитанные данные ушли аж на последнюю страницу,
которую еще не читали
1 сен 16, 11:17    [19616231]     Ответить | Цитировать Сообщить модератору
 Re: Когда использовать WITH (NOLOCK)?  [new]
o-o
Guest
вот если DWH и ETL с чтением по времени не пересекаются.
если только что перезалитую базу сделать READONLY,
не смогут считаться статистики, которые вдеруг понадобятся.
поэтому базу лучше оставить READWRITE, но опрашивать с NOLOCK.
экономия на S-блокировках
1 сен 16, 11:21    [19616254]     Ответить | Цитировать Сообщить модератору
 Re: Когда использовать WITH (NOLOCK)?  [new]
Ежов Дмитрий Сергеевич
Member

Откуда: Новокузнецк-Москва, Россия
Сообщений: 100
Сплошь и рядом используются в 1С эти NOLOCK-и.
При прокрутки списка документов, справочников, при формировании отчетов, при выполнении запросов вне транзакций 1С. Чебынет?
1 сен 16, 12:34    [19616700]     Ответить | Цитировать Сообщить модератору
 Re: Когда использовать WITH (NOLOCK)?  [new]
UniqueNick
Member

Откуда: Москва
Сообщений: 42
it17
anc32,
Правки документов других пользователей ему не интересны, а блокировки только затормозят работу
В этом случае нужно использовать NOLOCK

Включите READ_COMMITTED_SNAPSHOT и не будете ждать снятия блокировок других пользователей без всяких (NOLOCK).
1 сен 16, 13:55    [19617257]     Ответить | Цитировать Сообщить модератору
 Re: Когда использовать WITH (NOLOCK)?  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
UniqueNick
it17
anc32,
Правки документов других пользователей ему не интересны, а блокировки только затормозят работу
В этом случае нужно использовать NOLOCK

Включите READ_COMMITTED_SNAPSHOT и не будете ждать снятия блокировок других пользователей без всяких (NOLOCK).


Это так просто лишь в теории.
1 сен 16, 14:08    [19617346]     Ответить | Цитировать Сообщить модератору
 Re: Когда использовать WITH (NOLOCK)?  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
o-o
вот если DWH и ETL с чтением по времени не пересекаются.
если только что перезалитую базу сделать READONLY,
не смогут считаться статистики, которые вдеруг понадобятся.
поэтому базу лучше оставить READWRITE, но опрашивать с NOLOCK.
экономия на S-блокировках


NOLOCK можно использовать во всяких смотруверах, дашбордах, отчетах, информационных сводках, где пофиг будет показано то, что обновилось последние 5 сек или нет. Но когда идет обновление данных, когда важна целостность, когда это внутри транзакции про NOLOCK забудьте.
1 сен 16, 14:10    [19617353]     Ответить | Цитировать Сообщить модератору
 Re: Когда использовать WITH (NOLOCK)?  [new]
msLex
Member

Откуда:
Сообщений: 9271
o-o
it17
Если вы работаете в OLTP системе и делаете выборки за прошлый период в котором данные гарантировано не поменяются.

и что, что за прошлый период данные не меняются.
может, там кластерный клиуч guid.
пока вы свой период вычитываете, рядом одним из ваших гуидов вставили новый,
и он не влез на ту страницу.
ваши данные и еще полстраницы ушли на новую, вы эти данные уже посчитали в своем отчете.
и еще раз прочтете, тк. у вас идет allocation order scan, а прочитанные данные ушли аж на последнюю страницу,
которую еще не читали

все это прекрасно воспроизводится и в read commited.
1 сен 16, 14:22    [19617447]     Ответить | Цитировать Сообщить модератору
 Re: Когда использовать WITH (NOLOCK)?  [new]
o-o
Guest
a_voronin
NOLOCK можно использовать во всяких смотруверах, дашбордах, отчетах, информационных сводках, где пофиг будет показано то, что обновилось последние 5 сек или нет.

уже ведь написан пример, когда это не так.
вы опрашиваете данные за прошлый месяц, но ПК гуид.
и вставка данных за сейчас изменит вам подсчеты за тот период,
что уже давно никто не трогает.
только потому, что на страницу с вашими данными должны лечь данные за последние 5 секунд,
а места не нашлось.
читай вы в порядке кластерного индекса, такого не случилось бы,
но вам захотелось NOLOCK, а это еще и allocation order scan
1 сен 16, 14:26    [19617479]     Ответить | Цитировать Сообщить модератору
 Re: Когда использовать WITH (NOLOCK)?  [new]
o-o
Guest
msLex
o-o
пропущено...

и что, что за прошлый период данные не меняются.
может, там кластерный клиуч guid.
пока вы свой период вычитываете, рядом одним из ваших гуидов вставили новый,
и он не влез на ту страницу.
ваши данные и еще полстраницы ушли на новую, вы эти данные уже посчитали в своем отчете.
и еще раз прочтете, тк. у вас идет allocation order scan, а прочитанные данные ушли аж на последнюю страницу,
которую еще не читали

все это прекрасно воспроизводится и в read commited.

под "все это" имеется в виду именно мой конкретный пример со слитом *по причине вставки*?
приведите плиз пример на read committed, чтобы такое получить.
я сейчас не говорю об *апдэйте* и сплитах в связи с ним.
ибо и it17, и a_voronin говорят о получении данных, которые никто не трогает,
за прошлый период.
т.е. я предполагаю (и они тоже), что их не апдэйтят
1 сен 16, 14:39    [19617560]     Ответить | Цитировать Сообщить модератору
 Re: Когда использовать WITH (NOLOCK)?  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
o-o
msLex
пропущено...

все это прекрасно воспроизводится и в read commited.

под "все это" имеется в виду именно мой конкретный пример со слитом *по причине вставки*?
приведите плиз пример на read committed, чтобы такое получить.
я сейчас не говорю об *апдэйте* и сплитах в связи с ним.
ибо и it17, и a_voronin говорят о получении данных, которые никто не трогает,
за прошлый период.
т.е. я предполагаю (и они тоже), что их не апдэйтят


Как раз я говорю о данных, которые активно "дрючат" апдейтами. Например, идет голосование, а вы смотрите на доске результат. Или работает куча процедур, а вы смотрите статус их прогресса по логу в который они пишут. Идет INSERT , транзакция ещё не закончилась, а с NOLOCK можно посмотреть, сколько же строк он вставил.
1 сен 16, 15:24    [19617829]     Ответить | Цитировать Сообщить модератору
 Re: Когда использовать WITH (NOLOCK)?  [new]
o-o
Guest
a_voronin
o-o
пропущено...

под "все это" имеется в виду именно мой конкретный пример со слитом *по причине вставки*?
приведите плиз пример на read committed, чтобы такое получить.
я сейчас не говорю об *апдэйте* и сплитах в связи с ним.
ибо и it17, и a_voronin говорят о получении данных, которые никто не трогает,
за прошлый период.
т.е. я предполагаю (и они тоже), что их не апдэйтят


Как раз я говорю о данных, которые активно "дрючат" апдейтами. Например, идет голосование, а вы смотрите на доске результат. Или работает куча процедур, а вы смотрите статус их прогресса по логу в который они пишут. Идет INSERT , транзакция ещё не закончилась, а с NOLOCK можно посмотреть, сколько же строк он вставил.

тогда вас вычеркиваю из списка моего примера,
мы друг друга не поняли.
it17 говорил про данные, которые точно никто не трогает.
ну а ваше, когда могут вообще отменить только что прочтенное,
но вам на это наплевать,
не имеет отношения к комменту msLex,
ибо на READ COMMITTED вы незакоммиченное не прочтете
1 сен 16, 15:36    [19617897]     Ответить | Цитировать Сообщить модератору
 Re: Когда использовать WITH (NOLOCK)?  [new]
msLex
Member

Откуда:
Сообщений: 9271
o-o
msLex
пропущено...

все это прекрасно воспроизводится и в read commited.

под "все это" имеется в виду именно мой конкретный пример со слитом *по причине вставки*?
приведите плиз пример на read committed, чтобы такое получить.

я не готов прямо сейчас предоставить репро, но выглядит это примерно так


Процесс один (П1) (тот, что читает данные) сканирует индекс по IAM-у.
П1. Вычитывает данные со станицы 1 и идет дальше.
Процесс два(П2) добавляет данные на страницу 1, что приводит к ее split-у, и часть данные уезжает в "конец" IAM.
П2 завершает транзакцию.
П1 Доходит до конца IAM и повторно вычитывает данные (те что переехали со страницы 1 на страницу N).

Получаем несогласованные (замноженные) данные.
1 сен 16, 16:09    [19618072]     Ответить | Цитировать Сообщить модератору
 Re: Когда использовать WITH (NOLOCK)?  [new]
o-o
Guest
msLex
o-o
пропущено...

под "все это" имеется в виду именно мой конкретный пример со слитом *по причине вставки*?
приведите плиз пример на read committed, чтобы такое получить.

я не готов прямо сейчас предоставить репро, но выглядит это примерно так


Процесс один (П1) (тот, что читает данные) сканирует индекс по IAM-у.
П1. Вычитывает данные со станицы 1 и идет дальше.
Процесс два(П2) добавляет данные на страницу 1, что приводит к ее split-у, и часть данные уезжает в "конец" IAM.
П2 завершает транзакцию.
П1 Доходит до конца IAM и повторно вычитывает данные (те что переехали со страницы 1 на страницу N).

Получаем несогласованные (замноженные) данные.

мы же (в смысле вы же) говорим о READ COMMITTED.
когда же на rc будет чтение в IAM-порядке?
когда ридонли база или TABLOCK на таблице.
но тогда оба ваши случая невозможны
1 сен 16, 16:16    [19618113]     Ответить | Цитировать Сообщить модератору
 Re: Когда использовать WITH (NOLOCK)?  [new]
msLex
Member

Откуда:
Сообщений: 9271
o-o
msLex
пропущено...

я не готов прямо сейчас предоставить репро, но выглядит это примерно так


Процесс один (П1) (тот, что читает данные) сканирует индекс по IAM-у.
П1. Вычитывает данные со станицы 1 и идет дальше.
Процесс два(П2) добавляет данные на страницу 1, что приводит к ее split-у, и часть данные уезжает в "конец" IAM.
П2 завершает транзакцию.
П1 Доходит до конца IAM и повторно вычитывает данные (те что переехали со страницы 1 на страницу N).

Получаем несогласованные (замноженные) данные.

мы же (в смысле вы же) говорим о READ COMMITTED.
когда же на rc будет чтение в IAM-порядке?
когда ридонли база или TABLOCK на таблице.
но тогда оба ваши случая невозможны

хмм, а можно тынц какой на невозможность в READ COMMITTED random scan-а?
1 сен 16, 16:20    [19618138]     Ответить | Цитировать Сообщить модератору
 Re: Когда использовать WITH (NOLOCK)?  [new]
o-o
Guest
msLex
хмм, а можно тынц какой на невозможность в READ COMMITTED random scan-а?

как же невозножно, возможно.
как раз на при 100%-ной уверенности в неизменности данных,
т.е. readonly/tablock
сейчас поищу что-нибудь подтверждающее.
вас только официальное устроит или Randal тоже?
1 сен 16, 16:25    [19618165]     Ответить | Цитировать Сообщить модератору
 Re: Когда использовать WITH (NOLOCK)?  [new]
o-o
Guest
Allocation Order Scans Posted by Paul White
White
The conditions often cited for allocation order scans to be available are:
1 The query plan must allow an unordered scan of the index;
2 the index must be at least 64 pages in size; and,
3 either a TABLOCK or NOLOCK hint must be specified.

----------------------------

When can allocation order scans be used?by Paul Randal

Randal
The only time such a scan will be used is when there’s no possibility of the data changing
(e.g. when the TABLOCK hint is specified, or when the table is in a read-only database)
or when its explicitly stated that we don’t care (e.g. when the NOLOCK hint is specifed or under READ UNCOMMITTED isolation level).
As a further twist, there’s a trade-off with setup cost of the allocation order scan against the number of pages that will b read –
an allocation order scan will only be used if there’s more than 64 pages to be read.

официальное поищу из дома, сегодня у меня досрочный уход с работы
1 сен 16, 16:36    [19618227]     Ответить | Цитировать Сообщить модератору
 Re: Когда использовать WITH (NOLOCK)?  [new]
msLex
Member

Откуда:
Сообщений: 9271
o-o
msLex
хмм, а можно тынц какой на невозможность в READ COMMITTED random scan-а?

как же невозножно, возможно.
как раз на при 100%-ной уверенности в неизменности данных,
т.е. readonly/tablock
сейчас поищу что-нибудь подтверждающее.
вас только официальное устроит или Randal тоже?

хоть что-нибудь

просто у меня есть (были) живые примеры обратного

1.
select COUNT(*)
from ttt with(rowlock)
option (maxdop 1)
показывает рандом scan (в актуальном плане)

2. был замечательный случай, где scan уникального интенсивно обновляющегося индекса (добавление/апдейт но ключ не изменяется) выдавал дубликаты
что-то типа
select id
into #t
from ttt (в плане тот же не ordered scan)

добавление
order by id (в плане скан превращался в ordered)
проблему убирает.
1 сен 16, 16:43    [19618259]     Ответить | Цитировать Сообщить модератору
 Re: Когда использовать WITH (NOLOCK)?  [new]
o-o
Guest
msLex
показывает рандом scan (в актуальном плане)

ни в актуальном, ни в оценочном вы не увидите, какой скан он выбрал.
это просто не отражается в плане никак.
если написано UNORDERED, то это не гарантия IAM ORDERED.
это просто возможность выбора между IAM / INDEX ORDER,
которая есть не всегда
(только если и страниц > 64, tablock/readonly/nolock)
1 сен 16, 16:54    [19618302]     Ответить | Цитировать Сообщить модератору
 Re: Когда использовать WITH (NOLOCK)?  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
o-o
приведите плиз пример на read committed, чтобы такое получить.


https://msdn.microsoft.com/ru-ru/library/ms190805.aspx
автор
Транзакции, работающие на уровне изоляции READ COMMITTED, используют совмещаемые блокировки, однако блокировки строк и страниц снимаются после чтения строки. В любом случае, если во время сканирования индекса другой пользователь изменит ключевой столбец индекса для строки, считывание которой происходит в данный момент, причем строка была перемещена в позицию, до которой операция сканирования еще не дошла, эта строка может появиться повторно. Аналогично, если изменение ключа переместило строку в позицию, считывание которой уже прошло, то она может не отобразиться.
2 сен 16, 16:38    [19622336]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить