Причина помилки Timeout Expiried при завантаженні файлу. Частина 2

Початок даної теми було покладено у статті "Причина помилки Timeout expired при завантаженні файлу, база на SQL Server 2008". Хочу додати, що відключення статистики повністю, може знизити продуктивність.

Останнім часом було виявлено ще декілька подібних випадків, причому не тільки на SQL 2008, а і на SQL 2005.

Якщо ви зустрілися з даною помилкою перш за все потрібно визначити чи є збір статистики причиною.

У момент завантаження файлу виконайте процедуру

SELECT
tr.[transaction_id]
, DATEDIFF (minute, tr. [Transaction_begin_time], GETDATE ()) [duration]
,req.[command]
,req.[blocking_session_id]
,txt.[text]
,sess.[host_name]
,sess.[program_name]
,sess.[login_name]
,sess.[login_time]
FROM sys.dm_tran_active_transactions tr
JOIN sys.dm_exec_requests req ON req. [Transaction_id] = tr. [Transaction_id] JOIN sys.dm_exec_sessions sess ON sess. [Session_id] = req. [Session_id] OUTER APPLY sys.dm_exec_sql_text (req. [sql_handle]) txt WHERE
req.[session_id] > 50
AND tr. [Transaction_begin_time] <DATEADD (minute, -1, GETDATE ()) ORDER BY [duration] DESC

яка повертає тривалі транзакції. Потрібно викликати до тих пір, поки не буде повернений результат

Якщо в резуальтате запиту буде рядок
SELECT StatMan ([SC0], [SB0000]) FROM (SELECT TOP 100 PERCENT [SC0], step_direction ([SC0]) over (order by NULL) AS [SB0000] FROM (SELECT CONVERT ([varbinary] (200), SUBSTRING ([Data], 1, 100) + + substring ([Data], case when LEN([Data])<=200 then 101

Отже збір статистики включений.

У першу чергу потрібно відключити збір статистики на конкретній таблиці:
EXEC sp_autostats “dbo.dvsys_binaries”, “OFF”

Якщо відключення не допомогло, то виконайте запит для видалення зібраної статистичної інформації.

DECLARE @Cmd nvarchar(4000)
DECLARE @ObjectName sysname
DECLARE @StatName sysname

SET @ObjectName = “[dbo].[dvsys_binaries]”

DECLARE StatCursor CURSOR FAST_FORWARD FOR
SELECT name
FROM sys.stats
WHERE
object_id = OBJECT_ID(@ObjectName)
AND auto_created = 1

OPEN StatCursor
FETCH NEXT FROM StatCursor INTO @StatName

WHILE (@@FETCH_STATUS = 0)
BEGIN
SET @ Cmd = N "DROP STATISTICS" + @ ObjectName + N ". [" + @ StatName + N "]"
EXEC [dbo].[sp_executesql] @Cmd

FETCH NEXT FROM StatCursor INTO @StatName END

CLOSE StatCursor
DEALLOCATE StatCursor

І наступний запит

DECLARE @Rtn int
DECLARE @Cmd nvarchar(4000)
DECLARE @ObjectName sysname
DECLARE @StatName sysname

SELECT
@ObjectName = “dbo.dvsys_binaries”
,@Rtn = 0

DECLARE StatCursor CURSOR FAST_FORWARD FOR
SELECT name
FROM sys.stats
WHERE
object_id = OBJECT_ID(@ObjectName)
AND auto_created = 1

OPEN StatCursor
FETCH NEXT FROM StatCursor INTO @StatName

WHILE (@@FETCH_STATUS = 0)
BEGIN
SET @ Cmd = N "UPDATE STATISTICS" + @ ObjectName + N "(" + @ StatName + N ") WITH SAMPLE 0 ROWS, NORECOMPUTE"

PRINT “Updating statistics ” + @StatName

EXEC @Rtn = [dbo].[sp_executesql] @Cmd

IF @Rtn <> 0 BREAK

FETCH NEXT FROM StatCursor INTO @StatName
END

CLOSE StatCursor
DEALLOCATE StatCursor

IF @Rtn <> 0
BEGIN
RAISERROR(“Unable to update statistics, error: %d”, 10, 1, @Rtn)
END

Звертаю увагу, що проблема ще повністю не вивчена. Перевірку завжди потрібно проводити маючи під рукою свіжий бекап.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*