|
Долгий INSERT | ☑ | ||
---|---|---|---|---|
0
VitShvets
31.05.19
✎
20:13
|
Куда хоть посмотреть? Всю голову сломал...
Есть 1Совая база, обычные формы - старая КА. Есть робот загрузки из внешней системы заказов и договоров контрагентов. Логика прямая, как рельс, вся обвязка работает шустро. Замер производительности показывает одинаковое время на Договор.Записать() и Заказ.Записать(Провести). Не может такого быть, т.к. при записи заказа пишется как минимум 3 таблицы(шапка и ТЧ), да плюс проведение по нескольким регистрам. Стал копать в сторону SQL, поймал профайлером insert, duration прыгает от 80-90 до 200-300 при вставке 1 записи. В менеджмент студии тот-же запрос, duration от 3 до 5. Запрос вида: exec sp_executesql N'INSERT INTO dbo._Reference87 (_IDRRef,_Marked,_IsMetadata,_OwnerIDRRef,_Code... Тригеров нет, констрейнтов нет, таблица типовая 1Совая, создана 1С. |
|||
1
H A D G E H O G s
31.05.19
✎
20:18
|
(0) Собери xml план запроса и запость сюда скриншот.
|
|||
2
leonidkorolev
31.05.19
✎
20:46
|
(0) Ожидание на блокировке может быть. 1с позволяет 20 сек ждать
|
|||
3
VitShvets
03.06.19
✎
13:57
|
(1) А есть смысл? Могу конечно выложить если нужно, но там план запроса "очень интересный" :) Собственно состоит из единственного блока "Clustered Index Insert", Cost:100%, кусок плана:
<RelOp NodeId="0" PhysicalOp="Clustered Index Insert" LogicalOp="Insert" EstimateRows="1" EstimateIO="0.07" EstimateCPU="7e-006" AvgRowSize="9" EstimatedTotalSubtreeCost="0.0700083" Parallel="0" EstimateRebinds="0" EstimateRewinds="0" EstimatedExecutionMode="Row"> (2) Были такие подозрения. Надо только нагуглить как блокировки по-ловить... |
|||
4
mistеr
03.06.19
✎
14:01
|
(0) Нужно смотреть статистику выполнения этих запросов.
|
|||
5
leonidkorolev
03.06.19
✎
14:06
|
(3)Погугли на тему sp_whoisactive.
|
|||
6
VitShvets
03.06.19
✎
14:08
|
(4) гм... В смысле?
(5) Спасибо большое! |
|||
7
mistеr
03.06.19
✎
14:24
|
||||
8
VitShvets
03.06.19
✎
20:59
|
(7) Спасибо! Посмотрел статистику, нашел много "вхождений" справочника, но там всё LEFT OUTER JOIN WITH(NOLOCK) по _IDRRef, что входит в кластерный индекс. По крайней мере самые длинные. Не должно быть там блокировок и/или ожидания. Или я не на то смотрю?
(5) Выдаёт (51ms)PAGEIOLATCH_EX:DBName:1(*). Гугл говорит о "проблемах с диском", что ооочень врятли, т.к. во первых база лежит на лютом дисковом массиве, ну и во вторых, с другими таблицами такого поведения не наблюдал. |
|||
9
leonidkorolev
03.06.19
✎
21:45
|
(8) Скорей всего так и есть, диски не справляются.
Надо наблюдать что параллельно с этим запросом выполняется. В том же списке должно быть. Ещё можно вцелом посмотреть на ожидания в системе. Вот запрос. Надо его выполнить и результаты сюда. Посмотрим ожидания в системе. WITH [Waits] AS (SELECT [wait_type], [wait_time_ms] / 1000.0 AS [WaitS], ([wait_time_ms] - [signal_wait_time_ms]) / 1000.0 AS [ResourceS], [signal_wait_time_ms] / 1000.0 AS [SignalS], [waiting_tasks_count] AS [WaitCount], 100.0 * [wait_time_ms] / SUM ([wait_time_ms]) OVER() AS [Percentage], ROW_NUMBER() OVER(ORDER BY [wait_time_ms] DESC) AS [RowNum] FROM sys.dm_os_wait_stats WHERE [wait_type] NOT IN ( -- These wait types are almost 100% never a problem and so they are -- filtered out to avoid them skewing the results. Click on the URL -- for more information. N'BROKER_EVENTHANDLER', -- https://www.sqlskills.com/help/waits/BROKER_EVENTHANDLER N'BROKER_RECEIVE_WAITFOR', -- https://www.sqlskills.com/help/waits/BROKER_RECEIVE_WAITFOR N'BROKER_TASK_STOP', -- https://www.sqlskills.com/help/waits/BROKER_TASK_STOP N'BROKER_TO_FLUSH', -- https://www.sqlskills.com/help/waits/BROKER_TO_FLUSH N'BROKER_TRANSMITTER', -- https://www.sqlskills.com/help/waits/BROKER_TRANSMITTER N'CHECKPOINT_QUEUE', -- https://www.sqlskills.com/help/waits/CHECKPOINT_QUEUE N'CHKPT', -- https://www.sqlskills.com/help/waits/CHKPT N'CLR_AUTO_EVENT', -- https://www.sqlskills.com/help/waits/CLR_AUTO_EVENT N'CLR_MANUAL_EVENT', -- https://www.sqlskills.com/help/waits/CLR_MANUAL_EVENT N'CLR_SEMAPHORE', -- https://www.sqlskills.com/help/waits/CLR_SEMAPHORE N'CXCONSUMER', -- https://www.sqlskills.com/help/waits/CXCONSUMER -- Maybe comment these four out if you have mirroring issues N'DBMIRROR_DBM_EVENT', -- https://www.sqlskills.com/help/waits/DBMIRROR_DBM_EVENT N'DBMIRROR_EVENTS_QUEUE', -- https://www.sqlskills.com/help/waits/DBMIRROR_EVENTS_QUEUE N'DBMIRROR_WORKER_QUEUE', -- https://www.sqlskills.com/help/waits/DBMIRROR_WORKER_QUEUE N'DBMIRRORING_CMD', -- https://www.sqlskills.com/help/waits/DBMIRRORING_CMD N'DIRTY_PAGE_POLL', -- https://www.sqlskills.com/help/waits/DIRTY_PAGE_POLL N'DISPATCHER_QUEUE_SEMAPHORE', -- https://www.sqlskills.com/help/waits/DISPATCHER_QUEUE_SEMAPHORE N'EXECSYNC', -- https://www.sqlskills.com/help/waits/EXECSYNC N'FSAGENT', -- https://www.sqlskills.com/help/waits/FSAGENT N'FT_IFTS_SCHEDULER_IDLE_WAIT', -- https://www.sqlskills.com/help/waits/FT_IFTS_SCHEDULER_IDLE_WAIT N'FT_IFTSHC_MUTEX', -- https://www.sqlskills.com/help/waits/FT_IFTSHC_MUTEX -- Maybe comment these six out if you have AG issues N'HADR_CLUSAPI_CALL', -- https://www.sqlskills.com/help/waits/HADR_CLUSAPI_CALL N'HADR_FILESTREAM_IOMGR_IOCOMPLETION', -- https://www.sqlskills.com/help/waits/HADR_FILESTREAM_IOMGR_IOCOMPLETION N'HADR_LOGCAPTURE_WAIT', -- https://www.sqlskills.com/help/waits/HADR_LOGCAPTURE_WAIT N'HADR_NOTIFICATION_DEQUEUE', -- https://www.sqlskills.com/help/waits/HADR_NOTIFICATION_DEQUEUE N'HADR_TIMER_TASK', -- https://www.sqlskills.com/help/waits/HADR_TIMER_TASK N'HADR_WORK_QUEUE', -- https://www.sqlskills.com/help/waits/HADR_WORK_QUEUE N'KSOURCE_WAKEUP', -- https://www.sqlskills.com/help/waits/KSOURCE_WAKEUP N'LAZYWRITER_SLEEP', -- https://www.sqlskills.com/help/waits/LAZYWRITER_SLEEP N'LOGMGR_QUEUE', -- https://www.sqlskills.com/help/waits/LOGMGR_QUEUE N'MEMORY_ALLOCATION_EXT', -- https://www.sqlskills.com/help/waits/MEMORY_ALLOCATION_EXT N'ONDEMAND_TASK_QUEUE', -- https://www.sqlskills.com/help/waits/ONDEMAND_TASK_QUEUE N'PARALLEL_REDO_DRAIN_WORKER', -- https://www.sqlskills.com/help/waits/PARALLEL_REDO_DRAIN_WORKER N'PARALLEL_REDO_LOG_CACHE', -- https://www.sqlskills.com/help/waits/PARALLEL_REDO_LOG_CACHE N'PARALLEL_REDO_TRAN_LIST', -- https://www.sqlskills.com/help/waits/PARALLEL_REDO_TRAN_LIST N'PARALLEL_REDO_WORKER_SYNC', -- https://www.sqlskills.com/help/waits/PARALLEL_REDO_WORKER_SYNC N'PARALLEL_REDO_WORKER_WAIT_WORK', -- https://www.sqlskills.com/help/waits/PARALLEL_REDO_WORKER_WAIT_WORK N'PREEMPTIVE_OS_FLUSHFILEBUFFERS', -- https://www.sqlskills.com/help/waits/PREEMPTIVE_OS_FLUSHFILEBUFFERS N'PREEMPTIVE_XE_GETTARGETSTATE', -- https://www.sqlskills.com/help/waits/PREEMPTIVE_XE_GETTARGETSTATE N'PWAIT_ALL_COMPONENTS_INITIALIZED', -- https://www.sqlskills.com/help/waits/PWAIT_ALL_COMPONENTS_INITIALIZED N'PWAIT_DIRECTLOGCONSUMER_GETNEXT', -- https://www.sqlskills.com/help/waits/PWAIT_DIRECTLOGCONSUMER_GETNEXT N'QDS_PERSIST_TASK_MAIN_LOOP_SLEEP', -- https://www.sqlskills.com/help/waits/QDS_PERSIST_TASK_MAIN_LOOP_SLEEP N'QDS_ASYNC_QUEUE', -- https://www.sqlskills.com/help/waits/QDS_ASYNC_QUEUE N'QDS_CLEANUP_STALE_QUERIES_TASK_MAIN_LOOP_SLEEP', -- https://www.sqlskills.com/help/waits/QDS_CLEANUP_STALE_QUERIES_TASK_MAIN_LOOP_SLEEP N'QDS_SHUTDOWN_QUEUE', -- https://www.sqlskills.com/help/waits/QDS_SHUTDOWN_QUEUE N'REDO_THREAD_PENDING_WORK', -- https://www.sqlskills.com/help/waits/REDO_THREAD_PENDING_WORK N'REQUEST_FOR_DEADLOCK_SEARCH', -- https://www.sqlskills.com/help/waits/REQUEST_FOR_DEADLOCK_SEARCH N'RESOURCE_QUEUE', -- https://www.sqlskills.com/help/waits/RESOURCE_QUEUE N'SERVER_IDLE_CHECK', -- https://www.sqlskills.com/help/waits/SERVER_IDLE_CHECK N'SLEEP_BPOOL_FLUSH', -- https://www.sqlskills.com/help/waits/SLEEP_BPOOL_FLUSH N'SLEEP_DBSTARTUP', -- https://www.sqlskills.com/help/waits/SLEEP_DBSTARTUP N'SLEEP_DCOMSTARTUP', -- https://www.sqlskills.com/help/waits/SLEEP_DCOMSTARTUP N'SLEEP_MASTERDBREADY', -- https://www.sqlskills.com/help/waits/SLEEP_MASTERDBREADY N'SLEEP_MASTERMDREADY', -- https://www.sqlskills.com/help/waits/SLEEP_MASTERMDREADY N'SLEEP_MASTERUPGRADED', -- https://www.sqlskills.com/help/waits/SLEEP_MASTERUPGRADED N'SLEEP_MSDBSTARTUP', -- https://www.sqlskills.com/help/waits/SLEEP_MSDBSTARTUP N'SLEEP_SYSTEMTASK', -- https://www.sqlskills.com/help/waits/SLEEP_SYSTEMTASK N'SLEEP_TASK', -- https://www.sqlskills.com/help/waits/SLEEP_TASK N'SLEEP_TEMPDBSTARTUP', -- https://www.sqlskills.com/help/waits/SLEEP_TEMPDBSTARTUP N'SNI_HTTP_ACCEPT', -- https://www.sqlskills.com/help/waits/SNI_HTTP_ACCEPT N'SOS_WORK_DISPATCHER', -- https://www.sqlskills.com/help/waits/SOS_WORK_DISPATCHER N'SP_SERVER_DIAGNOSTICS_SLEEP', -- https://www.sqlskills.com/help/waits/SP_SERVER_DIAGNOSTICS_SLEEP N'SQLTRACE_BUFFER_FLUSH', -- https://www.sqlskills.com/help/waits/SQLTRACE_BUFFER_FLUSH N'SQLTRACE_INCREMENTAL_FLUSH_SLEEP', -- https://www.sqlskills.com/help/waits/SQLTRACE_INCREMENTAL_FLUSH_SLEEP N'SQLTRACE_WAIT_ENTRIES', -- https://www.sqlskills.com/help/waits/SQLTRACE_WAIT_ENTRIES N'VDI_CLIENT_OTHER', -- https://www.sqlskills.com/help/waits/VDI_CLIENT_OTHER N'WAIT_FOR_RESULTS', -- https://www.sqlskills.com/help/waits/WAIT_FOR_RESULTS N'WAITFOR', -- https://www.sqlskills.com/help/waits/WAITFOR N'WAITFOR_TASKSHUTDOWN', -- https://www.sqlskills.com/help/waits/WAITFOR_TASKSHUTDOWN N'WAIT_XTP_RECOVERY', -- https://www.sqlskills.com/help/waits/WAIT_XTP_RECOVERY N'WAIT_XTP_HOST_WAIT', -- https://www.sqlskills.com/help/waits/WAIT_XTP_HOST_WAIT N'WAIT_XTP_OFFLINE_CKPT_NEW_LOG', -- https://www.sqlskills.com/help/waits/WAIT_XTP_OFFLINE_CKPT_NEW_LOG N'WAIT_XTP_CKPT_CLOSE', -- https://www.sqlskills.com/help/waits/WAIT_XTP_CKPT_CLOSE N'XE_DISPATCHER_JOIN', -- https://www.sqlskills.com/help/waits/XE_DISPATCHER_JOIN N'XE_DISPATCHER_WAIT', -- https://www.sqlskills.com/help/waits/XE_DISPATCHER_WAIT N'XE_TIMER_EVENT' -- https://www.sqlskills.com/help/waits/XE_TIMER_EVENT ) AND [waiting_tasks_count] > 0 ) SELECT MAX ([W1].[wait_type]) AS [WaitType], CAST (MAX ([W1].[WaitS]) AS DECIMAL (16,2)) AS [Wait_S], CAST (MAX ([W1].[ResourceS]) AS DECIMAL (16,2)) AS [Resource_S], CAST (MAX ([W1].[SignalS]) AS DECIMAL (16,2)) AS [Signal_S], MAX ([W1].[WaitCount]) AS [WaitCount], CAST (MAX ([W1].[Percentage]) AS DECIMAL (5,2)) AS [Percentage], CAST ((MAX ([W1].[WaitS]) / MAX ([W1].[WaitCount])) AS DECIMAL (16,4)) AS [AvgWait_S], CAST ((MAX ([W1].[ResourceS]) / MAX ([W1].[WaitCount])) AS DECIMAL (16,4)) AS [AvgRes_S], CAST ((MAX ([W1].[SignalS]) / MAX ([W1].[WaitCount])) AS DECIMAL (16,4)) AS [AvgSig_S], CAST ('https://www.sqlskills.com/help/waits/' + MAX ([W1].[wait_type]) as XML) AS [Help/Info URL] FROM [Waits] AS [W1] INNER JOIN [Waits] AS [W2] ON [W2].[RowNum] <= [W1].[RowNum] GROUP BY [W1].[RowNum] HAVING SUM ([W2].[Percentage]) - MAX( [W1].[Percentage] ) < 95; -- percentage threshold GO |
|||
10
mistеr
04.06.19
✎
09:14
|
(8) Нужно найти твой долгий insert и *анализировать* его статистику.
|
|||
11
VitShvets
04.06.19
✎
14:32
|
(9) https://pastenow.ru/b26ed8f9c7d3fa6b193d2352a922e7f8
(10) Что это означает? Слово *анализировать* понятно, не понятно на что именно смотреть, на что обратить внимание. |
|||
12
leonidkorolev
04.06.19
✎
16:31
|
(11) Ну вот видишь картинка то не радостная. Диски не справляются.
С момента перезапуска скуля было 7 млн. ожиданий ввода вывода на 22 часа вроде. Настораживает ожидание cxpacket. Это ожидание параллельного потока одного и того же запроса. Проверь параметр базы max degree of parallelism у сервера. У 1Сной базы должно быть 1. |
|||
13
leonidkorolev
04.06.19
✎
16:39
|
(11) "Слово *анализировать* понятно, не понятно на что именно смотреть, на что обратить внимание"
Например то же самый параллелизм можно в плане увидеть. Из-за него могут быть тормоза |
|||
14
Вафель
04.06.19
✎
16:48
|
скорее всего очередь на диске.
|
|||
15
Вафель
04.06.19
✎
16:49
|
ибо более тупого запроса придумать сложно
|
|||
16
VitShvets
06.06.19
✎
16:50
|
(12)(13) Degree of parallelism действительно не 1, а 0, но перевод дал небольшой прирост производительности в своё время... Попробую вернуть в 1, леший его знает что оптимизатору глючится...
(14) Нет очереди - ресурс монитор показывает длину от 0.5 до 2.5, в среднем 1.5. (15) В этом то и засада. Лыжи не едут, мысли разные в голову приходят. |
|||
17
leonidkorolev
06.06.19
✎
21:50
|
(16) "Нет очереди"
Это и есть очередь -> "0.5 до 2.5, в среднем 1.5" Очередь должна быть 0, т.е. её не должно быть. Надо выяснить кто так загружает диск. Если скуль, то почему так часто обращается к диску. Данные должны быть в кэше. Надо смотреть счетчики "4. Cache Hit Ratio Этот счетчик среди объектов SQL Server: Cache Manager показывает, может ли SQL Server размещать полностью планы исполнения запросов в кэше процедур. В идеале, это значение должно всегда быть выше 85 процентов. Если Вы наблюдаете снижение среднего значения этого счётчика, рассмотрите возможность добавление ОЗУ или оптимизации ваших запросов. [В начало] 3. Buffer Cache Hit Ratio Счетчик Buffer Cache Hit Ratio среди объектов SQL Server: Buffer Manager показывает, насколько полно SQL Server может разместить данные в буфере кэша. Чем выше это значение, тем лучше, т.к. для эффективного обращения SQL сервера к страницам данных, они должны находиться в буфере кэша, и операции физического ввода-вывода (I/O) должны отсутствовать. Если Вы наблюдаете устойчивое снижение среднего значения этого счётчика, рассмотрите возможность добавление ОЗУ." https://www.sql.ru/articles/mssql/02111903performancecounters.shtml |
|||
18
mistеr
06.06.19
✎
22:47
|
(11) Ты покажи для начала эту статистику, вместе с запросом, разумеется. А мы поcмотрим, на что обратить внимание.
(12) Как ты определил, что "диски не справляются"? При параллелизме дисковая активность это нормально, т.к. данные идут с диска, а не из кэша. В этом смысл параллелизма. Другой вопрос, оправдан ли параллелизм в данном случае или лучше будет без него. Мы не знаем. Если говорить об исходной проблеме (медленный INSERT), то параллелизма там нет. Хотя косвенное влияние может быть, т.к. нагрузка на диск растет. >У 1Сной базы должно быть 1 Кто сказал? Меня вот смущает ASYNC_IO_COMPLETION со средним временем ожидания > 7 мин. Может проблемы с физ. дисками? |
|||
19
leonidkorolev
06.06.19
✎
22:54
|
(18) "Меня вот смущает ASYNC_IO_COMPLETION со средним временем ожидания > 7 мин."
Ну их было то 15 случаев. Ну антивирь там шуршал в это время. И миллионы других ожиданий. |
|||
20
leonidkorolev
06.06.19
✎
22:59
|
(19) "Кто сказал?"
Я своими глазами видел в Show Live Execution Plan тормозящие минутами параллельные запросы от 1С которые должны были выполниться моментально. Я использую maxdop, но только под контролем например так ALTER INDEX [_InfoRg38173_ByDims_RSS] ON [dbo].[_InfoRg38173] REBUILD with (maxdop=0) и ещё всяко. Но сама 1С не может с ними работать. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |