RSS Подписка на статьи RSS Подписка на комментарии Панель инструментов

Блог профессионалов стал частью сайта технической поддержки DocsVision http://support.docsvision.com. Новые материалы будут появляться уже на этом сайте.

Поиск

Ярлыки

авто генерация кода (1) Администрирование DocsVision (60) Атрибутивный поиск (3) База данных (24) Базы знаний (1) Безопасность (1) Бизнес-процессы (20) Блог (2) Вы увидите это первыми (1) Групповые политики (1) Диаграммы (2) Задания (2) Интеграция (2) Карточки DocsVision (14) Конструктор Решений (11) Маркетинг и продажи (4) Навигатор (3) Новое (3) Новости (32) Опрос (4) Опросы DocsVision (4) Оптимизация (3) Отчеты (2) Ошибки (1) Поддержка (14) Полезные ссылки (1) Представления (4) Производительность (5) Разбор полетов (18) Разработка для Workflow (7) разработка карточек (2) Разработка на платформе DocsVision (41) Разработка решений (43) Расширение платформы (1) Расширенные отчеты (9) Решения на платформе DocsVision (6) Сервисы DocsVision (3) Сканеры (3) Справочник сотрудников (1) Справочник типов (1) Установка (1) Утилиты (13) Шлюз в SharePoint (8) Штрихкод (2) Cкрипты карточек (7) DocsVision внутри (1) DocsVision Live (1) FileStream (1) FireFox (2) Opera (1) Powershell (5) Safari (1) SharePoint2007 (1) SharePoint2010 (2) Silverlight (1) UltraViews (1) Vista (1)

Причина ошибки Timeout Expiried при загрузке файла. Часть 2.

Начало данной темы было положено исследованиями http://dvprofessionals.blogspot.com/2009/03/timeout-expired-sql-server-2008.html. Хочу добавить, что отключение статистики полностью, может снизить производительность.

В последнее время было выявлено еще несколько подобных случаев, причем не только на 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

Обращаю внимание, что проблема еще полностью не изучена. Проверку всегда нужно проводить имея под рукой свежий бекап. Читать дальше

2 коммент.:

alive комментирует...

У меня симптомы именно такие, но все приведенные рекомендации (в том числе и из первой части) не помогли. Зато помогло отключение "auto update statistics" на базе данных в целом (что у нас было отключено и в 2005м SQL).
p.s. sp_autostats включает/выключает авто-обновление (а не сбор) статистики по отдельной таблице.

alive комментирует...

вдогонку - отключение автообновления статистики на производительность влияет, но незначительно - у нас обновление статистики запускается регулярно, по ночам, планом обслуживания. "ведущие собаководы" наоборот рекомендуют отключать автообновление, т.к. оно может запускаться в самое неожиданное, в том числе и рабочее время и сильно снижать производительность.

Отправить комментарий