SELECT MAIS RAPIDO

USUARIO.EXCLUIDOS 30/11/2006 12:09:33
#187164
FLAVIOALBIERO,

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???


USUARIO.EXCLUIDOS 30/11/2006 13:24:49
#187187
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".
USUARIO.EXCLUIDOS 30/11/2006 13:39:58
#187197
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.
USUARIO.EXCLUIDOS 30/11/2006 13:50:12
#187200
ao invés de você colocar assim:

If rec.RecordCount = 0 then

tenta assim:

If rec.Eof = False then
USUARIO.EXCLUIDOS 30/11/2006 13:51:06
#187201
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.
FLAVIOALBIERO 30/11/2006 14:46:54
#187221
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


USUARIO.EXCLUIDOS 30/11/2006 15:32:37
#187243
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:

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 & "' "
USUARIO.EXCLUIDOS 30/11/2006 15:36:44
#187246
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


USUARIO.EXCLUIDOS 30/11/2006 15:43:20
#187248
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.
USUARIO.EXCLUIDOS 30/11/2006 16:35:29
#187256
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
Página 2 de 3 [26 registro(s)]
Tópico encerrado , respostas não são mais permitidas