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

Откуда:
Сообщений: 357
В результате выполнения ожидаемых строк 10 млн. а по факту 0 строк. (на скрине).
Я правильно понимаю по было просканировано 10 млн. строк, т.к. это было в транзакции эти 10 млн. строк заблокированы до окончания транзакции?

К сообщению приложен файл. Размер - 11Kb
15 апр 19, 16:44    [21862796]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по плану выполнения запроса. Сколько будет заблокировано строк?  [new]
Владислав Колосов
Member

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

зависит от уровня изоляции и типа блокировки.
15 апр 19, 16:51    [21862809]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по плану выполнения запроса. Сколько будет заблокировано строк?  [new]
leonix
Member

Откуда:
Сообщений: 357
В запросе with(nolock)

exec sp_executesql N'INSERT INTO #tt90 WITH(TABLOCK) (_Q_001_F_000RRef, _Q_001_F_001RRef, _Q_001_F_002RRef, _Q_001_F_003_TYPE, _Q_001_F_003_S, _Q_001_F_003_RRRef, _Q_001_F_004) SELECT TOP 332
T1.Fld34174RRef,
T1.Fld34175RRef,
T1.Fld34173RRef,
T1.Fld35801_TYPE,
T1.Fld35801_S,
T1.Fld35801_RRRef,
CAST(SUM(T1.Fld34179Turnover_) AS NUMERIC(27, 3))
FROM (SELECT
T2._Period AS Period_,
T2._RecorderTRef AS RecorderTRef,
T2._RecorderRRef AS RecorderRRef,
T2._Fld34175RRef AS Fld34175RRef,
T2._Fld34174RRef AS Fld34174RRef,
T2._Fld35801_TYPE AS Fld35801_TYPE,
T2._Fld35801_S AS Fld35801_S,
T2._Fld35801_RRRef AS Fld35801_RRRef,
T2._Fld34173RRef AS Fld34173RRef,
CAST(SUM(CASE WHEN T2._RecordKind = 0.0 THEN T2._Fld34179 ELSE -T2._Fld34179 END) AS NUMERIC(21, 3)) AS Fld34179Turnover_
FROM dbo._AccumRg34172 T2 WITH(NOLOCK)
WHERE T2._Active = 0x01 AND (EXISTS(SELECT
1
FROM #tt85 T3 WITH(NOLOCK)
WHERE (T2._Fld34174RRef = T3._Q_000_F_002RRef) AND (T2._Fld35801_TYPE = CASE WHEN (T3._Q_000_F_017_TYPE = 0x08 AND T3._Q_000_F_017_S = @P1 AND T3._Q_000_F_017_RRRef = @P2) THEN T3._Q_000_F_020_TYPE ELSE T3._Q_000_F_017_TYPE END AND T2._Fld35801_S = CASE WHEN (T3._Q_000_F_017_TYPE = 0x08 AND T3._Q_000_F_017_S = @P3 AND T3._Q_000_F_017_RRRef = @P4) THEN T3._Q_000_F_020_S ELSE T3._Q_000_F_017_S END AND T2._Fld35801_RRRef = CASE WHEN (T3._Q_000_F_017_TYPE = 0x08 AND T3._Q_000_F_017_S = @P5 AND T3._Q_000_F_017_RRRef = @P6) THEN T3._Q_000_F_020_RRRef ELSE T3._Q_000_F_017_RRRef END)))
GROUP BY T2._Period,
T2._RecorderTRef,
T2._RecorderRRef,
T2._Fld34175RRef,
T2._Fld34174RRef,
T2._Fld35801_TYPE,
T2._Fld35801_S,
T2._Fld35801_RRRef,
T2._Fld34173RRef
HAVING (CAST(SUM(CASE WHEN T2._RecordKind = 0.0 THEN T2._Fld34179 ELSE -T2._Fld34179 END) AS NUMERIC(21, 3))) <> 0.0) T1
LEFT OUTER JOIN dbo._Document567 T4 WITH(NOLOCK)
ON T1.RecorderTRef = 0x00000237 AND T1.RecorderRRef = T4._IDRRef
LEFT OUTER JOIN dbo._Document27909 T5 WITH(NOLOCK)
ON T1.RecorderTRef = 0x00006D05 AND T1.RecorderRRef = T5._IDRRef
LEFT OUTER JOIN dbo._Document46085 T6 WITH(NOLOCK)
ON T1.RecorderTRef = 0x0000B405 AND T1.RecorderRRef = T6._IDRRef
WHERE (CASE WHEN T1.RecorderTRef = 0x00000237 THEN T4._Fld16218_TYPE WHEN T1.RecorderTRef = 0x00006D05 THEN T5._Fld27910_TYPE WHEN T1.RecorderTRef = 0x0000B405 THEN CASE WHEN T6._Fld47647RRef IS NOT NULL THEN 0x08 END ELSE CAST(NULL AS BINARY(1)) END = 0x08 AND CASE WHEN T1.RecorderTRef = 0x00000237 THEN T4._Fld16218_RTRef WHEN T1.RecorderTRef = 0x00006D05 THEN T5._Fld27910_RTRef WHEN T1.RecorderTRef = 0x0000B405 THEN CASE WHEN T6._Fld47647RRef IS NOT NULL THEN 0x00000153 END ELSE CAST(NULL AS BINARY(4)) END = 0x0000B405 AND CASE WHEN T1.RecorderTRef = 0x00000237 THEN T4._Fld16218_RRRef WHEN T1.RecorderTRef = 0x00006D05 THEN T5._Fld27910_RRRef WHEN T1.RecorderTRef = 0x0000B405 THEN T6._Fld47647RRef ELSE CAST(NULL AS BINARY(16)) END = @P7)
GROUP BY T1.Fld34174RRef,
T1.Fld34175RRef,
T1.Fld34173RRef,
T1.Fld35801_TYPE,
T1.Fld35801_S,
T1.Fld35801_RRRef',N'@P1 nvarchar(4000),@P2 varbinary(16),@P3 nvarchar(4000),@P4 varbinary(16),@P5 nvarchar(4000),@P6 varbinary(16),@P7 varbinary(16)',N'',0x943500505688064611E49FDF661DC874,N'',0x943500505688064611E49FDF661DC874,N'',0x943500505688064611E49FDF661DC874,0x9C8EAC1F6B0C185F11E95F48CD9A6402
15 апр 19, 16:53    [21862811]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по плану выполнения запроса. Сколько будет заблокировано строк?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6156
leonix,
автор
В запросе with(nolock)

ну так и на первую половину вопроса отвечайте
15 апр 19, 17:04    [21862823]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по плану выполнения запроса. Сколько будет заблокировано строк?  [new]
msLex
Member

Откуда:
Сообщений: 5958
leonix

1. У вас локальная временная таблица, зачем вам вообще беспокоиться о блокировках?
2. при nolock накладывается только schema stability блокировка на таблицу, чтобы избежать модификации ее структуры в процессе получения данных. Она будет снята сразу после завершении стейтмента.
3. только при уровне изоляции serializable на объекте могут остаться блокировки после завершения читающего стейтмента
15 апр 19, 17:09    [21862831]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по плану выполнения запроса. Сколько будет заблокировано строк?  [new]
msLex
Member

Откуда:
Сообщений: 5958
msLex
leonix

1. У вас локальная временная таблица, зачем вам вообще беспокоиться о блокировках?
2. при nolock накладывается только schema stability блокировка на таблицу, чтобы избежать модификации ее структуры в процессе получения данных. Она будет снята сразу после завершении стейтмента.
3. только при уровне изоляции serializable на объекте могут остаться блокировки после завершения читающего стейтмента


за стеной красного текста не увидел остальные объекты.
первый пункт вычеркиваем.
15 апр 19, 17:11    [21862834]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по плану выполнения запроса. Сколько будет заблокировано строк?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6156
msLex,

ну ещё REPEATABLE READ

хотя NOLOCK ничего деражать "после" не будет
15 апр 19, 17:12    [21862837]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по плану выполнения запроса. Сколько будет заблокировано строк?  [new]
leonix
Member

Откуда:
Сообщений: 357
Насколько я понял идёт длительная транзакция с уровнем изоляции READ COMMITTED.

Меня ещё интересует, судя по скрину, сканируется 10 млн? Т.е. скуль перебирает 10 млн?
15 апр 19, 17:15    [21862838]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по плану выполнения запроса. Сколько будет заблокировано строк?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6156
leonix
Насколько я понял идёт длительная транзакция с уровнем изоляции READ COMMITTED.

Меня ещё интересует, судя по скрину, сканируется 10 млн? Т.е. скуль перебирает 10 млн?

Estimate это сколько он "прикинул" что прийдётся читать
15 апр 19, 17:17    [21862840]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по плану выполнения запроса. Сколько будет заблокировано строк?  [new]
leonix
Member

Откуда:
Сообщений: 357
TaPaK,
а по факту сколько просканировал?
Я подозреваю что все 10 млн, но как в этом убедиться?
15 апр 19, 17:17    [21862845]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по плану выполнения запроса. Сколько будет заблокировано строк?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 28205
leonix
а по факту сколько просканировал?
Я подозреваю что все 10 млн, но как в этом убедиться?
Смотреть не оценку плана выполнения, а реальный план выполнения.
15 апр 19, 17:20    [21862847]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по плану выполнения запроса. Сколько будет заблокировано строк?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6156
leonix
TaPaK,
а по факту сколько просканировал?
Я подозреваю что все 10 млн, но как в этом убедиться?

по факту этот блок вообще не выполянлся ни разу
15 апр 19, 17:22    [21862852]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по плану выполнения запроса. Сколько будет заблокировано строк?  [new]
leonix
Member

Откуда:
Сообщений: 357
alexeyvg
leonix
а по факту сколько просканировал?
Я подозреваю что все 10 млн, но как в этом убедиться?
Смотреть не оценку плана выполнения, а реальный план выполнения.


Спасибо! Сейчас попробуй.
15 апр 19, 17:22    [21862853]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по плану выполнения запроса. Сколько будет заблокировано строк?  [new]
msLex
Member

Откуда:
Сообщений: 5958
TaPaK
msLex,

ну ещё REPEATABLE READ

хотя NOLOCK ничего деражать "после" не будет


Да, конечно REPEATABLE READ оставляет блокировки по выбранным данным.

Я хотел описать ситуацию как у ТС, селект перебрав 10 млн строк не возвращает данные, но забыл указать этот пункт.
А с учетом того, что у ТС не 1 таблица (как мне показалось вначале), а несколько, то и в этом случае REPEATABLE READ может оставить блокировки, если фильтрация произошла не при вычитки из объекта, а позже, например фильтрация по данным другой таблицы.
15 апр 19, 17:22    [21862854]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по плану выполнения запроса. Сколько будет заблокировано строк?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 6367
Хм, ну что-то он должен был прочитать, чтобы убедиться, что данных нет на первой же странице. Если там только не констрейнт помог.
15 апр 19, 17:25    [21862859]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по плану выполнения запроса. Сколько будет заблокировано строк?  [new]
msLex
Member

Откуда:
Сообщений: 5958
Владислав Колосов
Хм, ну что-то он должен был прочитать, чтобы убедиться, что данных нет на первой же странице. Если там только не констрейнт помог.

там может быть все, что угодно

скан внутри nested loop, который не выполнился ни разу
стартап предикат
15 апр 19, 17:29    [21862862]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по плану выполнения запроса. Сколько будет заблокировано строк?  [new]
leonix
Member

Откуда:
Сообщений: 357
Вот факт получил.
Теперь интересует блокирует 10 млн или нет?

К сообщению приложен файл. Размер - 12Kb
15 апр 19, 17:29    [21862863]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по плану выполнения запроса. Сколько будет заблокировано строк?  [new]
msLex
Member

Откуда:
Сообщений: 5958
leonix
Вот факт получил.
Теперь интересует блокирует 10 млн или нет?

Картинка с другого сайта.


вам же уже сказали, nolock (AKA readuncommitted) не накладывает блокировок на уровне строк


будут блокировки на уровне таблицы в insert, но, какие - вопрос
15 апр 19, 17:32    [21862865]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по плану выполнения запроса. Сколько будет заблокировано строк?  [new]
leonix
Member

Откуда:
Сообщений: 357
На просторах интернета нарыл вот такую таблицу. Не знаю, насколько ей можно доверять.
Мой случай выделил.

К сообщению приложен файл. Размер - 35Kb
15 апр 19, 17:37    [21862872]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по плану выполнения запроса. Сколько будет заблокировано строк?  [new]
Konst_One
Member

Откуда:
Сообщений: 11155
https://docs.microsoft.com/ru-ru/sql/t-sql/language-elements/transactions-transact-sql?view=sql-server-2017
15 апр 19, 17:38    [21862874]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по плану выполнения запроса. Сколько будет заблокировано строк?  [new]
leonix
Member

Откуда:
Сообщений: 357
Если у меня сканируется вся таблица (там всего 10 млн.), то на всю таблицу накладывается S блокировка.
То при попытке другого запроса наложить X хотябы на одну запись у меня будет блокировка.
Я правильно понимаю, если верить этой табличке?
15 апр 19, 17:38    [21862876]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по плану выполнения запроса. Сколько будет заблокировано строк?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36105
leonix
Мой случай выделил.

NOLOCK -- это не READ COMMITTED.
15 апр 19, 17:39    [21862877]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по плану выполнения запроса. Сколько будет заблокировано строк?  [new]
Konst_One
Member

Откуда:
Сообщений: 11155
я не вижу у вас begin tran
15 апр 19, 17:40    [21862878]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по плану выполнения запроса. Сколько будет заблокировано строк?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6156
leonix
На просторах интернета нарыл вот такую таблицу. Не знаю, насколько ей можно доверять.
Мой случай выделил.

это вам так хочется? Прочитайте что делает NOLOCK
15 апр 19, 17:43    [21862879]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по плану выполнения запроса. Сколько будет заблокировано строк?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 28205
leonix
На просторах интернета нарыл вот такую таблицу. Не знаю, насколько ей можно доверять.
Мой случай выделил.

Картинка с другого сайта.
Ваш случай самый первый
15 апр 19, 17:52    [21862883]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по плану выполнения запроса. Сколько будет заблокировано строк?  [new]
leonix
Member

Откуда:
Сообщений: 357
alexeyvg
leonix
На просторах интернета нарыл вот такую таблицу. Не знаю, насколько ей можно доверять.
Мой случай выделил.

Картинка с другого сайта.
Ваш случай самый первый


У меня в транзакции.
Это в проведении документа. Проведение в транзакции.
Режим управления блокировками Управляемый.
Как определить какой у меня уровень изоляции? В профайлере?
15 апр 19, 19:59    [21862965]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по плану выполнения запроса. Сколько будет заблокировано строк?  [new]
msLex
Member

Откуда:
Сообщений: 5958
leonix
alexeyvg
пропущено...
Ваш случай самый первый


У меня в транзакции.
Это в проведении документа. Проведение в транзакции.
Режим управления блокировками Управляемый.
Как определить какой у меня уровень изоляции? В профайлере?


nolock - это синоним read uncommited
15 апр 19, 20:20    [21862974]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по плану выполнения запроса. Сколько будет заблокировано строк?  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 999
leonix
alexeyvg
пропущено...
Ваш случай самый первый


У меня в транзакции.
Это в проведении документа. Проведение в транзакции.
Режим управления блокировками Управляемый.
Как определить какой у меня уровень изоляции? В профайлере?


мама дорогая, вам уже несколько раз повторили у вас в запросе использовано явное хинтование
FROM dbo._AccumRg34172 T2 WITH(NOLOCK)
у всех таблиц табличное указание read uncommitted уровня изоляции, в таком случае у вас для чтения из этих таблиц поведение будет как на уровне изоляции read uncommitted, и совершенно пофигу что у вас изначально ваш уровень изоляции read committed


set transaction isolation level READ COMMITTED;
select * from [dbo].[table] with(nolock);

эквивалентно
set transaction isolation level READ UNCOMMITTED;
select * from [dbo].[table];


поэтому совмещаемых блокировок на уровне строк для ваших читаемых таблиц накладываться не будет. будут только блокировки sch-S на уровне таблиц.

вот если у вас в запросе на уровне изоляции read committed к примеру будет инструкция
set transaction isolation level read committed;
select * 
from [dbo].[table1] t1 with(nolock) 
    join [dbo].[table2] t2 on t2.[id] = t1.[id]


то table1 будет читаться без блокировки строк, а вот на строки table2 S-блокировки строк будут запрошены, также будут наложены IS на уровне страниц и объекта. (или еще возможна эскалация)
15 апр 19, 20:23    [21862978]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по плану выполнения запроса. Сколько будет заблокировано строк?  [new]
leonix
Member

Откуда:
Сообщений: 357
У меня на этой таблице блокировок много.
Тогда получается, что если одна транзакция меняет хотябы одну строку в этой таблице, т.е. наложила x блокировку, то этот запрос не сможет выполниться, т.к. он пытается наложить s блокировку на все 10 млн. записей. Отсюда постоянные блокировки.
Я правильно понял?
15 апр 19, 21:37    [21863024]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по плану выполнения запроса. Сколько будет заблокировано строк?  [new]
leonix
Member

Откуда:
Сообщений: 357
leonix
У меня на этой таблице блокировок много.
Тогда получается, что если одна транзакция меняет хотябы одну строку в этой таблице, т.е. наложила x блокировку, то этот запрос не сможет выполниться, т.к. он пытается наложить s блокировку на все 10 млн. записей. Отсюда постоянные блокировки.
Я правильно понял?

Не, блокировки не будет.

Всем спасибо! Пойду искать где блокировки возникают.
15 апр 19, 21:57    [21863036]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по плану выполнения запроса. Сколько будет заблокировано строк?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 28205
leonix
Всем спасибо! Пойду искать где блокировки возникают.
Так вы гадаете, глядя на запросы?
Не проще просто посмотреть? Например, sp_WhoIsActive
16 апр 19, 01:35    [21863132]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / Microsoft SQL Server Ответить