У меня есть хранимая процедура, которая является частью процесса импорта хранилища данных. Данные уже находятся в промежуточной таблице. Хранимая процедура очень проста. Он объединяет «плоские» данные из промежуточной таблицы с соответствующими идентификаторами измерений, а затем создает INSERT INTO
таблицу фактов.
Сам запрос занимает около 1 минуты 20 секунд. Я проанализировал план запроса, и он использует правильные индексы и т. Д. Я не думаю, что смогу оптимизировать это дальше, и минута для строк по 10 тыс. Подходит (этот процесс выполняется только раз в неделю ночью).
Хранимая процедура выглядит следующим образом:
INSERT INTO Labour_F
(
ID,
PostingDate,
Job_ID,
ResourceGroup_ID,
Resource_ID,
Section_ID,
WorkType_ID,
EntryNumber,
QuantityInHours,
RatePerHour,
TotalCostEuro
)
SELECT
NEXT VALUE FOR labour_fact_seq,
Posting_Date,
Job_D.ID,
ResourceGroup_D.ID,
Resource_D.ID,
Section_D.ID,
WorkType_D.ID,
Entry_No,
Quantity,
Unit_Cost,
Total_Cost
FROM
stg_labour T
INNER JOIN
Job_D ON Job_D.JobNumber = T.Job_No
INNER JOIN
ResourceGroup_D ON ResourceGroup_D.Code = T.Resource_Group_No
INNER JOIN
Resource_D ON Resource_D.ResourceNumber = T.No
LEFT OUTER JOIN
Section_D ON Section_D.Code = T.Section
INNER JOIN
WorkType_D ON WorkType_D.Code = T.Work_Type_Code
Проблема в том, что процесс занимает гораздо больше времени (около 6 минут), просто чтобы вставить строки, которые, как я знаю, занимают 1 минуту 20 секунд, чтобы получить. В конце я получаю ошибку:
Произошла ошибка транспортного уровня при получении результатов с сервера. (поставщик: поставщик TCP, ошибка: 0 - указанное сетевое имя больше не доступно.)
База данных представляет собой Azure SQL Server. Как я могу понять, что происходит?
UPDATE
Интересно, что я попытался пакетировать обновление, как предложено здесь:
https://www.mssqltips.com/sqlservertip/5636/optimize-large-sql-server-insert-update-and-delete-processes-by-using-batches/
Я установил размер партии на 1000. И весь процесс был завершен за 1 минуту 20 секунд. Практически время для запроса данных и выполнения объединений.
Мне все равно было бы интересно узнать, почему я столкнулся с этой проблемой. Мне нужно было вставить всего около 10 тысяч строк, ничего особенного.