Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
leonix Member Откуда: Сообщений: 408 |
В результате выполнения ожидаемых строк 10 млн. а по факту 0 строк. (на скрине). Я правильно понимаю по было просканировано 10 млн. строк, т.к. это было в транзакции эти 10 млн. строк заблокированы до окончания транзакции? К сообщению приложен файл. Размер - 11Kb |
15 апр 19, 16:44 [21862796] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8316 |
leonix, зависит от уровня изоляции и типа блокировки. |
15 апр 19, 16:51 [21862809] Ответить | Цитировать Сообщить модератору |
leonix Member Откуда: Сообщений: 408 |
В запросе 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] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
leonix,
ну так и на первую половину вопроса отвечайте |
||
15 апр 19, 17:04 [21862823] Ответить | Цитировать Сообщить модератору |
msLex Member Откуда: Сообщений: 8702 |
leonix 1. У вас локальная временная таблица, зачем вам вообще беспокоиться о блокировках? 2. при nolock накладывается только schema stability блокировка на таблицу, чтобы избежать модификации ее структуры в процессе получения данных. Она будет снята сразу после завершении стейтмента. 3. только при уровне изоляции serializable на объекте могут остаться блокировки после завершения читающего стейтмента |
15 апр 19, 17:09 [21862831] Ответить | Цитировать Сообщить модератору |
msLex Member Откуда: Сообщений: 8702 |
за стеной красного текста не увидел остальные объекты. первый пункт вычеркиваем. |
||
15 апр 19, 17:11 [21862834] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
msLex, ну ещё REPEATABLE READ хотя NOLOCK ничего деражать "после" не будет |
15 апр 19, 17:12 [21862837] Ответить | Цитировать Сообщить модератору |
leonix Member Откуда: Сообщений: 408 |
Насколько я понял идёт длительная транзакция с уровнем изоляции READ COMMITTED. Меня ещё интересует, судя по скрину, сканируется 10 млн? Т.е. скуль перебирает 10 млн? |
15 апр 19, 17:15 [21862838] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
Estimate это сколько он "прикинул" что прийдётся читать |
||
15 апр 19, 17:17 [21862840] Ответить | Цитировать Сообщить модератору |
leonix Member Откуда: Сообщений: 408 |
TaPaK, а по факту сколько просканировал? Я подозреваю что все 10 млн, но как в этом убедиться? |
15 апр 19, 17:17 [21862845] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31779 |
|
||
15 апр 19, 17:20 [21862847] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
по факту этот блок вообще не выполянлся ни разу |
||
15 апр 19, 17:22 [21862852] Ответить | Цитировать Сообщить модератору |
leonix Member Откуда: Сообщений: 408 |
Спасибо! Сейчас попробуй. |
||||
15 апр 19, 17:22 [21862853] Ответить | Цитировать Сообщить модератору |
msLex Member Откуда: Сообщений: 8702 |
Да, конечно REPEATABLE READ оставляет блокировки по выбранным данным. Я хотел описать ситуацию как у ТС, селект перебрав 10 млн строк не возвращает данные, но забыл указать этот пункт. А с учетом того, что у ТС не 1 таблица (как мне показалось вначале), а несколько, то и в этом случае REPEATABLE READ может оставить блокировки, если фильтрация произошла не при вычитки из объекта, а позже, например фильтрация по данным другой таблицы. |
||
15 апр 19, 17:22 [21862854] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8316 |
Хм, ну что-то он должен был прочитать, чтобы убедиться, что данных нет на первой же странице. Если там только не констрейнт помог. |
15 апр 19, 17:25 [21862859] Ответить | Цитировать Сообщить модератору |
msLex Member Откуда: Сообщений: 8702 |
там может быть все, что угодно скан внутри nested loop, который не выполнился ни разу стартап предикат |
||
15 апр 19, 17:29 [21862862] Ответить | Цитировать Сообщить модератору |
leonix Member Откуда: Сообщений: 408 |
Вот факт получил. Теперь интересует блокирует 10 млн или нет? К сообщению приложен файл. Размер - 12Kb |
15 апр 19, 17:29 [21862863] Ответить | Цитировать Сообщить модератору |
msLex Member Откуда: Сообщений: 8702 |
вам же уже сказали, nolock (AKA readuncommitted) не накладывает блокировок на уровне строк будут блокировки на уровне таблицы в insert, но, какие - вопрос |
||
15 апр 19, 17:32 [21862865] Ответить | Цитировать Сообщить модератору |
leonix Member Откуда: Сообщений: 408 |
На просторах интернета нарыл вот такую таблицу. Не знаю, насколько ей можно доверять. Мой случай выделил. К сообщению приложен файл. Размер - 35Kb |
15 апр 19, 17:37 [21862872] Ответить | Цитировать Сообщить модератору |
Konst_One Member Откуда: Сообщений: 11562 |
https://docs.microsoft.com/ru-ru/sql/t-sql/language-elements/transactions-transact-sql?view=sql-server-2017 |
15 апр 19, 17:38 [21862874] Ответить | Цитировать Сообщить модератору |
leonix Member Откуда: Сообщений: 408 |
Если у меня сканируется вся таблица (там всего 10 млн.), то на всю таблицу накладывается S блокировка. То при попытке другого запроса наложить X хотябы на одну запись у меня будет блокировка. Я правильно понимаю, если верить этой табличке? |
15 апр 19, 17:38 [21862876] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37143 |
NOLOCK -- это не READ COMMITTED. |
||
15 апр 19, 17:39 [21862877] Ответить | Цитировать Сообщить модератору |
Konst_One Member Откуда: Сообщений: 11562 |
я не вижу у вас begin tran |
15 апр 19, 17:40 [21862878] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
это вам так хочется? Прочитайте что делает NOLOCK |
||
15 апр 19, 17:43 [21862879] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31779 |
|
||
15 апр 19, 17:52 [21862883] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
Все форумы / Microsoft SQL Server | ![]() |