Когато изпълнявате вашата заявка, данните се четат в паметта на блокове. Тези блокове остават в паметта, но "остаряват". Това означава, че блоковете са маркирани с последния достъп и когато Sql Server изисква друг блок за нова заявка и кешът на паметта е пълен, най-малко използваният блок (най-старият) се изхвърля от паметта. (В повечето случаи блоковете за сканиране на пълни таблици незабавно се остаряват, за да се предотврати претоварване на паметта от сканиране на пълни таблици и задушаване на сървъра).
Това, което се случва тук, е, че блоковете с данни в паметта от първата заявка все още не са били изхвърлени от паметта, така че могат да бъдат използвани за втората ви заявка, което означава, че достъпът до диска е избегнат и производителността е подобрена.
Така че това, което всъщност пита вашият въпрос, е „мога ли да получа блоковете с данни, от които се нуждая, в паметта, без да ги чета в паметта (всъщност да правя заявка)?“. Отговорът е не, освен ако не искате да кеширате целите таблици и да ги накарате да пребивават в паметта за постоянно, което, от времето на заявка (и следователно размера на данните), което описвате, вероятно не е добра идея.
Вашият най-добър залог за подобряване на производителността е да разгледате плановете си за изпълнение на заявките и да видите дали промяната на вашите индекси може да даде по-добър резултат. Има две основни области, които могат да подобрят ефективността тук:
- създаване на индекс, където заявката може да използва такъв, за да се избегнат неефективни заявки и пълни сканирания на таблици
- добавяне на повече колони към индекс, за да се избегне второ четене на диска. Например, имате заявка, която връща колони A и B с клауза where на A и C и имате индекс на колона A. Вашата заявка ще използва индекса за колона A, изискващ четене на един диск, но след това изисква втори диск хит, за да получите колони B и C. Ако индексът съдържа всички колони A, B и C в него, вторият удар на диска за получаване на данните може да бъде избегнат.