SQL Server достаточно умен, чтобы не ОБНОВЛЯТЬ, если значения одинаковы? - PullRequest
6 голосов
/ 03 февраля 2012

На работе мы взламывали хранимую процедуру и кое-что заметили.

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

Мы не говорили

UPDATE t1 SET A=5

где столбец уже был равен 5. Мы делали что-то вроде этого:

UPDATE t1 SET A = Qty*4.3

В любом случае, достаточно ли умен SQL Server, чтобы не выполнять эту операцию, если значения оцениваются одинаково в операции UPDATE или меня просто одурачивают какие-то другие явления?

Ответы [ 4 ]

8 голосов
/ 03 февраля 2012

Да, вы увидите некоторое повышение производительности. Я рекомендую прочитать эту статью, чтобы лучше понять (она объяснит, почему намного лучше, чем я):

https://sqlkiwi.blogspot.com/2010/08/the-impact-of-non-updating-updates.html

2 голосов
/ 03 февраля 2012

Судя по выводу TSQL, он считает, что ОБНОВЛЕНИЕ выполнено, даже если оно имеет то же значение.

CREATE TABLE test (id INT, val int);
GO

INSERT INTO test VALUES(1, 1);
GO
(1 row(s) affected)

UPDATE test SET val=1 WHERE id=1;
GO
(1 row(s) affected)

Когда дело доходит до записи на диск, я, безусловно, надеюсь, что она не нужна.

Редактировать: См. Ответ @AbeMiessler для более глубокого анализа, как работает запись в журнал / диск.

1 голос
/ 03 февраля 2012

Возможно, вы наблюдаете некоторое повышение производительности в зависимости от конкретного состояния ваших табличных индексов.

Если таблица проиндексирована, и обновление не требует перемещения каких-либо данных (кластеризованных) или изменения индексов (некластеризованных), то вы можете увидеть выигрыш.

Если вы скажете SQL обновить, он обновится.Итак, я бы посмотрел в сторону аппаратного обеспечения (например, индексирование).

0 голосов
/ 03 февраля 2012

SQL должен будет фактически вычислить числовой результат, прежде чем он сделает что-то еще, он должен сделать это, чтобы он знал, с каким значением он должен «что-то делать».Даже тогда для сравнения нужно прочитать значение из таблицы.

Я пытаюсь сказать, что если бы это было так, это фактически уменьшило бы егоЭффективно прочитать значение, сравнить его с тем, к которому вы пытаетесь его обновить, и затем принять решение о том, должно ли оно выполнить операцию обновления.В вашем случае он должен прочитать Qty, прежде чем он сможет решить, что ему нужно поместить в поле A, но даже в этом случае, к тому времени, когда сравниваются значения, он вполне может завершить обновление и продолжитьостаток дня занят:)

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