Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Буферен кеш:Какво е това и как влияе върху производителността на базата данни?

В 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 да не губи време в търсене на диска, преди да върне резултатите от заявката.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. T-SQL за намиране на име на отдалечен сървър на свързания сървър

  2. Как да промените име на база данни в SQL Server с помощта на T-SQL

  3. Какво е изчислена колона в SQL Server?

  4. Защо получавам грешката Типът данни Xml не се поддържа в разпределените заявки при запитване към свързан сървър за не-xml данни?

  5. Entity Framework Core 2.0:Как да конфигурирате абстрактен базов клас веднъж