В SQL Server буферният кеш е паметта, която ви позволява бързо да заявявате често достъпни данни. Когато данните се записват или четат от база данни на SQL Server, мениджърът на буфера ги копира в буферния кеш (известен още като буферния пул). Когато е пълен, по-старите или по-рядко използвани страници с данни се преместват на твърдия диск.
Защо трябва да наблюдавам буферния кеш?
Използването на памет може да окаже значително влияние върху производителността. Когато няма достатъчно памет, страниците с данни се изчистват често от буферния кеш. Това забавя заявките, защото SQL Server трябва да отиде до диска, за да намери страницата с данни, да я възстанови в кеша на буфера и след това да прочете страницата, преди да може да върне резултатите от заявката.
Има много причини, поради които заявките започват да се изпълняват бавно. Но ако искате да изключите проблеми с паметта, вижте какво се случва в кеша на буфера. Един поглед вътре в него ще идентифицира коя база данни, таблица или индекс преглъща паметта и оказва натиск върху буфера.
За да видите коя база данни консумира най-много памет, използвайте заявката:
SELECTCASE database_idWHEN 32767 THEN 'ResourceDb'ELSE db_name(database_id)END AS database_name, COUNT(1)/128 AS megabytes_in_cacheFROM sys.dm_os_buffer_descriptorsGROUP BY DB_NAME(database_id_database;in_id)За да идентифицирате таблицата или индекса, които консумират най-много памет, изпълнете тази заявка в базата данни, която искате да проверите:
SELECT COUNT(1)/128 AS megabytes_in_cache,name ,index_idFROM sys.dm_os_buffer_descriptors КАТО bdINNER JOIN(SELECT object_name(object_id) AS name,index_id ,allocation_unit_idFROM sys.allocation_units AS ptain_part. .hobt_idAND (au.type =1 ИЛИ au.type =3)UNION ALLSELECT име_на_обекта(идентификатор_на_обект) КАТО име,index_id, allocation_unit_idFROM sys.allocation_units КАТО auINNER JOIN sys.partitions КАТО pON au.container_id =p.partition_id =p.partition_ID ) КАТО objON bd.allocation_unit_id =obj.allocation_unit_idWHERE database_id =DB_ID()GROUP BY име, index_idORDER BY megabytes_in_cache DESC;Управлявайте паметта с показатели
Въпреки че е полезно да проверявате на място бази данни и индекси за прекомерна употреба на памет, проследяването на показателите за буферния кеш наистина е най-добрият начин за идентифициране и разрешаване на проблеми с производителността, причинени от вътрешния натиск върху паметта.
Ето първите пет показателя, които трябва да наблюдавате, за да подобрите проблемите с производителността, свързани с паметта:
1. Съотношение на попадане в буферния кеш
- Този показател показва как SQL Server използва буферен кеш
- Коефициентът на посещения идентифицира процента на заявките за страници, които са били изпълнени от страници с данни от кеша на буфера спрямо всички заявки за страници с данни
- Страниците, които не са открити в буферния кеш, се четат от диска, което е много по-бавно.
- Идеалното съотношение на буферния кеш е 100 (т.е. SQL Server чете всички страници от буферния кеш и нито една от диска)
- Препоръчителната стойност на кеша на буфера е по-голяма от 90
2. Продължителност на живота на страницата (PLE)
- Продължителността на живота на страницата измерва колко дълго (в секунди) остава страница с данни в кеша на буфера
- Колкото по-дълъг е PLE, толкова по-голям е шансът SQL Server да прочете страниците от буферния кеш и да не се налага да отива на диска
- Ако няма достатъчно памет, страниците с данни се изтриват от буферния кеш по-често, за да се освободи място за нови страници
- Исторически, когато системите имаха много по-малко памет, отколкото сега, „нормалната“ стойност на PLE беше 300 секунди.
- Днес се използва формула за определяне на „добрия“ PLE:Продължителност на живота на страницата =300 секунди за всеки 4 GB RAM на вашия сървър
- PLE трябва да остане стабилен, ако се наблюдава във времето
- Бързите, чести намаления показват проблеми с паметта
- Спад от повече от 50% трябва да се проучи незабавно
3. Прочитане на страница/сек (ниво на сървъра)
- Този показател показва колко физически четения (т.е. четения от диск) са извършени за една секунда във всички бази данни на даден екземпляр
- Физическото четене е скъпо и бавно
- Намалете физическите четения чрез използване на по-голям кеш на данни, интелигентни индекси и по-ефективни заявки или чрез промяна на дизайна на базата данни
- Препоръчителната стойност е по-малка от 90
- Стойност, по-висока от 90, показва недостатъчно памет и проблеми с индексирането
4. Запис на страница/сек
- Този показател показва колко пъти страниците са били записани на диск на ниво сървър за една секунда.
- Препоръчителната стойност е по-малка от 90
5. Pages Input/Sec и Pages Output/Sec (броячи на паметта)
- Входни страници/сек е броят на страниците, въведени от диска всяка секунда
- Изходни страници/сек е броят страници, записани на диска всяка секунда, за да се освободи място в кеша на буфера
- Страници/сек е сумата от входни страници/сек и изведени страници/сек
- Ако стойността на страници/сек постоянно е повече от 50, е необходимо допълнително проучване
Здравият буферен кеш е важен компонент за оптимизирането на скоростта на заявки в SQL Server. Въпреки че проблемите с паметта са само един от няколкото фактора, които могат да забавят отговорите на заявката, те са сравнително лесни за идентифициране и разрешаване. Проследяването на тези пет ключови показатели може да ви помогне да запазите страниците с данни в буферния пул по-дълго, така че SQL Server да не губи време в търсене на диска, преди да върне резултатите от заявката.