Da cadeia de comentários, parece que você está interpretando ASYNC_NETWORK_IO
esperas para significar que o problema está relacionado à rede. (Normalmente) não é.
Como o @MartinSmith sugeriu (duas vezes), a explicação mais provável para isso é o SSMS ou o aplicativo que você está usando, não consumindo os resultados tão rapidamente quanto o SQL Server os está fornecendo. Siga um dos métodos sugeridos para remover o consumo das linhas da sua medição e você terá uma imagem verdadeira (r) da taxa de transferência máxima de E / S:
Caso ainda não o tenha, obviamente será necessário DBCC DROPCLEANBUFFERS
garantir que os dados sejam realmente lidos no disco, e não no cache do buffer. Aplicam-se advertências usuais de "apenas em teste, não faça isso em um ambiente ativo", etc.
Aprimorando alguns de seus outros comentários:
Ao executar uma consulta que retorne 9 milhões de linhas, o uso da CPU permanecerá em torno de 13%, com 9% atribuível ao sqlserver ... não retornaria os resultados mais rapidamente do que 3 min se todos os dados estivessem na RAM?
O que exatamente estamos testando aqui, como e por quê? Se a sua consulta de 9 milhões de linhas não for uma SELECT * FROM dbo.SomeTable
, existem 1001 fatores a serem reproduzidos, além da taxa de transferência bruta de IO.
Seu Intel I7-3820 é um processador de 4 núcleos. Se sua consulta de teste não gerar um plano paralelo, ficaria surpreso se você pudesse debulhar mais de 20% da utilização da CPU do sistema.
Os 3 minutos para retornar 9 milhões de linhas são muito suspeitos e sugerem que não estamos tendo uma visão completa do que está sendo testado. Meu palpite seria que este é um caso de um plano de consulta subótimo (não paralelo), cheio de operadores de loop aninhado que puxam milhões de linhas, ou seja, não apenas uma tabela SELECT
para verificar o consumo de IO.
Eu sugiro:
SELECT *
para testar apenas IO através do SQL Server.
- Nova pergunta com o plano de execução da sua consulta, se você quiser descobrir por que ela não satura o IO.