SELECT MAIS RAPIDO
FLAVIOALBIERO,
Minha conexão faço assim:
ONDE MUDO A FORMA DE CONEXÃO???
Minha conexão faço assim:
Public Function Abrir_Banco(ByRef sMsg As String) As Boolean
Dim sCn As String
On Error GoTo Fim
sCn = "Provider=MSDAORA.1;User ID=cias/itrkiuy;Data Source=oracle;Persist Security Info=False"
dbBanco.Open sCn
Fim:
If Err.Number <> 0 Then
sMsg = Err.Number & "-" & Err.Description
End If
Abrir_Banco = (Trim(sMsg) = "")
End Function
ONDE MUDO A FORMA DE CONEXÃO???
1a Mude:
'Utilizaremos menos rede e um processador , em tese, mais potente
rec.CursorLocation = adUseServer
'Buscaremos um recordset que não faz nenhum processamento extra de travamento ou navegação
rec.Open sSql, dbBanco, adOpenReadOnly, adForwardOnly
2a Não utilize o Recordset para percorrer registros, mas uma array ... seu desempenho fica muito melhor.
How To:
Dim a
'database handle até abrir o RecordSet ...
a= RS.GetRowsr
s.close
set rs=nothing
3o Utilize o Provider mais atualizado possivel para o seu Database
4o Como estaremos gravando os registros em um arquivo e só o resultado final que interessa não precisaremos (e não deveremos) registrar status por que mesmo uma progressBarr comprometeria o desempenho por causa do uso de comandos intermediários de manipulação do controle e uso de "Do Events".
'Utilizaremos menos rede e um processador , em tese, mais potente
rec.CursorLocation = adUseServer
'Buscaremos um recordset que não faz nenhum processamento extra de travamento ou navegação
rec.Open sSql, dbBanco, adOpenReadOnly, adForwardOnly
2a Não utilize o Recordset para percorrer registros, mas uma array ... seu desempenho fica muito melhor.
How To:
Dim a
'database handle até abrir o RecordSet ...
a= RS.GetRowsr
s.close
set rs=nothing
3o Utilize o Provider mais atualizado possivel para o seu Database
4o Como estaremos gravando os registros em um arquivo e só o resultado final que interessa não precisaremos (e não deveremos) registrar status por que mesmo uma progressBarr comprometeria o desempenho por causa do uso de comandos intermediários de manipulação do controle e uso de "Do Events".
Considere a possibilidade de Executar o aplicativo em uma máquina que tenha HD SCSI
Se utilizar todas as dicas creio que no mÃnimo 25% do tempo vc economiza ... milagre ainda não estou fazendo.
Se utilizar todas as dicas creio que no mÃnimo 25% do tempo vc economiza ... milagre ainda não estou fazendo.
ao invés de você colocar assim:
If rec.RecordCount = 0 then
tenta assim:
If rec.Eof = False then
If rec.RecordCount = 0 then
tenta assim:
If rec.Eof = False then
Citação:MARCELOHF escreveu:
ELSVB,
Vi que no seu select vc filtra tudo que foi cadastrado após uma certa Data.
[Ãâ€ÂÂ]Where Dt_Cadastro >= [à ']01-JAN-2000[à '][Ãâ€ÂÂ]
Este campo Dt_Cadastro está indexado?
Se não, crie o indÃce, isto pode agilizar uma consulta.
Nossa isto aqui também é muuuuuuuiiiiiito importante !!!
Indexar todos os campo que sejam utilizados na clausula WHERE diminui de horas para segundos processamentos em tabelas com milhoes de registros.
(mas cuidado, se a tabela tem grande alteração de dados --insert,update, delete-- indexes causarão lentidão nestes processos , ou seja, tenha cautela e consulte um DBA para auxiliá-lo)
Outra coisa que pode melhorar mais uns 50% do tempo se a tabela da consulta for muito grande ou tende a crescer.
Olá
faça o seguinte
mude a sua string de conexao
Provider=MSDAORA.1;Password=SUASENHA;User ID=SEUUSUARIO;Data Source=SEUBANCODEDADOS
na sua rotina
crie um recordset
dim Rs1 as new adodb.recordset
var_sql = "select * from tab_clientes"
set rs1 = cn.execute( var_sql )
if not ( rs1.eof and rs1.bof ) then
do while not rs1.eof
?
?
?
loop
endif
abçs
T+
set rs1 = nothing
faça o seguinte
mude a sua string de conexao
Provider=MSDAORA.1;Password=SUASENHA;User ID=SEUUSUARIO;Data Source=SEUBANCODEDADOS
na sua rotina
crie um recordset
dim Rs1 as new adodb.recordset
var_sql = "select * from tab_clientes"
set rs1 = cn.execute( var_sql )
if not ( rs1.eof and rs1.bof ) then
do while not rs1.eof
?
?
?
loop
endif
abçs
T+
set rs1 = nothing
Esta dica não é de desempenha, mas de flexibilização do código
Substitua a Constante '01-JAN-2000' por um arametro recebido pela função:
Substitua a Constante '01-JAN-2000' por um arametro recebido pela função:
Private Function Exportar_Arquivo(ByRef sMsg As String, ByRef DATA_INICIO AS Date) As Boolean
.....
If lContinua Then
sSql = "Select * from Clientes "
sSql = sSql & "Where Dt_Cadastro >= '" & DATA_INICIO & "' "
hehehe
mudando o tipo de cursor não tera mais validade a linha:
If rec.RecordCount = 0 Then
Teremos que substituir para identifica RecordSet vazios mais rapidamente.
if rec.BOF and rec EOF then
mudando o tipo de cursor não tera mais validade a linha:
If rec.RecordCount = 0 Then
Teremos que substituir para identifica RecordSet vazios mais rapidamente.
if rec.BOF and rec EOF then
Substitua estes comando unitariamente do seu Loop por Lotes de Dezenas, Centenas ou Milhares se quiser otimizar o tempo.
Passando um lote determinado de registros então execute.
LblQtde.Caption = nQtdeRegistros
LblQtde.Refresh
Obviamente seu user vai ficar sem uma nocao exata onde está, mas tambem n fica sem nenhuma referencia de processamento.
Passando um lote determinado de registros então execute.
LblQtde.Caption = nQtdeRegistros
LblQtde.Refresh
Obviamente seu user vai ficar sem uma nocao exata onde está, mas tambem n fica sem nenhuma referencia de processamento.
Nunca acaba:
Substitua "Select * from Clientes " por:
SELECT campo1, campo2, campo3 FROM tabela
A idéia é utilizar o mÃnimo de campos que for possÃvel, mesmo que tenhamos que gerar 2 relatórios ou mais , o print e o RS ficam mais rapidos
Uma ideia bem bacana é permitir ao user também escolher os campos que aparecerão no report ... ae fica por conta dele o desempenho
Substitua "Select * from Clientes " por:
SELECT campo1, campo2, campo3 FROM tabela
A idéia é utilizar o mÃnimo de campos que for possÃvel, mesmo que tenhamos que gerar 2 relatórios ou mais , o print e o RS ficam mais rapidos
Uma ideia bem bacana é permitir ao user também escolher os campos que aparecerão no report ... ae fica por conta dele o desempenho
Tópico encerrado , respostas não são mais permitidas