#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. Единственный способ узнать наверняка — протестировать его. Однако, да. Я придерживаюсь того, что я сказал.