Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3] 4   вперед  Ctrl      все
 Re: select with (nolock) отваливается по timeout'у  [new]
Ex_Soft
Member

Откуда:
Сообщений: 7710
Glory
Т.е. вам еще и картинки нарисовать ?

Можно словами. Вы доступно изъясняетесь.
22 окт 15, 14:44    [18312150]     Ответить | Цитировать Сообщить модератору
 Re: select with (nolock) отваливается по timeout'у  [new]
Glory
Member

Откуда:
Сообщений: 104760
Ex_Soft
Glory
Т.е. вам еще и картинки нарисовать ?

Можно словами. Вы доступно изъясняетесь.

Да нет уж, увольте.
Вы уж как нибудь там сами абстрагируйтесь.
22 окт 15, 14:45    [18312161]     Ответить | Цитировать Сообщить модератору
 Re: select with (nolock) отваливается по timeout'у  [new]
Ex_Soft
Member

Откуда:
Сообщений: 7710
invm
Запускаете профайлер. Создаете новую трассировку со следующими событиями: SQL:StmtStarting, SQL:StmtCompleted, Lock:Acquired, Lock:Released.
Добавляете фильтр по SPID на интересующую вас сессию.
Выполняете в этой сессии запрос и изучаете в профайлере результат.

Сделал. Запустил. На все том же 18311290
select * from TestTable4ReadLock /*with (nolock)*/ where Value = 100

Вижу Lock:Acquired object_id = 1314103722, index_id or stats_id = 1. 1314103722 - это PK_TestTable4ReadLock. Задлянафига? where Value = 100 по Value ж.

К сообщению приложен файл. Размер - 32Kb
22 окт 15, 14:55    [18312225]     Ответить | Цитировать Сообщить модератору
 Re: select with (nolock) отваливается по timeout'у  [new]
Glory
Member

Откуда:
Сообщений: 104760
Ex_Soft
Задлянафига? where Value = 100 по Value ж.

А остальные поля, которые select *, откуда взять ? Абстрактно придумать ?
22 окт 15, 14:58    [18312239]     Ответить | Цитировать Сообщить модератору
 Re: select with (nolock) отваливается по timeout'у  [new]
Владислав Колосов
Member

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

PK_TestTable4ReadLock кластерный.
22 окт 15, 14:59    [18312250]     Ответить | Цитировать Сообщить модератору
 Re: select with (nolock) отваливается по timeout'у  [new]
Ex_Soft
Member

Откуда:
Сообщений: 7710
Glory
А остальные поля, которые select *, откуда взять ? Абстрактно придумать ?

Заменил на
select Value from TestTable4ReadLock /*with (nolock)*/ where Value = 100

те же яйца тока в профиль
Владислав Колосов
PK_TestTable4ReadLock кластерный.

Да. Почему акцент на кластерный? Что это меняет (в контексте некластерного индекса)? Поиск же идет по Value. А PK_TestTable4ReadLock построен по Id.
22 окт 15, 15:06    [18312296]     Ответить | Цитировать Сообщить модератору
 Re: select with (nolock) отваливается по timeout'у  [new]
Glory
Member

Откуда:
Сообщений: 104760
Ex_Soft
Заменил на
select Value from TestTable4ReadLock /*with (nolock)*/ where Value = 100


те же яйца тока в профиль
Владислав Колосов
PK_TestTable4ReadLock кластерный.

Вы думаете, что этого достаточно ?

Ex_Soft
Да. Почему акцент на кластерный? Что это меняет (в контексте некластерного индекса)? Поиск же идет по Value. А PK_TestTable4ReadLock построен по Id.

А как еще можно искать по полю, значение которого есть только в таблице ?
22 окт 15, 15:08    [18312315]     Ответить | Цитировать Сообщить модератору
 Re: select with (nolock) отваливается по timeout'у  [new]
invm
Member

Откуда: Москва
Сообщений: 9405
Ex_Soft,

Смотрите в трассе столбцы Mode и Type.
22 окт 15, 15:12    [18312355]     Ответить | Цитировать Сообщить модератору
 Re: select with (nolock) отваливается по timeout'у  [new]
Владислав Колосов
Member

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

т.е. Вы не знаете, что такое кластерный индекс и как он используется в запросах. Вы хотите получить ответы, но в ответах содержится информация, которой Вы не владеете. Отсюда можно сделать вывод, что для достижения желаемого понимания Вам необходимо почитать статьи об индексах и блокировках.
22 окт 15, 15:20    [18312451]     Ответить | Цитировать Сообщить модератору
 Re: select with (nolock) отваливается по timeout'у  [new]
Ex_Soft
Member

Откуда:
Сообщений: 7710
Glory
Вы думаете, что этого достаточно ?

Что еще необходимо?
Glory
А как еще можно искать по полю, значение которого есть только в таблице ?

Ну... Насколько мне известно, если поле по которому осуществляется поиск не имеет индекса, то тогда используется table scan по этому полю.
invm
Смотрите в трассе столбцы Mode и Type.

Mode: 1 - Sch-S
Type: 11 - METADATA

К сообщению приложен файл (drosophila.zip - 1Kb) cкачать
22 окт 15, 15:28    [18312510]     Ответить | Цитировать Сообщить модератору
 Re: select with (nolock) отваливается по timeout'у  [new]
тайм мать его аут нигга
Guest
желание спихнуть проблему на "базистов которые что-то чего-то там а у меня из-за них таймаут" затмило и здравомыслие, и коммуникационные функции слегка покорежило
22 окт 15, 15:28    [18312513]     Ответить | Цитировать Сообщить модератору
 Re: select with (nolock) отваливается по timeout'у  [new]
Glory
Member

Откуда:
Сообщений: 104760
Ex_Soft
Ну... Насколько мне известно, если поле по которому осуществляется поиск не имеет индекса, то тогда используется table scan по этому полю.

А что такое кластерный индекс тогда по-вашему ?
22 окт 15, 15:28    [18312520]     Ответить | Цитировать Сообщить модератору
 Re: select with (nolock) отваливается по timeout'у  [new]
Ex_Soft
Member

Откуда:
Сообщений: 7710
Владислав Колосов
Вам необходимо почитать статьи об индексах

Почитал - немного проясняется. Насколько понял ключевой момент
Фактически, для кластерного индекса leaf level этого индекса есть сами страницы таблицы с данными.
???
22 окт 15, 15:37    [18312597]     Ответить | Цитировать Сообщить модератору
 Re: select with (nolock) отваливается по timeout'у  [new]
Glory
Member

Откуда:
Сообщений: 104760
Ex_Soft
Насколько понял ключевой момент
Фактически, для кластерного индекса leaf level этого индекса есть сами страницы таблицы с данными.
???

Ну раз кластерный индекс содержит "сами страницы таблицы с данными", то как тогда искать по полю, которое содержится только в этих страницах ?
22 окт 15, 15:44    [18312655]     Ответить | Цитировать Сообщить модератору
 Re: select with (nolock) отваливается по timeout'у  [new]
Ex_Soft
Member

Откуда:
Сообщений: 7710
invm
Смотрите в трассе столбцы Mode и Type.

Вот теперь видно, что:
без nolock Mode: 6 - IS Type: 5 - OBJECT
c nolock Mode: 1 - Sch-S Type: 5 - OBJECT
и становится понятным почему то висит, а то выполняется (в дрозофиле).
THNX

Glory
Ну раз кластерный индекс содержит "сами страницы таблицы с данными", то как тогда искать по полю, которое содержится только в этих страницах ?

Получается любые манипуляции с таблицей, имеющей кластерный индекс, равносильно обращению к этому кластерному индексу вне зависимости от того используется он как таковой или нет?
22 окт 15, 16:08    [18312820]     Ответить | Цитировать Сообщить модератору
 Re: select with (nolock) отваливается по timeout'у  [new]
Glory
Member

Откуда:
Сообщений: 104760
Ex_Soft
Получается любые манипуляции с таблицей, имеющей кластерный индекс, равносильно обращению к этому кластерному индексу вне зависимости от того используется он как таковой или нет?

Не получается. Чиайте еще раз.
22 окт 15, 16:09    [18312828]     Ответить | Цитировать Сообщить модератору
 Re: select with (nolock) отваливается по timeout'у  [new]
o-o
Guest
представляю вашему вниманию картинку "супер-онлайн ребилд".
участники:

spid 54 -- читает данные из dbo.Nums (repeatable read): n от 20 до 30
dbo.Nums -- кластерная таблица

CREATE TABLE [dbo].[nums](
	[n] [int] NOT NULL,
 CONSTRAINT [PK_nums_n] PRIMARY KEY CLUSTERED 
(
	[n] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

вставлять в нее можно, блокирована 1 страница, всего там 1000000 строк.

spid 61 ребилдит эту таблицу онлайново,
давно отребилдил, но не может получить финальное SCH_M

spid 55 пришел со вставкой, но должен дождаться 61

висим.
висим и висим, пока 54 не прекратит уберет свое S,
вот тогда перестроение индекса (61) завершится,
а 55 вставит свою строку.

это не к проблеме ТС-а, это все к ребилду, но и ТС-у тоже, т.к.
о ребилде можно случайно не знать и долго удивляться, почему не проходит вставка

К сообщению приложен файл. Размер - 81Kb
22 окт 15, 18:11    [18313540]     Ответить | Цитировать Сообщить модератору
 Re: select with (nolock) отваливается по timeout'у  [new]
Ex_Soft
Member

Откуда:
Сообщений: 7710
o-o
но и ТС-у тоже, т.к.
о ребилде можно случайно не знать и долго удивляться, почему не проходит вставка

да у меня с точностью до наоборот - вставка происходит, а во время этого чтение отваливается
22 окт 15, 18:26    [18313622]     Ответить | Цитировать Сообщить модератору
 Re: select with (nolock) отваливается по timeout'у  [new]
o-o
Guest
Ex_Soft,

Строчкой выше не заметили "это не к проблеме ТС-а"?
Но адресуется и вам тоже.
Потому что если не мониторить, а просто выползти на форум с кодом первого и третьего окна
и рассказывать, что из-за чтения одной страницы, хотя бы и часами, но не на serializable, а на repeatable read,
инсерт не входящего в диапазон и при наличии кластерного тоже висит часами,
кто и что вам сможет объяснить?
Мы ж не видим, что еще у вас происходит,
а вы и в мыслях не допускаете, что там без вашего ведома что-то делается
22 окт 15, 18:47    [18313708]     Ответить | Цитировать Сообщить модератору
 Re: select with (nolock) отваливается по timeout'у  [new]
Ex_Soft
Member

Откуда:
Сообщений: 7710
Понял
22 окт 15, 18:59    [18313750]     Ответить | Цитировать Сообщить модератору
 Re: select with (nolock) отваливается по timeout'у  [new]
Eleanor
Member

Откуда:
Сообщений: 2925
Ex_Soft
Я хочу в процессе дискуссии узнать все возможные причины

Может уже приводили в переписке выше, но вот вам еще вариант, когда insert блокирует select с nolock:
Создаем таблицу create table large_test (name varchar(200))
В первой сессии выполняем
insert into large_test with(tablock)
select C1.name from sys.columns C1
cross apply sys.columns C2
cross apply sys.columns C3

Во второй сессии, не дожидаясь окончания первой:
select top 1 * from large_test with (nolock)

Несмотря на nolock возникает бесконечное ожидание LCK_M_S
26 окт 15, 17:27    [18328896]     Ответить | Цитировать Сообщить модератору
 Re: select with (nolock) отваливается по timeout'у  [new]
Glory
Member

Откуда:
Сообщений: 104760
Eleanor
Несмотря на nolock возникает бесконечное ожидание LCK_M_S

И что блокируется то ?
26 окт 15, 17:29    [18328919]     Ответить | Цитировать Сообщить модератору
 Re: select with (nolock) отваливается по timeout'у  [new]
invm
Member

Откуда: Москва
Сообщений: 9405
Glory
И что блокируется то ?
Инструкция
insert into large_test with(tablock)
select C1.name from sys.columns C1
cross apply sys.columns C2
cross apply sys.columns C3
будет выполняться с минимальным журналированием, если для этого соблюдены условия.

Т.к. таблица - куча, то и читатель с NOLOCK, и BULK INSERT будут накладывать на кучу специальный тип S-блокировки: BULK_OPERATION. Эта блокировка не совместима сама с собой и используется для предотвращения чтения неотформатированных страниц (объяснение взято у Paul Randall).
Поэтому, в данном примере, и возникает ожидание на LCK_M_S с subresource=BULK_OPERATION.

Если же создать у таблицы индекс (кластерный или не кластерный), то, при BULK INSERT, согласно Guidelines for Optimizing Bulk Import, на таблицу будет наложена Sch-M, что также заблокирует читателя с NOLOCK.
26 окт 15, 22:40    [18330364]     Ответить | Цитировать Сообщить модератору
 Re: select with (nolock) отваливается по timeout'у  [new]
Eleanor
Member

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

у вас наверно режим восстановления другой.
Имела в виду bulk import, которому нужен bulk-logged\simple, вставка в heap и tablock. Вторая сессия у меня зависает с wait_type = LCK_M_S, wait_resource = HOBT: 12:72057594039894016 [BULK_OPERATION]

Коллега сегодня наткнулся, когда данные переносил.
26 окт 15, 23:00    [18330431]     Ответить | Цитировать Сообщить модератору
 Re: select with (nolock) отваливается по timeout'у  [new]
invm
Member

Откуда: Москва
Сообщений: 9405
invm
Т.к. таблица - куча, то и читатель с NOLOCK, и BULK INSERT будут накладывать на кучу специальный тип S-блокировки: BULK_OPERATION. Эта блокировка не совместима сама с собой и используется для предотвращения чтения неотформатированных страниц (объяснение взято у Paul Randall).
Поправка.
Писатель будет накладывать на кучу BULK_OPERATION IX, читатель - BULK OPERATION S.
26 окт 15, 23:31    [18330484]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3] 4   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить