Eu tenho o site ASP.NET que possui seu próprio cache independente de dados e os dados não são alterados por longos períodos de tempo, portanto, não é necessário consultar o SQL Server pela segunda vez com a mesma consulta. Preciso melhorar o desempenho das primeiras consultas (virgens) que vão para o SQL Server. Algumas consultas processam tantos dados que podem causar o uso do SQL Server tempdb
. Como eu não uso variáveis de tabela temporária ou tabelas temporárias, o SQL Server decide usar tempdb
sozinho sempre que necessário.
Meu tamanho de db é 16Gb, tenho 32Gb de RAM física disponível na minha máquina servidor.
Entendo que a estratégia de cache do MS SQL Server tenta manter os dados na RAM para acelerar o desempenho de consultas semelhantes, se eles precisarem que os mesmos dados sejam carregados novamente. Além disso, tentará usar a RAM disponível em vez do tempdb para acelerar o desempenho sem causar acesso ao disco.
Suponho que quando a consulta que precisa armazenar algo no SQL Server tempdb chegar e não houver RAM suficiente disponível, o SQL Server terá 2 opções:
1) descarregar alguns dados em cache e usar RAM poupada em vez do tempdb para evitar gravações em disco
2) mantenha os dados armazenados em cache para consultas futuras e comece a usar o tempdb, o que causa gravações no disco lento.
Não sei que escolha o SQL Server fará nessa situação, mas gostaria que fizesse a opção 1, porque me preocupo apenas com o desempenho de consultas primárias (virgens), porque nunca mais envio a mesma consulta ao SQL Server novamente (embora eu possa enviar uma consulta semelhante).
O que é a estratégia de cache do SQL Server para esse cenário?
Como ele equilibra o uso da RAM entre evitar o tempdb para consultas virgens e a velocidade de consultas secundárias?
É possível configurar o SQL Server de forma que faça a escolha nº 1? Se sim, então como?
De que outra forma posso melhorar o desempenho de todas as consultas SQL virgens?
Como não sei sobre a estratégia de cache do SQL Server, quero colocar o banco de dados no disco RAM. Isso garantirá que qualquer consulta virgem tenha alta velocidade de carregamento de dados não armazenados em cache, mesmo que o SQL Server sempre faça a escolha nº 1. O risco disso é que o SQL Server comece a usar mais tempdb com menos RAM disponível (restam apenas 16 Gb depois que eu uso 16 Gb para o disco RAM) se ele continuar fazendo a opção 2, o que atrasará as consultas virgens que causam vazamentos tempdb
.
Estou interessado na solução para o SQL 2008 R2, mas acho que provavelmente é o mesmo para o SQL 2008, SQL 2005 e pode ser o SQL 2000.
Esclarecimentos:
Não há outros aplicativos em execução nessa caixa, ele é dedicado ao SQL Server . O site é executado em caixa separada.
É o SQL Server 2008 R2 Standard Edition de 64 bits no Windows Server 2008 R2 Enterprise de 64 bits.
Eu executo apenas consultas somente leitura e o banco de dados está definido como somente leitura .
Vamos supor que já existem bons índices . Esta pergunta é sobre o SQL Server fazer a escolha nº 1 versus a opção nº 2, como é que se faz, se existe uma maneira de controlá-lo e se o disco RAM o ajuda a fazer a escolha certa para consultas virgens.