Почему лучший уровень изоляции означает лучшую производительность в SQL Server - PullRequest
7 голосов
/ 16 марта 2010

При измерении производительности по моему запросу я обнаружил зависимость между уровнем изоляции и прошедшим временем, которая меня удивила

READUNCOMMITTED - 409024
READCOMMITTED - 368021
REPEATABLEREAD - 358019
SERIALIZABLE - 348019

В левом столбце указывается табличная подсказка, а в правом столбце - время в микросекундах (sys.dm_exec_query_stats.total_elapsed_time). Почему лучший уровень изоляции дает лучшую производительность? Это машина разработки, и никакого параллелизма не происходит. Я ожидал бы, что READUNCOMMITTED будет поститься из-за меньших накладных расходов блокировки.

Обновление: я измерял это с

DBCC DROPCLEANBUFFERS 
DBCC FREEPROCCACHE  

выдано, и Профилировщик подтверждает, что кеша не происходит.

Ответы [ 2 ]

5 голосов
/ 16 марта 2010

Прежде всего, вам нужно многократно выполнять запрос под каждым уровнем изоляции и усреднять результат, отбрасывая тот, который имеет максимальное время. Это исключит влияние прогрева буфера: вы хотите, чтобы все прогоны находились в «горячем» кэше, а не чтобы один запрос нагревал кэш и платил за это сравнение.

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

Кроме этого, единственным уровнем изоляции, который на законных основаниях является более быстрым, является грязное чтение, поскольку он не получает блокировок. Снимок с фиксацией чтения (который вы не измеряли) также не получает блокировок, но влияет на производительность в целом из-за накладных расходов на управление версиями строк.

0 голосов
/ 26 января 2012

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

Мне все еще было бы интересно прочитать более подробное описание этого вопроса.

...