Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Triple Inner join com mais de 10.000 linhas e aplicação de baias de cálculos asp


Vamos analisar isso, tendo em mente que o SQL tem uma cláusula ORDER BY:-
do until rs.eof 
  response.flush 
  counter = counter + 1 

  ' A LOT of calculations and putting in array... 

  rs.movenext 
loop

Observe o Response.Flush , a primeira coisa que eu faria é me livrar disso. Você provavelmente precisará aumentar o limite de buffer de resposta do ASP (no gerenciador do IIS). Flush está enviando o conteúdo gerado até o momento para o cliente, ele espera que o cliente confirme o recebimento de todos os pacotes enviados antes de concluir. É aí que eu acho que 90% dos mais de 5 minutos estão sendo gastos.

Agora "MUITO cálculos". VBScript não é conhecido por seu desempenho. Este código pode levar algum tempo. Em alguns casos, alguns cálculos podem ser feitos muito melhor por SQL do que por script, então essa é uma opção. Outra seria construir algum componente compilado COM para fazer um trabalho complexo (embora algumas contas precisem ser feitas para marshalling, o que pode acabar com os benefícios). No entanto, pode ser inevitável que você precise fazer esses cálculos em VBScript.

Agora rs.movenext . Esse loop significa que você mantém a conexão e o conjunto de linhas abertos praticamente o tempo todo em que o processamento é necessário. Isso é enquanto os servidores estão enviando bytes pela rede para o cliente e enquanto o VBScript está processando números. Uma abordagem muito melhor seria sugar todo o conjunto de linhas rapidamente e desconectar do banco de dados, então processar números e finalmente despeje o buffer para o cliente.

Considere usar um conjunto de registros desconectado (você especifica um cursor estático do lado do cliente) ou até mesmo o simples GetRows método do objeto de conjunto de registros que despeja todo o conjunto de linhas em uma matriz bidimensional. Isso significa que você mantém bloqueios nas várias tabelas pelo menor tempo possível.