Esta questão parece basear-se na premissa de que a velocidade aumenta na segunda vez é "devido ao cache do sistema operacional que mantém todos os dados na memória principal". Eu não teria tanta certeza que é a diferença somente entre a primeira e a subsequente execução. Se a diferença no desempenho fosse o armazenamento em cache do host VM RAM, a diferença de uma reinicialização da VM deveria ser insignificante e você precisaria reinicializar o host para ver qualquer diferença.
Para uma coisa que pode impactar o desempenho entre a primeira e a subsequente, compilação e análise de consultas, bem como determinar um plano de execução apropriado, também é um trabalho bastante difícil para o mecanismo de banco de dados, portanto os resultados são normalmente armazenados em cache. O impacto disso pode ser insignificante a substancial, dependendo do que mais o mecanismo de banco de dados precisa fazer para satisfazer a consulta.
Se você tiver RAM suficiente para fazê-lo, uma forma de contornar o armazenamento em cache seria simplesmente mover os arquivos do banco de dados para um grande disco RAM durante os testes. Ao monitorar as estatísticas de I / O, você pode estimar a quantidade de I / O incorrida pela consulta e, portanto, os efeitos no desempenho de várias técnicas de otimização, sem precisar se preocupar com os efeitos do cache de dados porque todos os dados já é na RAM.
Você não diz qual mecanismo de banco de dados está sendo executado, por isso é difícil dar sugestões específicas. No Microsoft SQL Server, você faria algo como SET STATISTICS IO,TIME ON
e / ou SET STATISTICS PROFILE
antes de executar sua consulta para obter dados sobre quão difícil o servidor de banco de dados precisa trabalhar para executar a consulta em questão; outros mecanismos de banco de dados quase certamente têm recursos semelhantes (é um pré-requisito básico para o ajuste de desempenho de consulta). Observe que essas estatísticas geralmente incluem o número de solicitações de E / S reais, e que as solicitações de E / S podem mas não necessariamente serão satisfeitas de qualquer cache no nível do SO Esses números podem ser um indicador útil da quantidade de dados envolvidos na execução de consultas. Grandes diferenças entre o plano de consulta e o resultado real, particularmente em quantidades de E / S ou número de linhas em vários contextos, terão implicações de desempenho, porque significa que o mecanismo de banco de dados está tomando decisões erradas sobre quais algoritmos usar. Grandes quantidades de E / S em qualquer lugar podem muito bem significar que você está atingindo o disco mais do que o necessário, o que terá um custo de desempenho.