Кэширование значений последовательности

SQL Server позволяет определить режим для последовательностей с целью повысить производительность, уменьшая число обращений к диску. Режим кэширования представляет собой расширение стандартных возможностей SQL. При создании или изменении последовательности можно указать параметр CACHE наряду со значением кэша или NO CACHE, если требуется запретить кэширование.

В процессе подготовки данной статьи по умолчанию использовалось значение кэша 50; в дальнейшем оно может быть изменено. Дополнительные сведения о значениях кэша приведены во врезке «Как определить значение кэша по умолчанию в SQL Server Denali». Если выбран режим NO CACHE (помните, что значение по умолчанию — CACHE 50), то каждый раз при создании значения последовательности SQL Server необходимо записывать изменения в системную таблицу на диске.

Конечно, это плохо влияет на производительность. При использовании параметра CACHE SQL Server записывает системные таблицы только один раз при каждом запросе. Каждый раз, когда выделяется новый блок

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

По сравнению с отсутствием кэширования значений можно отметить заметное повышение производительности при кэшировании даже довольно малых блоков значений (например, 50); чем больше значение кэша, тем выше производительность. Тогда почему просто не использовать максимально большое значение кэша? Потому что, если произойдет неправильное завершение работы SQL Server (например, сбой питания), будет потерян оставшийся диапазон до значения, записанного на диск. Учитывая, что новые значения последовательности, сформированные в транзакции, но не зафиксированные, в конечном итоге все равно теряются, невозможно гарантировать отсутствие пробелов в последовательности.

Обсуждение закрыто.