SQL Server 2005 e cache

2

Background to question: Estou procurando implementar um sistema de cache para o meu site. Atualmente estamos explorando o memcache como meio de fazer isso. No entanto, estou olhando para ver se algo semelhante existe para o SQL Server. Eu entendo que o MySQL tem cache de consulta que, embora não seja distribuído, funciona como uma espécie de medida 'stop gap'. O cache de consulta do MySQL é equivalente ao cache de buffer no SQL Server?

Então, aqui estão minhas perguntas:

  1. Existe uma maneira de saber é atualmente armazenado no cache de buffer?
  2. Depois disso, há uma maneira de forçar certas tabelas ou conjuntos de resultados no cache? Quanto controle eu tenho sobre o que acontece no cache de buffer e procedimento? Eu entendo que costumava haver um comando DBCC PINTABLE, mas que já foi descontinuado.
  3. Ligeiramente fora do tópico: deve o o cache ainda existe no banco de dados camada? Ou é mais prudente gerenciar caches usando Velocity / Memcache? É assim, por que? isto Parece que a invalidação de cache é Algo de dor ao manusear muitos objetos com sobreposição gatilhos.

Obrigado!

    
por Nai 11.11.2009 / 14:04

4 respostas

1

1) Sim, você pode ver o que está no cache de buffer do Sql Server (2005 e 2008) --- DEMO: contagem de buffers por objeto & index.sql --- Memória por objeto. --- quebrar os buffers por objeto (tabela, índice) SELECT b.database_id,    database_name = CASE b.database_id       QUANDO 32767 ENTÃO 'Recurso'       ELSE db_name (b.database_id) END,    p.object_id,    Object_Name = object_name (p.object_id, database_id),    p.index_id,    buffer_count = count (*) FROM sys.allocation_units a JUNTAR sys.dm_os_buffer_descriptors b    ON a.allocation_unit_id = b.allocation_unit_id JUNTAR sys.partitions p    ON a.container_id = p.hobt_id WHERE object_id > 99 GROUP BY b.database_id, p.object_id, p.index_id ORDER BY buffer_count DESC

2) Você pode fixar tabelas no cache em 2005 - este recurso está sendo substituído em 2008 ... Acho que o algoritmo que o SQL Server usa para manter as tabelas quentes no cache é melhor que você decida que deseja fixar uma tabela no cache. O tempo seria melhor gasto na pesquisa.

3) Depende ......

    
por 18.11.2009 / 17:00
1

Eu não acho que seu terceiro ponto esteja fora do tópico. Se você quiser implementar o armazenamento em cache para o seu site, acho que faz sentido usar o memcache ou algo semelhante na camada da Web.

Uma das razões pelas quais você deseja implementar o armazenamento em cache é reduzir o número de chamadas para seu banco de dados. Se você colocar o cache no banco de dados, não estará economizando muito.

Seu desempenho também dependerá muito do seu modelo de objeto e de como você está consultando seu banco de dados. Se você estiver armazenando objetos em cache e todas ou a maioria de suas propriedades, obterá um desempenho de cache melhor do que se armazenar em cache conjuntos de resultados específicos para cada página, pois cada página que usa um objeto específico pode usar o mesmo registro de cache.

O banco de dados terá seu próprio cache interno, independentemente do método escolhido. Isso está lá para ajudar no desempenho da sua consulta quando o seu cache da web exige que você acesse o banco de dados por não precisar ir ao disco para cada página de dados.

    
por 18.11.2009 / 12:03
1

Desculpas, já que este é um ano após a postagem original, mas acabamos de encontrar essa pergunta.

Em resposta à segunda resposta de Joe E O, '... Você pode fixar tabelas no cache em 2005 ...' fixar tabelas não funciona mais no SQL2005 ... e aqui está o culpado:

link

e, creio, agora foi totalmente removido do SQL2008.

HTH

humbleDBA

    
por 10.11.2010 / 14:14
0

Um cache de consulta é diferente de um cache de buffer, pois enquanto o cache de buffer contém blocos de dados reais, o cache de consulta contém resultados para consultas específicas. Em outras palavras, o cache de consulta só está em vigor quando a consulta é idêntica ou quase idêntica a uma que foi executada anteriormente, geralmente restrita ao mesmo usuário.

O cache de buffer está em vigor sempre que uma consulta acessa quaisquer dados que foram acessados recentemente por qualquer outra consulta.

Temo que não conheço uma maneira simples de ver quais dados estão atualmente no conjunto de buffers, nem conheço uma maneira suportada de fixar objetos ao cache no SQL Server 2005. Posso acrescentar que Eu sou primariamente um DBA Oracle, então há uma chance de alguém com melhor conhecimento em MS-SQL lançar alguma luz sobre isso.

O cache bufer na camada do banco de dados é essencial para o desempenho do aplicativo, apesar de qualquer cache no nível do aplicativo. Há, indiscutivelmente, alguma sobreposição entre o cache de arquivos do sistema, o cache de buffer do banco de dados e, em alguns casos, pode ser benéfico permitir que o RDBMS ignore o cache do sistema.

    
por 15.11.2009 / 12:25