sql >> Databasteknik >  >> RDS >> Sqlserver

SQL Server-cache-fråga

När du utför din fråga läses data in i minnet i block. Dessa block finns kvar i minnet men de blir "åldrade". Detta innebär att blocken är taggade med den senaste åtkomsten och när SQL Server kräver ytterligare ett block för en ny fråga och minnescachen är full, sparkas det senast använda blocket (det äldsta) ut ur minnet. (I de flesta fall - genomsökningsblock för hela tabeller åldras omedelbart för att förhindra att genomsökningar av hela tabeller överskrider minnet och kväver servern).

Vad som händer här är att datablocken i minnet från den första frågan inte har kastats ut ur minnet ännu så kan användas för din andra fråga, vilket innebär att diskåtkomst undviks och prestandan förbättras.

Så vad din fråga egentligen ställer är "kan jag få datablocken jag behöver i minnet utan att läsa in dem i minnet (faktiskt göra en fråga)?". Svaret är nej, såvida du inte vill cachelagra hela tabellerna och ha dem permanent i minnet, vilket, utifrån frågetiden (och därmed datastorleken) du beskriver, förmodligen inte är en bra idé.

Din bästa insats för att förbättra prestanda är att titta på dina utförandeplaner för frågor och se om att ändra dina index kan ge ett bättre resultat. Det finns två huvudområden som kan förbättra prestandan här:

  • skapa ett index där frågan kan använda ett för att undvika ineffektiva frågor och genomsökningar av hela tabeller
  • lägga till fler kolumner i ett index för att undvika en andra diskläsning. Till exempel har du en fråga som returnerar kolumnerna A och B med en where-sats på A och C och du har ett index på kolumn A. Din fråga kommer att använda indexet för kolumn A som kräver att en disk läses men kräver sedan en andra disk hit för att få kolumn B och C. Om indexet hade alla kolumner A, B och C i sig kan den andra diskträffen för att hämta data undvikas.


  1. Extrahera data från PostgreSQL DB utan att använda pg_dump

  2. välja post från oracle

  3. Hämta Oracle senast infogade IDENTITY

  4. Unicode (hexadecimala) tecken i MySQL