Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Вопрос про процедурный кэш.  [new]
aleksrov
Member

Откуда:
Сообщений: 948
Сейчас обучаю человека на замену, и он задал вопрос прочитав одну статью и книгу, и я если честно немного тожн в ступоре.
Вопрс про victim policy у SQL в случае memory pressure.
В книге короткевича написано (2016 интерналс):

SQL Server starts to remove plans from the cache in cases of memory pressure. There are two kinds
of memory pressure: local and global . Local memory pressure happens when one of the cache stores
grows too big and starts using too much SQL Server process memory. Global memory pressure happens
when Windows forces SQL Server to reduce its physical memory usage, or when the size of all cache stores
combined reaches 80 percent of the plan cache pressure limit.

Local memory pressure is triggered when a cache store grows to 62.5 percent of the plan cache pressure limit.
Local memory pressure can also be triggered based on the number of plans in the SQL and Object Plan
cache stores. That number is about four times the hash table size

Both local and global memory pressure remove plans from the cache using an algorithm called eviction
policy , which is based on plan cost. For ad-hoc plans, the cost starts with zero and increments by one with
every plan reuse. Other types of plans measure the cost of resources required to produce them.

When not under memory pressure, costs are not decreased until the total size of all cached plans
reaches 50 percent of the buffer pool size. At that point, the Lazy Writer process starts periodically
scanning plan caches, decrementing the cost of each plan by one on each scan, removing plans with zero
cost. Alternatively, each plan reuse increments its cost by one for ad-hoc queries, or by the original plan
generation cost for other types of plans

В книге 2012 интерналс (и тоже примерно тут):

As mentioned, when SQL Server detects memory pressure, all zero-cost plans are removed from cache, and the cost of all other plans is reduced by half. Any particular cycle updates the cost of at most 16 entries for every cache store. When an updated entry has a zero-cost value, it can be removed. SQL Server can’t free entries that are currently in use,

If adding a particular plan to cache causes the cache store to exceed the limit, the removal of other plans from cache happens on the same thread as the one add­ing the new plan, which can cause the response time of the new query to be increased

Дальше говориться что также уменьшается на один при каждом обращении.

Так вот, я тут подумал и че та тоже не могу вьехать, как может кэш занимать 50% от buffer pool, если от так расрастется тогда будет Global Memory Pressure, которое когда сумма всех кешей больше 80% от cache memory pressure limit, если разростется один кэш, тогда будет Local (или 62.5 или по кол-ву бакетов).
Также непонятно, это делает все таки тот же thread или отдельный. В 2012 написано этот же что и вставляет новый план (это как я понял при Local), а при глобал будет отдельным потоком.
Также в томже BOL (как и 2012) написано что стоимость ВСЕХ планов уменьшается на (насколько тоже непонятно, толи на 1, то ли в два раза), и тамже сказано что за раз он смотрит только 16, если pressure сохранится то 32 и т.д. до 1024.
Вопрос, где правда?
24 май 18, 12:16    [21435846]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить