У меня есть пакет, который загружает данные конфигурации, проанализированные примерно из сотни рабочих книг XLS, с информацией о положении ячеек, типе ячеек, значении ячеек и т. д.
Это очень большая партия, в ней используется несколько временных таблиц,
Поскольку он может начать с существующей конфигурации, необходимо объединить две конфигурации, поэтому некоторые временные таблицы заполняются вне транзакции, а некоторые заполняются в транзакции.
В Oracle 10g пакет выполняется без проблем.
На SQLServer 2008 R2 я испытываю некоторые случайные зависания при 2-3 запросах INSERT
в транзакции. Это происходит не всегда, или, может быть, это происходит с запросом (который обычно выполняется за несколько миллисекунд), но не с другим, с которым это произошло раньше.
Сначала я подумал о взаимоблокировке, но увеличив время ожидания запроса до 3 минут, он наконец выполняется примерно через 2 минуты. Повторяю, эти запросы иногда выполняются за несколько миллисекунд.
Я также указываю, что все запросы выполняются только с параметром ROWLOCK
.
Мониторинг SQL Server профайлером и монитором активности не вижу ничего странного.
ЦП не завис, память есть, чтение на диск около 0, запись на диск 0-200 кб/с не постоянная.
Никто другой не использует эту схему БД.
Я действительно не могу понять, как это решить.
ИЗМЕНИТЬ:
Это один из загадочных запросов
INSERT INTO "LOAD"."META_CELLS_UOM" WITH (ROWLOCK)
("UDA_DOMAIN_ID", "META_DOC_ID", "META_SECT_ID", "META_SET_ID", "UDA_ID", "META_CELL_UROW", "META_CELL_UCOL", "CEM_ID")
SELECT "UDA_DOMAIN_ID", "META_DOC_ID", "META_SECT_ID", "META_SET_ID", "UDA_ID", "META_CELL_UROW", "META_CELL_UCOL", "CEM_ID"
FROM (
SELECT "META_DOCUMENTS"."UDA_DOMAIN_ID", "META_DOCUMENTS"."META_DOC_ID", "META_SECTIONS"."META_SECT_ID", "META_SET_ID", "UDA_ID", "META_CELL_ROW" AS "META_CELL_UROW", "META_CELL_COL" AS "META_CELL_UCOL", "CEM_ID"
FROM "LOAD"."LOADER_CELLS_STEP_1"
INNER JOIN "LOAD"."META_DOCUMENTS" ON ("META_DOCUMENTS"."META_DOC_CODE"="LOADER_CELLS_STEP_1"."META_DOC_CODE")
INNER JOIN "LOAD"."META_SECTIONS" ON ("META_SECTIONS"."META_DOC_ID"="META_DOCUMENTS"."META_DOC_ID") AND ("META_SECTIONS"."META_SECT_NAME"="LOADER_CELLS_STEP_1"."META_SECT_NAME")
INNER JOIN "LOAD"."META_SETS" ON ("META_SETS"."META_SECT_ID"="META_SECTIONS"."META_SECT_ID") AND ("META_SETS"."META_DOC_ID"="META_DOCUMENTS"."META_DOC_ID") AND ("META_SETS"."META_SET_NAME"="LOADER_CELLS_STEP_1"."META_SET_NAME")
INNER JOIN "LOAD"."USER_DEF_ATTRIBUTES" ON ("USER_DEF_ATTRIBUTES"."UDA_NAME"="LOADER_CELLS_STEP_1"."UDA_NAME")
WHERE ("META_CELL_WUOM"=1)
AND ("UDA_TYPE"='MATCH')
) "SELECTION"
WHERE NOT EXISTS (
SELECT *
FROM "LOAD"."META_CELLS_UOM"
WHERE ("SELECTION"."META_SET_ID"="META_CELLS_UOM"."META_SET_ID")
AND ("SELECTION"."UDA_ID"="META_CELLS_UOM"."UDA_ID")
)
Целевая таблица META_CELLS_UOM
пуста, исходная таблица LOADER_CELLS_STEP_1
содержит около 80 000 записей, из которых я выбираю около 3000.
ИЗМЕНИТЬ 2:
Непрерывных запросов нет. Когда программа зависает при выполнении вышеуказанного запроса, это снимок экрана монитора активности SQL Server Mngmt Studio:
RUNNING
. - person Teejay   schedule 13.12.2013CHECKDB
обнаружил 0 ошибок распределения и 0 ошибок согласованности в базе данныхLOAD
, то же самое дляMASTER
. Как посмотреть журнал ошибок? - person Teejay   schedule 13.12.2013Autogrow of file 'LOAD_log' in database 'LOAD' took 116625 milliseconds. Consider using ALTER DATABASE to set a smaller FILEGROWTH for this file.
. Может ли это быть связано с зависанием? - person Teejay   schedule 13.12.2013