Eu tenho um banco de dados SQL Server 2916 e Solr. O indexador Solr geralmente executa essas consultas:
select book_collection from books group by book_collection having max(updated_on) > '2017-04-04 09:50:05'
A coluna updated_on é atualizada por um gatilho na inserção/atualização; a cada execução do indexador incremental Solr (a cada 10 minutos), muitas consultas como a acima obtêm os registros modificados mais recentes e os reindexam. Esta tabela, por exemplo, tem cerca de um milhão de linhas e a cada vez a consulta retornaria no máximo 10-20 linhas. Essas consultas acabam na lista das consultas mais caras executadas no banco de dados, então gostaria de otimizá-las. Minhas perguntas:
1) Uma coluna de carimbo de data/hora teria um desempenho melhor do que uma coluna de data/hora?
2) Se eu alterasse a consulta assim, seria mais eficiente?
select distinct book_collection from books where updated_on > '2017-04-04 09:50:05'
O primeiro plano de consulta é o original, o segundo é modificado por mim. O fato de o segundo plano solicitar um índice e o primeiro não, realmente sugere que a consulta modificada pode usar um índice, se presente, e, portanto, é melhor.
updated_on
, algo que a função MAX() proíbe na consulta original. Tanto quanto posso ver, o resultado deve ser idêntico.Como a
timestamp
é 8 bytes e adatetime
é 8 bytes, não haverá diferença apreciável entre os dois em termos de desempenho.Adicionar um índice apropriado fará uma diferença muito maior no trabalho necessário para o SQL Server atender à consulta SOLR.
Para testar isso, criei o seguinte exemplo verificável minimamente completo:
O acima insere 10.000 linhas em 1.000
book_collection
valores, com valores variadosupdated_on
.Meu exemplo de consulta SOLR:
O plano para esta consulta:
Estatísticas para esta consulta:
Se adicionarmos esse índice e executarmos novamente a mesma consulta:
Vemos o seguinte plano e estatísticas:
A E/S é substancialmente reduzida, assim como o tempo de CPU e o tempo decorrido. Claramente, adicionar um índice útil tornará a consulta mais eficiente.
Se recriarmos o experimento usando uma
timestamp
coluna no lugar dadatetime
coluna, veremos resultados muito semelhantes:Estatísticas da consulta sem o índice em vigor:
E com o índice no lugar: