SELECT COM UMA GRANDE MASSA DE DADOS

TIAGOPASSARELLA 25/05/2012 17:35:18
#402811
BOA TARDE AMIGOS TUDO BEM??
PESSOAL GOSTARIA DE UMA AJUDA DE VCS NA SEGUINTE QUESTAO...
EU TENHO UM CLIENTE QUE TEM TODO MES UMA MEDIA DE 100 MIL REGISTROS... E PARA REALIZAR ALGUMAS TAREFAS INTERNAS EU TENHO DE PEGAR ESSES 100 MIL REGISTROS E TRANSFERIR PARA UM OUTRO BCO DE DADOS.... OS DOIS BCOS EM QUESTAO SAO FIREBIRD
POREM UM SELECT DESSE FICA MUITO PESADO E LEVA EM MEDIA 30 MIN EM UMA MAQUINA BOA....

EXISTE UMA FORMA QUE EU POSSA AGILIZAR O PROCESSO???

EU USO VB.NET E BCO FIREBIRD....

ABRAÇOS... A TODOS...

SEGUE ABAIXO UM EXEMPLO DO CODIGO Q EU USO...

PS.: EU CARREGUEI UM BLOCO DE NOTAS COM ALGUMAS INFORMAÇÕES PRA TNETAR AGILIZAR ATE AGILIZOU MAS MEMSO ASSIM TA MUITO LENTO....

ESPERO QUE POSSAM ME AJUDAR....


[c] If Conectado = False Then
ConexaoFB()
End If
Dim sql As String = [Ô][Ô]
Dim sw As New IO.StreamWriter([Ô]C:\SUPERSYS\SPEDPISCOFINS.TXT[Ô])
Dim fcmd1 As New FbCommand
fcmd1.Connection = FCnn
Dim fcmd2 As New FbCommand
fcmd2.Connection = FCnn
Dim fcmd3 As New FbCommand
fcmd3.Connection = FCnn
Dim fcmd4 As New FbCommand [ô]conexao com bco dados do spedfiscal pis/cofins
fcmd4.Connection = FCnnSPED
Dim fcmd5 As New FbCommand
fcmd5.Connection = FCnn
Dim fcmd6 As New FbCommand
fcmd6.Connection = FCnn
fcmd6.CommandText = [Ô]SELECT DISTINCT NUMEROCUPOM,DATAREG FROM TBITENSVENDA WHERE DATAREG>= [ô][Ô] & CDate(Me.txtDTI.Text).ToString([Ô]MM/dd/yyyy[Ô]) & [Ô][ô] And DATAREG<= [ô][Ô] & CDate(Me.txtDTF.Text).ToString([Ô]MM/dd/yyyy[Ô]) & [Ô][ô][Ô]
FR6 = fcmd6.ExecuteReader()
Dim TOTAL_CUPOM As String = [Ô][Ô]
Dim CNPJ_CLI As String = [Ô][Ô]
Dim NOME_CLI As String = [Ô][Ô]
Dim ID_CUPOM As String = [Ô][Ô]
Dim vl1 As Integer = 0
Dim QR As Integer = 0
Dim SSQ As String = [Ô][Ô]
Dim ALIQ_ECF As String = [Ô][Ô]
Dim VAL_PIS As String = [Ô][Ô]
Dim VAL_COFINS As String = [Ô][Ô]
Dim TOT_PIS As String = [Ô][Ô]
Dim TOT_COFINS As String = [Ô][Ô]
Dim ALIQECF2 As String = [Ô][Ô]
Dim PICMS As String = [Ô][Ô]
Dim VICMS As String = [Ô][Ô]
Dim valor_total As Double
Dim valor_desconto As String = [Ô][Ô]
Dim DESCRICAO As String = [Ô][Ô]
Dim CLASSIFICACAO As String = [Ô][Ô]
Dim DT As String = [Ô][Ô]
Dim CSTPIS As String = [Ô][Ô]
Dim TEXTO() As String
Dim CP As String = [Ô][Ô]
Dim CSTCOFINS As String = [Ô][Ô]
Dim UNIDADE As String = [Ô][Ô]
Dim esp As String = [Ô][Ô]
Dim LINHA As String = [Ô][Ô]
Dim VL As Integer = 0
Dim TOT_CP As String = [Ô][Ô]
SSQ = fcmd6.CommandText
PB.Minimum = 0
PB.Visible = False
[ô]\\\INSERINDO CABEÇA DAS NOTAS FISCAIS
Do While FR6.Read
QR = QR + 1
fcmd2.CommandText = [Ô]SELECT SUM(VALORTOTAL-DESCONTO) AS TOTAL FROM TBITENSVENDA WHERE DATAREG=[ô][Ô] & CDate(FR6([Ô]DATAREG[Ô]).ToString).ToString([Ô]MM/dd/yyyy[Ô]) & [Ô][ô] AND NUMEROCUPOM=[ô][Ô] & FR6([Ô]NUMEROCUPOM[Ô]).ToString & [Ô][ô][Ô]
FR2 = fcmd2.ExecuteReader()
If FR2.Read Then
TOT_CP = FR2([Ô]TOTAL[Ô]).ToString
End If
FR2.Close()
sw.WriteLine(FR6([Ô]NUMEROCUPOM[Ô]).ToString & [Ô]|[Ô] & TOT_CP & [Ô]|[Ô] & FR6([Ô]DATAREG[Ô]).ToString)
Loop
sw.Flush()
sw.Close()
FR6.Close()
PB.Maximum = QR
PB.Visible = True
Dim SR As StreamReader = New StreamReader([Ô]C:\SUPERSYS\SPEDPISCOFINS.TXT[Ô], System.Text.Encoding.Default)
Do
VL = VL + 1
LINHA = SR.ReadLine()
If LINHA = [Ô][Ô] Then
Exit Do
End If
TEXTO = LINHA.Split([Ô]|[Ô])
CP = TEXTO(0)
TOT_CP = TEXTO(1)
DT = TEXTO(2)
vl1 = vl1 + 1
If ConectadoSPED = False Then
ConexaoSPED()
End If
fcmd1.CommandText = [Ô]SELECT I.ID,I.DATAREG,I.NUMEROCUPOM,I.CODCLI,I.NUMEROECF,I.CODIGO,V.TOTAL,C.CNPJCPF,C.RAZAOSOCIAL FROM TBITENSVENDA AS I INNER JOIN ECF_TOTAL AS V ON (I.NUMEROCUPOM=V.NUMEROCUPOM) INNER JOIN TBCLIENTES AS C ON (I.CODCLI=C.CODCLIENTE) WHERE I.NUMEROCUPOM=[ô][Ô] & CP & [Ô][ô] AND I.DATAREG=[ô][Ô] & CDate(DT).ToString([Ô]MM/dd/yyyy[Ô]) & [Ô][ô][Ô]
FR1 = fcmd1.ExecuteReader()
If FR1.Read Then
ID_CUPOM = FR1([Ô]ID[Ô]).ToString
TOTAL_CUPOM = TrataValor(TOT_CP)
CNPJ_CLI = FR1([Ô]CNPJCPF[Ô]).ToString
NOME_CLI = FR1([Ô]RAZAOSOCIAL[Ô]).ToString
If CNPJ_CLI = [Ô][Ô] Then
CNPJ_CLI = [Ô]99999999999999[Ô]
End If
If NOME_CLI = [Ô][Ô] Then
NOME_CLI = [Ô]CONSUMIDOR FINAL[Ô]
End If
sql = [Ô][Ô]
sql = sql & [Ô]Insert Into ECFCUPOM ([Ô]
sql = sql & [Ô]ID,[Ô]
sql = sql & [Ô]ECF_CX,[Ô]
sql = sql & [Ô]COD_SIT,[Ô]
sql = sql & [Ô]NUM_DOC,[Ô]
sql = sql & [Ô]DT_DOC,[Ô]
sql = sql & [Ô]VL_DOC,[Ô]
sql = sql & [Ô]CPFCNPJ,[Ô]
sql = sql & [Ô]NOM_ADQ[Ô]
sql = sql & [Ô]) Values ([Ô]
sql = sql & [Ô][ô][Ô] & FR1([Ô]ID[Ô]).ToString & [Ô][ô],[Ô]
sql = sql & [Ô][ô][Ô] & FR1([Ô]NUMEROECF[Ô]).ToString & [Ô][ô],[Ô]
sql = sql & [Ô][ô]00[ô],[Ô]
sql = sql & [Ô][ô][Ô] & FR1([Ô]NUMEROCUPOM[Ô]).ToString & [Ô][ô],[Ô]
sql = sql & [Ô][ô][Ô] & CDate(DT).ToString([Ô]MM/dd/yyyy[Ô]) & [Ô][ô],[Ô]
sql = sql & [Ô][ô][Ô] & Str(CDbl(TOTAL_CUPOM)) & [Ô][ô],[Ô]
sql = sql & [Ô][ô][Ô] & CNPJ_CLI & [Ô][ô],[Ô]
sql = sql & [Ô][ô][Ô] & NOME_CLI & [Ô][ô])[Ô]
fcmd4 = New FbCommand(sql, FCnnSPED)
Try
fcmd4.ExecuteNonQuery()
Catch ex As Exception

End Try

[ô]\\ITENS CUPOM FISCAL
fcmd5.CommandText = [Ô]SELECT T.CODIGO,T.QUANTIDADE,T.CFOP,T.CST,T.ALIQUOTA,T.VALORTOTAL,T.DESCONTO FROM TBITENSVENDA AS T WHERE T.DATAREG=[ô][Ô] & CDate(DT).ToString([Ô]MM/dd/yyyy[Ô]) & [Ô][ô] AND NUMEROCUPOM=[ô][Ô] & FR1([Ô]NUMEROCUPOM[Ô]).ToString & [Ô][ô][Ô]
FR5 = fcmd5.ExecuteReader()
Do While FR5.Read
ALIQ_ECF = FR5([Ô]ALIQUOTA[Ô]).ToString
If ALIQ_ECF = [Ô]01[Ô] Then
ALIQ_ECF = [Ô]07.0[Ô]
ALIQECF2 = [Ô]01T0700[Ô]
PICMS = [Ô]7,00[Ô]
ElseIf ALIQ_ECF = [Ô]02[Ô] Then
ALIQ_ECF = [Ô]12.0[Ô]
ALIQECF2 = [Ô]01T1200[Ô]
PICMS = [Ô]12,00[Ô]
ElseIf ALIQ_ECF = [Ô]03[Ô] Then
ALIQ_ECF = [Ô]18.0[Ô]
ALIQECF2 = [Ô]01T1800[Ô]
PICMS = [Ô]18,00[Ô]
ElseIf ALIQ_ECF = [Ô]04[Ô] Then
ALIQ_ECF = [Ô]25.0[Ô]
ALIQECF2 = [Ô]01T2500[Ô]
PICMS = [Ô]25,00[Ô]
ElseIf ALIQ_ECF = [Ô]05[Ô] Then
ALIQ_ECF = [Ô]30.0[Ô]
ALIQECF2 = [Ô]01T3000[Ô]
PICMS = [Ô]30,00[Ô]
ElseIf ALIQ_ECF = [Ô]FF[Ô] Then
ALIQ_ECF = [Ô]00.0[Ô]
ALIQECF2 = [Ô]F0[Ô]
PICMS = [Ô]0,00[Ô]
ElseIf ALIQ_ECF = [Ô]II[Ô] Then
ALIQ_ECF = [Ô]0.00[Ô]
ALIQECF2 = [Ô]I0[Ô]
PICMS = [Ô]0,00[Ô]
ElseIf ALIQ_ECF = [Ô]NN[Ô] Then
ALIQ_ECF = [Ô]0.00[Ô]
ALIQECF2 = [Ô]N0[Ô]
PICMS = [Ô]0,00[Ô]
End If
CSTPIS = [Ô]01[Ô]
CSTCOFINS = [Ô]01[Ô]
DESCRICAO = [Ô]PRODUTO[Ô]
fcmd3.CommandText = [Ô]SELECT PIS,COFINS,DESCRICAO,CLASSIFICACAO,CSTPIS,CSTCOFINS,UNIDADE FROM TBPRODUTO WHERE (CODIGO=[ô][Ô] & FR5([Ô]CODIGO[Ô]).ToString & [Ô][ô]) OR (CODLOJA=[ô][Ô] & FR5([Ô]CODIGO[Ô]).ToString & [Ô][ô])[Ô]
FR3 = fcmd3.ExecuteReader()
If FR3.Read Then
VAL_PIS = FR3([Ô]PIS[Ô]).ToString
VAL_COFINS = FR3([Ô]COFINS[Ô]).ToString
DESCRICAO = Mid(FR3([Ô]DESCRICAO[Ô]).ToString, 1, 59)
CLASSIFICACAO = Mid(FR3([Ô]CLASSIFICACAO[Ô]).ToString, 1, 8)
CSTPIS = FR3([Ô]CSTPIS[Ô]).ToString
CSTCOFINS = FR3([Ô]CSTCOFINS[Ô]).ToString
UNIDADE = FR3([Ô]UNIDADE[Ô]).ToString
End If
FR3.Close()
CSTPIS = CSTPIS.PadLeft(2, [Ô]0[Ô])
CSTCOFINS = CSTCOFINS.PadLeft(2, [Ô]0[Ô])
If VAL_PIS = [Ô][Ô] Then
VAL_PIS = [Ô]0,00[Ô]
End If
If VAL_COFINS = [Ô][Ô] Then
VAL_COFINS = [Ô]0,00[Ô]
If CLASSIFICACAO = [Ô][Ô] Then
CLASSIFICACAO = [Ô]12345678[Ô]
End If
End If
Dim TAMANHO As String = [Ô]0[Ô]
valor_total = FormatNumber(FR5([Ô]VALORTOTAL[Ô]).ToString, 3)
valor_desconto = FormatNumber(FR5([Ô]DESCONTO[Ô]).ToString, 3)
TAMANHO = Len(Trim((valor_total)))
TAMANHO = TAMANHO - 1
If TAMANHO >= 4 Then
valor_total = FormatNumber(Mid(FR5([Ô]VALORTOTAL[Ô]).ToString, 1, TAMANHO), 2)
End If
VICMS = ((CDbl(valor_total) - CDbl(valor_desconto)) * CDbl(PICMS)) / 100
Dim TOT_PROD As String = CDbl(valor_total) - CDbl(valor_desconto)
Dim V_PIS As String = [Ô][Ô]
Dim V_COFINS As String = [Ô][Ô]
V_PIS = (CDbl(VAL_PIS) * CDbl(TOT_PROD)) / 100
V_COFINS = (CDbl(VAL_COFINS) * CDbl(TOT_PROD)) / 100
sql = [Ô][Ô]
sql = sql & [Ô]Insert Into ECFCUPOM_I
KERPLUNK 25/05/2012 17:48:59
#402813
1 - Organize seu programa usando OOP, vai ficar mais rápido já, só por isso.
2 - Separe as queries de modo a trazer menos registros e faça o processo, com massas de dados menores, usando mais parâmetros nas cláusulas [Ô]WHERE[Ô]
3 - Explique o que você precisa fazer, não mostre o código se não for necessário. Só olhando o código para nós ajuda muito pouco, precisamos ver a estrutura do seu banco, e se você informar o que quer fazer, podemos passar uma solução melhor.
TIAGOPASSARELLA 25/05/2012 18:04:43
#402817
ENTAO NA VERDADADE EU TENHO UMA TABELA ONDE CONTEM TODAS AS VENDAS DO MES E EU PRECISO PEGAR TODA ESSA TABELA E DISTRIBUILA EM 4 TABELAS DE UM OUTRO BANCO DE DADOS...
POREM SAO MUITOS REGISTROS COMO EU DISSE EM TORNO DE 100 MIL REGISTROS POR MES... E EU GOSTARIA DE AGILIZAR ISSO POIS ESTA DEMORANDO MUITO... SE EU COLOCAR NUM PC SIMPELS PRA FAZER ISSO TIPO 1GB DE RAM VAI FICAR MAIS DE 1 HORA E ISSO TA INVIAVEL...
EU ESTOU PENSANDO EM CRIAR ALGUMAS VIEWS PRA DIMINUIR OS SELECTS E AS CONDIÇÕES MAS MESMO ASSIM AINDA SERAO MUITOS REGISTROS... EXISTE MAIS ALGUMA FORMA DE FAZER ISSO?
KERPLUNK 25/05/2012 18:10:06
#402818
Qual das Queries que mais demora?
TIAGOPASSARELLA 25/05/2012 18:14:45
#402820
UMA DAS PIORES é ESSA AKI

  fcmd1.CommandText = [Ô]SELECT I.ID,I.DATAREG,I.NUMEROCUPOM,I.CODCLI,I.NUMEROECF,I.CODIGO,V.TOTAL,C.CNPJCPF,C.RAZAOSOCIAL FROM TBITENSVENDA AS I INNER JOIN ECF_TOTAL AS V ON (I.NUMEROCUPOM=V.NUMEROCUPOM) INNER JOIN TBCLIENTES AS C ON (I.CODCLI=C.CODCLIENTE) WHERE I.NUMEROCUPOM=[ô][Ô] & CP & [Ô][ô] AND I.DATAREG=[ô][Ô] & CDate(DT).ToString([Ô]MM/dd/yyyy[Ô]) & [Ô][ô][Ô] 


AS OUTRAS DEMORAM TBM MAS ESSA é A PIOR
KERPLUNK 25/05/2012 18:57:42
#402823
Ok, coloque aqui as estruturas de cada uma das tabelas e o que deve acontecer e eu monto as queries do melhor jeito possível pra vc...
AJSO 25/05/2012 19:07:56
#402825
Caro TIAGOPASSARELLA

Melhor maneira de gerar essa massa de dados seria prelicação entre os dois bancos

talves uma destas opções pode ajudar Refresh, Mirroring e Synchronization.

Cursores dentro de uma procedure pode faciliatar e diminuir o tempo de exportação entre bancos no firebird.

Você pode fazer direto pelo firebird utilizando o execute statement on external que ele irá se conectar ao outro banco e executar seu comando.


Boa sorte


TIAGOPASSARELLA 28/05/2012 10:56:23
#402951
COMO FUNCIONA ESSE execute statement ???
NAO CONHEÇO ESTA OPÇÃO
AJSO 28/05/2012 11:30:49
#402958
Car o


Citação:

:
COMO FUNCIONA ESSE execute statement ???
NAO CONHEÇO ESTA OPÇÃO



Basicamente muito parecido com DBLINK do Oracle mas com algumas restrições

Exemplo do uso do execute statement está dentro da procedsure a única regra para esse método éd enão poder criar tabelas ou banco de dados asm pode INSERT, UPDATE, DELETE and EXECUTE PROCEDURE



create procedure teste_atores(ProcName varchar(100))
as
declare variable stmt varchar(1024);
declare variable param int;
begin
select min(SomeField) from tblAtores into param;
stmt = [ô]execute procedure [ô]
|| ProcName
|| [ô]([ô]
|| cast(param as varchar(20))
|| [ô])[ô];
execute statement stmt;
end



Boa Sorte
Tópico encerrado , respostas não são mais permitidas