Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Jean Franceschi

Melhorando a performance do script...

Recommended Posts

Opa gente... estou em dúvida sobre como melhorar o script para ajudar na performance do servidor.

Como as aplicações asp q eu estou fazendo são gigantes (cerca de 5 mil linhas por página), achei que melhorando algumas coisas pode facilitar na performance do server...

 

 

Gostaria de saber qual das duas opções gasta menos recursos do server, vamos a elas:

 

Maneira 1: "Abre o banco de dados antes de começar a fazer as buscas e fazer o loop nos registros encontrados"


Set Con_Cadastros = Server.CreateObject("ADODB.Connection")
	Con_Cadastros.Open "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=" & Caminho_Banco_de_Dados & "S1_Cadastros.mdb"

Set Con_Clientes = Server.CreateObject("ADODB.Connection")
	Con_Clientes.Open "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=" & Caminho_Banco_de_Dados & "S1_Clientes.mdb"


	Set BLABLABLA = Con_Cadastros.Execute("SELECT CNPJ FROM Cadastros ORDER BY Id")
		If Not BLABLABLA.EOF Then
			Do While Not BLABLABLA.EOF


				Set TRALALA = Con_Clientes.Execute("SELECT Nome,N_Filial FROM Unidades WHERE CNPJ='"& BLABLABLA("CNPJ") &"' Clientes Order By Id")
					If Not TRALALA.EOF Then
						Do While Not TRALALA.EOF

							Response.Write(TRALALA("Nome") &" - "& TRALALA("N_Filial") &"<BR>")

						TRALALA.MoveNext
						Loop
					End If
					TRALALA.Close
				Set TRALALA = Nothing


			BLABLABLA.MoveNext
			Loop
		End If
		BLABLABLA.Close
	Set BLABLABLA = Nothing


	Con_Clientes.Close
Set Con_Clientes = Nothing

	Con_Cadastros.Close
Set Con_Cadastros = Nothing


 

 

Maneira 2: "Abre o segundo Banco de dados só depois de começar o loop, abrindo ele e fechando após o término de cada busca encontrada"


Set Con_Cadastros = Server.CreateObject("ADODB.Connection")
	Con_Cadastros.Open "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=" & Caminho_Banco_de_Dados & "S1_Cadastros.mdb"

	Set BLABLABLA = Con_Cadastros.Execute("SELECT CNPJ FROM Cadastros ORDER BY Id")
		If Not BLABLABLA.EOF Then
			Do While Not BLABLABLA.EOF


				Set Con_Clientes = Server.CreateObject("ADODB.Connection")
					Con_Clientes.Open "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=" & Caminho_Banco_de_Dados & "S1_Clientes.mdb"

					Set TRALALA = Con_Clientes.Execute("SELECT Nome,N_Filial FROM Unidades WHERE CNPJ='"& BLABLABLA("CNPJ") &"' Clientes Order By Id")
						If Not TRALALA.EOF Then
							Do While Not TRALALA.EOF

								Response.Write(TRALALA("Nome") &" - "& TRALALA("N_Filial") &"<BR>")

							TRALALA.MoveNext
							Loop
						End If
						TRALALA.Close
					Set TRALALA = Nothing

					Con_Clientes.Close
				Set Con_Clientes = Nothing


			BLABLABLA.MoveNext
			Loop
		End If
		BLABLABLA.Close
	Set BLABLABLA = Nothing

	Con_Cadastros.Close
Set Con_Cadastros = Nothing

 

 

 

Isso é só um exemplo simples que fiz rapidão, nem sei se funciona pq não testei, foi só pra demonstrar a idéia, e tentar descobrir qual forma exige menos do servidor em casos extremos (mais de 5 mil acessos simultaneos no mesmo minuto, com um banco de dados gigantesco, etc...

 

Agradeço a atenção de todos =)

Compartilhar este post


Link para o post
Compartilhar em outros sites

a impôrtancia de uma modelagem de dados bem definida até os mínimos detalhes, como os campos de relacionamentos, um velho ditado diz, que um relacionamento bem definido é a alma do aplicativo, pois daí saem todas as consultas e operações com o banco, influenciando diretamente na otimização e performance do aplicativo

Compartilhar este post


Link para o post
Compartilhar em outros sites

a impôrtancia de uma modelagem de dados bem definida até os mínimos detalhes, como os campos de relacionamentos, um velho ditado diz, que um relacionamento bem definido é a alma do aplicativo, pois daí saem todas as consultas e operações com o banco, influenciando diretamente na otimização e performance do aplicativo

 

 

Isso quer dizer que você faria como a primeira ou como a segunda opção? =(

Sério, até achei bonitinha tua expressão, mas não encontrei funcionalidade prática nela, pq em termos, fazer tudo certo é o ideal, porém na prática o que é o certo a ser feito?

Compartilhar este post


Link para o post
Compartilhar em outros sites

para otimizar mais suas expressões SQL, utilize stored procedure, agora referente a abrir e fechar os recordsets pode ser vantajoso para um banco mais extenso,mas tome cuidado em fechar um recordset e depois precisar dele aberto, dae pode dar erro.

Compartilhar este post


Link para o post
Compartilhar em outros sites

É realmente necessário o uso de dois bancos de dados em access? Não seria mais indicado o uso de mais tabelas ou um SGDB mais robusto e menos "voraz" de consumo (SQLServer, MySQL, ...)?

 

Caso seja apenas um "estudo de caso" eu faria de uma terceira forma para economizar um pouco mais de recurso e não ficar no "cria/destrói" conexão, devido a alguns fatores isso pode até mesmo aumentar um pouco mais de consumo.

 

Eu faria assim:

    Set Con_Cadastros = Server.CreateObject("ADODB.Connection")
	Con_Cadastros.Open "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=" & Caminho_Banco_de_Dados & "S1_Cadastros.mdb"

       Set BLABLABLA = Con_Cadastros.Execute("SELECT CNPJ FROM Cadastros ORDER BY Id")
		If Not BLABLABLA.EOF Then
          	 Set Con_Clientes = Server.CreateObject("ADODB.Connection")
              	 Con_Clientes.Open "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=" & Caminho_Banco_de_Dados & "S1_Clientes.mdb"


               Do While Not BLABLABLA.EOF


				Set TRALALA = Con_Clientes.Execute("SELECT Nome,N_Filial FROM Unidades WHERE CNPJ='"& BLABLABLA("CNPJ") &"' Clientes Order By Id")
					If Not TRALALA.EOF Then
						Do While Not TRALALA.EOF

							Response.Write(TRALALA("Nome") &" - "& TRALALA("N_Filial") &"<BR>")

						TRALALA.MoveNext
						Loop
					End If
					TRALALA.Close
				Set TRALALA = Nothing


			BLABLABLA.MoveNext
			Loop
                   Con_Cadastros.Close
               Set Con_Cadastros = Nothing
           End If
		BLABLABLA.Close
	Set BLABLABLA = Nothing


	Con_Clientes.Close
Set Con_Clientes = Nothing

 

Repare que só crio a segunda conexão CASO exista algo retornando no 1º RecordSet.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.