Как повысить производительность оператора слияния в SQL server

#sql #sql-server #performance #merge #query-optimization

#sql #sql-сервер #Производительность #слияние #оптимизация запросов

Вопрос:

Я должен выполнить оператор слияния в базе данных SQL Server с приведенным ниже требованием.

 MERGE INTO dbo.cross_charge D
USING
    (
        SELECT
            PROJECT_CODE
            , CROSS_CHARGE_OU
        FROM
            dbo.cross_charge
        WHERE
            PROJECT_CODE = #PROJECT_CODE1
            AND CROSS_CHARGE_OU = #CROSS_CHARGE_OU1
    ) S
ON (
       D.PROJECT_CODE = S.PROJECT_CODE
       AND D.CROSS_CHARGE_OU = S.CROSS_CHARGE_OU
   )
WHEN MATCHED THEN UPDATE SET
                      D.PROJECT_CODE = #PROJECT_CODE3
                      , D.CROSS_CHARGE_OU = #CROSS_CHARGE_OU3
                      , D.CROSS_CHARGE_START = #CROSS_CHARGE_START1
                      , D.CROSS_CHARGE_END = #CROSS_CHARGE_END1
                      , D.IS_Enable = #IS_Enable1
                      , D.UpdatedDate = #UpdatedDate1
WHEN NOT MATCHED THEN INSERT
                          (
                              PROJECT_CODE
                              , CROSS_CHARGE_OU
                              , CROSS_CHARGE_START
                              , CROSS_CHARGE_END
                              , IS_Enable
                              , UpdatedDate
                          )
                      VALUES
                          (
                              #PROJECT_CODE2, #CROSS_CHARGE_OU2, #CROSS_CHARGE_START, #CROSS_CHARGE_END, #IS_Enable, #UpdatedDate
                          )
 

Я должен передать Project_code и cross_charge_ou в качестве входного параметра, и на основе выбранного результата он либо вставит, либо обновит запись.

Когда я выполняю этот запрос для 100 записей, это занимает 35 секунд, что слишком много, поскольку я должен выполнить этот оператор для более чем 50 тыс. записей.

Есть ли у нас какие-либо варианты для повышения производительности этого запроса, поскольку я не очень разбираюсь в SQL?

Спасибо.

Комментарии:

1. Я бы предположил, что вам следует использовать конструктор значений таблицы в вашем USING , а не запрашивать ту же таблицу, в которую вы объединяетесь. Не знаю, улучшит ли это производительность.

2. вставьте также план выполнения , а также каковы индексы в этих таблицах, а также что вы подразумеваете под # ?

3. Публикация фактического плана выполнения поможет, но, честно говоря, у меня были проблемы с производительностью при слиянии, и я всегда возвращался к выделенным операторам ВСТАВКИ / ОБНОВЛЕНИЯ в транзакции.

4. @eshirvana — # stand в качестве входного параметра, который будет принимать входные данные.. Также SQL server DB обрабатывается отдельной командой, и я понятия не имею об этом .. Не могли бы вы рассказать мне больше о плане выполнения, поскольку я не понял?

5. @KushalKaria вот как отобразить план выполнения