SELECT MAIS RAPIDO
Senhores,
TENHO UM PROJETO ONDE GERO UM AQUIVO TXT. EM ALGUMAS TABELAS QUE TEM MUITOS DADOS, DEMORA PARA COMEÇAR A GERAÇÃO.
ISSO ACONTECE ASSIM QUE ELE PASSA PELA LINHA QUE TEM O CÓ“DIGO (VERIFIQUEI ISSO COM F8):
rec.Open sSql, dbBanco, adOpenKeyset
NESTE MOMENTO ELE FICA CONTANDO OS REGISTROS.ENTÃO SE A TABELA TEM 50.000 REGISTROS, SÓ“ VAI COMEÇAR A GERAR O AQUIVO QUANDO TERMINAR DE CONTAR.
A PERGUNTA é: TEM ALGUMA FORMA DE AGILIZAR ISSO???
Vejam como está meu código:
TENHO UM PROJETO ONDE GERO UM AQUIVO TXT. EM ALGUMAS TABELAS QUE TEM MUITOS DADOS, DEMORA PARA COMEÇAR A GERAÇÃO.
ISSO ACONTECE ASSIM QUE ELE PASSA PELA LINHA QUE TEM O CÓ“DIGO (VERIFIQUEI ISSO COM F8):
rec.Open sSql, dbBanco, adOpenKeyset
NESTE MOMENTO ELE FICA CONTANDO OS REGISTROS.ENTÃO SE A TABELA TEM 50.000 REGISTROS, SÓ“ VAI COMEÇAR A GERAR O AQUIVO QUANDO TERMINAR DE CONTAR.
A PERGUNTA é: TEM ALGUMA FORMA DE AGILIZAR ISSO???
Vejam como está meu código:
Private Function Exportar_Arquivo(ByRef sMsg As String) As Boolean
Dim lContinua As Boolean
Dim sSql As String
Dim rec As New ADODB.Recordset
Dim sCNPJ As String
Dim sNMCLIENTE As String
On Error GoTo Fim
Arquivo.sArquivo = txtArquivo.Text
lContinua = True
If Trim(Arquivo.sArquivo) = "" Then
sMsg = "Informe o Nome do Arquivo!"
Else
If Dir(Arquivo.sArquivo) <> "" Then
lContinua = (MsgBox("Arquivo " + Arquivo.sArquivo & " já Existe. Sobrescrever?", vbQuestion + vbYesNo, Me.Caption) = vbYes)
End If
If lContinua Then
sSql = "Select * from Clientes "
sSql = sSql & "Where Dt_Cadastro >= '01-JAN-2000' "
rec.CursorLocation = adUseClient
rec.Open sSql, dbBanco, adOpenKeyset
If rec.RecordCount = 0 Then
sMsg = "Nenhum Registro Encontrado!"
Else
Arquivo.nArquivo = FreeFile
Open Arquivo.sArquivo For Output As #Arquivo.nArquivo
Arquivo.sRegistro = ""
nQtdeRegistros = 0
Arquivo.sRegistro = "000 - CABEÇALHO "
Print #Arquivo.nArquivo, Arquivo.sRegistro
Do While Not rec.EOF
nQtdeRegistros = nQtdeRegistros + 1
LblQtde.Caption = nQtdeRegistros
LblQtde.Refresh
Arquivo.sRegistro = Right("" & "", 1)
sCNPJ = IIf(Not IsNull(rec!CNPJ), rec!CNPJ, "")
sNOME = IIf(Not IsNull(rec!NOME), rec!NOME, "")
Arquivo.sRegistro = Arquivo.sRegistro & sCNPJ & ";"
Arquivo.sRegistro = Arquivo.sRegistro & sNOME & ";"
Print #Arquivo.nArquivo, Arquivo.sRegistro
rec.MoveNext
Loop
Close #Arquivo.nArquivo
'rtb.FileName = Arquivo.sArquivo
End If
End If
End If
rec.Close
Set rec = Nothing
Fim:
If Err.Number <> 0 Then
sMsg = Err.Number & "-" & Err.Description
End If
Exportar_Arquivo = (Trim(sMsg) = "")
End Function
Bem, estou sem o vb aqui no momento, porém, você pode declarar o seu recordset da seguinte forma (nçao mebro a posição exata do withevents):
Dim withevents rs as new adodb.recordset
aparecerá na combo de eventos (onkeypress, onresize..) alguns eventos relativos ao recordset.
um deles se não me engano é whileFetching, ou seja, euqnato esta preenchendo o recordset.
Tente ver se te ajuda, nunca usei para esta finalidade, mas não vejo outra forma.
Espero que te ajude.
Dim withevents rs as new adodb.recordset
aparecerá na combo de eventos (onkeypress, onresize..) alguns eventos relativos ao recordset.
um deles se não me engano é whileFetching, ou seja, euqnato esta preenchendo o recordset.
Tente ver se te ajuda, nunca usei para esta finalidade, mas não vejo outra forma.
Espero que te ajude.
Qual é o banco?
O banco que uso é ORACLE
MARCOSA,
NÃO DEU CERTO. é ASSIM MESMO?
Dim withevents rs as new adodb.recordset ????
NÃO DEU CERTO. é ASSIM MESMO?
Dim withevents rs as new adodb.recordset ????
declare a variavel fora de qualquer funçao, ou seja, no ÃnÃcio do seu form da seguinte forma:
Private WithEvents rs As new adodb.recordset
ou
Private WithEvents rs As adodb.recordset
Não lembro exatamente e estou sem o vb aqui.
Assim quando você for na lista de objetos do form, irá aparecer rs, você irá seleciona-lo e ao lado irão aparecer os eventos que temos ligados ao rs, você escolhe o evento que desejar...
Ai você terá de ver qual evento irá se adequr melhor ao que você deseja.
Espero que te ajude....
Se estiver errado, desculpe é que estou sem vb, então nem tenho como validar o código.
Private WithEvents rs As new adodb.recordset
ou
Private WithEvents rs As adodb.recordset
Não lembro exatamente e estou sem o vb aqui.
Assim quando você for na lista de objetos do form, irá aparecer rs, você irá seleciona-lo e ao lado irão aparecer os eventos que temos ligados ao rs, você escolhe o evento que desejar...
Ai você terá de ver qual evento irá se adequr melhor ao que você deseja.
Espero que te ajude....
Se estiver errado, desculpe é que estou sem vb, então nem tenho como validar o código.
Então pq não usa o cursor no servidor?
é, não tá funcionando. Tem algo errado. Vc pode ver pra mim e me mandar o código amanhã?
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.
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.
Se o seu banco eh ORACLE
Muda a sua conexão
para MSDAORA
e rode a sua sql novamente
aqui no supermercado acessamos bases de dados com até 3 milhões de
registros e tinhamos um problema parecido pois utilizamos na maioria dos aplicativos
ORAOLEDB.ORACLE
porém nas telas onde temos necessidade de maior agilidade
mudamos a conexão para MSDAORA
espero ter ajudado
abçs
t+
Muda a sua conexão
para MSDAORA
e rode a sua sql novamente
aqui no supermercado acessamos bases de dados com até 3 milhões de
registros e tinhamos um problema parecido pois utilizamos na maioria dos aplicativos
ORAOLEDB.ORACLE
porém nas telas onde temos necessidade de maior agilidade
mudamos a conexão para MSDAORA
espero ter ajudado
abçs
t+
MarceloHF
esse campo já é indice!
esse campo já é indice!
Tópico encerrado , respostas não são mais permitidas