Azure SQL Server `вставка в` хранимую процедуру длиной около 10 тыс. Строк отключается с ошибкой транспортного уровня - PullRequest
0 голосов
/ 02 июля 2019

У меня есть хранимая процедура, которая является частью процесса импорта хранилища данных. Данные уже находятся в промежуточной таблице. Хранимая процедура очень проста. Он объединяет «плоские» данные из промежуточной таблицы с соответствующими идентификаторами измерений, а затем создает 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 тысяч строк, ничего особенного.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...