Tenho duas consultas pesadas para executar e ambas levam cerca de 1 minuto para serem executadas. Ambas as consultas estão usando o comando Bulk Insert para inserir dados de arquivos de texto em tabelas no banco de dados.
Para as duas tabelas que importam dados, não há índices/gatilhos/restrições, apenas duas tabelas vazias para carregar os dados.
Para carregar os dois arquivos de texto, cada um deles tem cerca de 20 milhões de linhas.
Consulta 1:
Bulk insert table1
FROM 'table1.txt' WITH
(FIELDTERMINATOR ='|',
ROWTERMINATOR = '0x0a',
TABLOCK)
Consulta 2:
Bulk insert table2
FROM 'table2.txt' WITH
(FIELDTERMINATOR ='|',
ROWTERMINATOR = '0x0a',
TABLOCK)
Eu quero comparar o tempo de execução em diferentes cenários.
Cenário 1: duas consultas sendo executadas em série em um editor:
- Consulta 1: 1 m 18 s
- Consulta 2: 1 m 2 s
- O tempo total de execução é de 2m 20s.
Cenário 2: cada consulta em um editor separado da mesma instância do Studio, executando simultaneamente:
- Consulta 1: 2 m 36 s
- Consulta 2: 2 m 09 d
- O tempo total de execução é de 2m 40s
Cenário 3: cada consulta em uma instância separada do Studio, executando simultaneamente:
- Consulta 1: 2 m 29 s
- Consulta 2: 2 m 19 s
- O tempo total de execução é de 2m 29s
Embora os cenários 2 e 3 pareçam executar consultas simultaneamente, por que o tempo de execução não mudou muito? Para todos os cenários, o uso da CPU está entre 17% e 21%, o uso do disco é de 50 MB a 70 MB por segundo. Não foram observadas diferenças significativas entre o uso da CPU e do disco.
Eu estou querendo saber o que está acontecendo sob o capô? Como o SQL Server executa essas consultas? Por que o tempo de execução é quase o mesmo para todos os três cenários? Existe alguma maneira de agilizar?
Estou usando o SQL Server 2016 Developer Edition no Windows 10 de 64 bits. Eu tenho quad core i7 e SSD no meu laptop.
Depois de testar mais cenários com 4 consultas rodando juntas, acho que a possível causa do baixo uso de CPU e disco é o hyperthreading com meu Core i7:
Com dois editores executando duas consultas simultaneamente, o uso máximo da CPU é de 25%.
Com 4 editores executando 4 consultas simultaneamente, o uso máximo da CPU é de 50%.
Vocês estão cientes de maneiras de permitir que uma consulta use exclusivamente um núcleo? Desativar o hyperthreading não é uma opção para mim, pois meu ThinkPad T460p não oferece suporte a essa opção no BIOS.
Depois de uma longa e proveitosa discussão com Dan Guzman neste tópico do fórum do MSDN , o esquema de agendamento subjacente finalmente ficou claro para mim. Aqui está uma breve resposta emprestada do tópico acima:
Uma discussão aprofundada pode ser encontrada no link acima.
Obrigado a todos pela ajuda entusiástica!