Eu tenho um SSD que, usando o teste IOmeter, mostra desempenho acima de 200 MB / s. No entanto, quando executo qualquer consulta SQL da máquina local, o monitor de recursos do Windows nunca mostra E / S de disco acima de 7 MB / s. Isso vale mesmo para consultas que levam mais de 2 minutos para serem executadas. Qual poderia ser o gargalo em usar apenas 7 MB / s de SSD?
Estou correndo:
- Windows Server 2012 Standard
- SQL Server 2008 r2
- Intel i7 3820
- 32GB de ram
- sandisk SSD
sql-server
sql-server-2008-r2
hardware
Dean MacGregor
fonte
fonte
sys.dm_os_waiting_tasks
enquanto a consulta está sendo executada para ver se há outros tipos de espera que está encontrando.DECLARE @Name VARCHAR(10), @High int; SELECT @Name=name, @High = high FROM master..spt_values
. Portanto, nenhum resultado é enviado de volta ao cliente, mas o plano e o IO ainda serão os mesmos.Respostas:
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:
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.fonte