Использование множественного обновления или внутреннего соединения лучше для повышения производительности

#sql-server #performance

#sql-server #Производительность

Вопрос:

У меня есть следующий оператор update, который я использую в триггере, который имеет одинаковое поведение, и оба они верны, но у 2-го возникает проблема, если я одновременно обновляю оба table_id и ValueB. Но это не большая проблема, так как есть обходной путь, но, если возможно, я хочу избежать этого. Итак, что я хочу знать, есть ли большая производительность между этими 2, и это заставит меня решить, какой из них выбрать. Если 2-й намного лучше по производительности, чем я буду использовать 2-й. Но если разница не такая большая, я буду использовать 1-й. Я не эксперт в sql server. Кто-нибудь может помочь?

         UPDATE tableA
        SET tableA.Value = tableA.Value - old.ValueB
        FROM tableA
        INNER JOIN (
                        SELECT tableA_ID ,ValueB
                        FROM deleted
                    ) old ON old.tableA_ID = tableA.ID

        UPDATE tableA
        SET tableA.Value = tableA.Value   new.ValueB
        FROM tableA
        INNER JOIN (
                        SELECT tableA_ID ,ValueB
                        FROM inserted
                    ) new ON new.tableA_ID = tableA.ID
 
         UPDATE tableA
        SET tableA.Value = tableA.Value - old.ValueB   new.ValueB
        FROM tableA
        INNER JOIN (
                        SELECT tableA_ID ,ValueB
                        FROM deleted
                    ) old ON old.tableA_ID = tableA.ID

        INNER JOIN (
                        SELECT tableA_ID ,ValueB
                        FROM inserted
                    ) new ON new.tableA_ID = tableA.ID
 

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

1. Зачем вам нужно писать триггер (важный момент, который вы не упомянули), чтобы сделать это? Почему значение столбца «Value» (это запутанное имя, которое вы, похоже, запутали)? И ваша логика соединения выглядит неправильно, что вызывает гораздо большее беспокойство.

2. @SMor Извините за именование. Что касается соединения, я вношу некоторые корректировки, но пока все работает нормально. Почему мне нужно использовать триггер, потому что этот триггер находится в TableB. Значение столбца в TableA является суммой всех значений с тем же table_id из TableB. Логика здесь заключается в том, что я только вставляю данные в TableB, а общее значение будет обрабатываться триггером для его обновления в TableA. Я также добавляю еще немного информации, надеюсь, это понятно.

Ответ №1:

Как и во всем, проверьте это, чтобы убедиться.

Следует ли вам делать это в триггере — это долгое обсуждение.

С точки зрения производительности вы увидите лучшую производительность, в большинстве случаев, со вторым запросом. Причина, по которой я могу просто заявить, что вы просматриваете только один поиск для ОБНОВЛЕНИЯ в запросе, где вы обновляете все сразу. Принимая во внимание, что первый запрос должен найти данные для ОБНОВЛЕНИЯ два раза.

Однако, опять же, проверьте это.

И да, как говорит @SMor в комментариях, почему вам это нужно в качестве триггера, обязательно следует обсудить. Триггеры могут быть серьезно неправильно использованы и злоупотреблены.

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

1. Укажите в ответе @SMor, зачем мне нужен триггер, а также добавьте дополнительную информацию о том, почему мне нужно выбрать. Тестирование этого, к сожалению, я могу протестировать это только на своем локальном сервере, но я не могу протестировать его на реальном сервере, поскольку я не могу просто редактировать любые данные по своему усмотрению. Я также думаю, что 2-й вариант лучше, но есть ли большая разница в производительности?

2. Единственный способ узнать наверняка — протестировать его. Однако, да. Я придерживаюсь того, что я сказал.