sql >> Database >  >> RDS >> Sqlserver

Vraag over SQL Server-cache

Wanneer u uw query uitvoert, worden de gegevens in blokken in het geheugen ingelezen. Deze blokken blijven in het geheugen, maar ze worden "verouderd". Dit betekent dat de blokken worden getagd met de laatste toegang en wanneer Sql Server een ander blok nodig heeft voor een nieuwe query en de geheugencache vol is, wordt het minst recent gebruikte blok (het oudste) uit het geheugen geschopt. (In de meeste gevallen - scanblokken van volledige tabellen worden onmiddellijk verouderd om te voorkomen dat scans van volledige tabellen het geheugen overbelasten en de server verstikken).

Wat hier gebeurt, is dat de gegevensblokken in het geheugen van de eerste query nog niet uit het geheugen zijn verwijderd en dus kunnen worden gebruikt voor uw tweede query, wat betekent dat schijftoegang wordt vermeden en de prestaties worden verbeterd.

Dus wat uw vraag eigenlijk is, is "kan ik de gegevensblokken die ik nodig heb in het geheugen krijgen zonder ze in het geheugen te lezen (eigenlijk een query uit te voeren)?". Het antwoord is nee, tenzij u de hele tabellen in de cache wilt opslaan en ze permanent in het geheugen wilt laten staan, wat gezien de querytijd (en dus de gegevensomvang) die u beschrijft waarschijnlijk geen goed idee is.

Uw beste gok voor prestatieverbetering is kijken naar uw uitvoeringsplannen voor query's en kijken of het wijzigen van uw indexen een beter resultaat kan opleveren. Er zijn twee belangrijke gebieden die de prestaties hier kunnen verbeteren:

  • een index maken waar de zoekopdracht er een zou kunnen gebruiken om inefficiënte zoekopdrachten en volledige tabelscans te voorkomen
  • meer kolommen aan een index toevoegen om een ​​tweede schijflezing te voorkomen. U hebt bijvoorbeeld een query die de kolommen A en B retourneert met een waar-clausule op A en C en u hebt een index op kolom A. Uw query gebruikt de index voor kolom A waarvoor één schijf moet worden gelezen, maar er is dan een tweede schijf nodig hit om kolommen B en C te krijgen. Als de index alle kolommen A, B en C bevat, kan de tweede schijfhit om de gegevens te krijgen worden vermeden.


  1. Oracle JDBC UCP en Java

  2. Omgevingsvariabelen gebruiken in T-SQL

  3. Een aantal waarden in een tabel selecteren en voorvallen tellen

  4. Wat is er mis met mijn CASE?