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

Въпрос за кеша на SQL Server

Когато изпълнявате вашата заявка, данните се четат в паметта на блокове. Тези блокове остават в паметта, но "остаряват". Това означава, че блоковете са маркирани с последния достъп и когато Sql Server изисква друг блок за нова заявка и кешът на паметта е пълен, най-малко използваният блок (най-старият) се изхвърля от паметта. (В повечето случаи блоковете за сканиране на пълни таблици незабавно се остаряват, за да се предотврати претоварване на паметта от сканиране на пълни таблици и задушаване на сървъра).

Това, което се случва тук, е, че блоковете с данни в паметта от първата заявка все още не са били изхвърлени от паметта, така че могат да бъдат използвани за втората ви заявка, което означава, че достъпът до диска е избегнат и производителността е подобрена.

Така че това, което всъщност пита вашият въпрос, е „мога ли да получа блоковете с данни, от които се нуждая, в паметта, без да ги чета в паметта (всъщност да правя заявка)?“. Отговорът е не, освен ако не искате да кеширате целите таблици и да ги накарате да пребивават в паметта за постоянно, което, от времето на заявка (и следователно размера на данните), което описвате, вероятно не е добра идея.

Вашият най-добър залог за подобряване на производителността е да разгледате плановете си за изпълнение на заявките и да видите дали промяната на вашите индекси може да даде по-добър резултат. Има две основни области, които могат да подобрят ефективността тук:

  • създаване на индекс, където заявката може да използва такъв, за да се избегнат неефективни заявки и пълни сканирания на таблици
  • добавяне на повече колони към индекс, за да се избегне второ четене на диска. Например, имате заявка, която връща колони A и B с клауза where на A и C и имате индекс на колона A. Вашата заявка ще използва индекса за колона A, изискващ четене на един диск, но след това изисква втори диск хит, за да получите колони B и C. Ако индексът съдържа всички колони A, B и C в него, вторият удар на диска за получаване на данните може да бъде избегнат.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server:Как да намерите всички имена на екземпляри на localdb

  2. SQL Server AlwaysOn (група за наличност) Архитектура и стъпка по стъпка инсталация -4 Стъпки за добавяне и премахване на база данни

  3. Коя SQL заявка е по-бърза? Филтриране по критерии за присъединяване или клауза Къде?

  4. Кешът на плана на SQL Server 2008 е почти винаги празен

  5. R:[unixODBC][Диспечер на драйвери]Не може да се отвори библиотеката „SQL Server“:файлът не е намерен