none
Ajuda importação Oracle x SQL RRS feed

  • Discussão Geral

  • Amigos,
     
    tenho um processo (vide abaixo), onde realizo um select em uma tabela Oracle de 80 Milhões de registro e carrego na base SQL Server, porém ao termino eu realizo alguns procedimentos, são eles:

    1. Troca no tipo de dados para cada campo
    2. Criação de um Index Clustered
    3. Criação de um Index não Clustered.

    Minha dúvida é:

    Estou utilizado a melhor maneira para importação?

    É melhor importar e depois trocar  tipo de dados ou no momento do select já converte os campos para algum tipo de dados equivalente ao SQLSERVER?

    É viavel utilizar o commint?

    Desde já agradeço
    Daniel
    quinta-feira, 5 de fevereiro de 2009 16:18

Todas as Respostas

  •  DrAlves,

    Como você esta realizando a importação?

    Qual é a ferramenta que você esta trabalhando?
    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    quinta-feira, 5 de fevereiro de 2009 16:27
  • Esqueci de colocar o comando. Estou executado através de um OpenQuery que é chamado em um Job.

     

    if exists(select * from sysobjects where name = 'D_Faturas_Base_Oi')

          drop table D_Faturas_Base_Oi
     

    select * into D_Faturas_Base_Oi

    from OPENQUERY

    (DW2PRD,'Select ID_FATURA              ,
      FAT_ARBOR              ,
      DT_VENC                ,
      VL_FATURA              ,
      DIAS_ATR               ,
      VL_DISPUTA             ,
      DT_DISPUTA             ,
      VL_AJUSTE              ,
      DT_AJUSTE              ,
      FLG_PARC               ,
      CICLO                  ,
      SEG_CLI                ,
      FORMA_PG               ,
      AGE_CONTA              ,
      DEALER                 ,
      PRODUTO                ,
      SCORE                  ,
      CL_RISCO               ,
      CANAL                  ,
      VL_N_FAT               ,
      LIM_CRED               ,
      MES_REF                ,
      WO_COB                 ,
      WO_FRAUDE              ,
      SLD_DEV                ,
      UF                     ,
      DT_PGG                 ,
      VL_PGG                 ,
      ROW_ID                 ,
      REGIONAL               ,
      TIPO_DOC               ,
      CONTA_SIEB             ,
      ID_AG                  ,
      CPF_CNPJ_A             ,
      DT_ATIV                ,
      BEHAVIOUR              ,
      STATUS                 ,
      FLG_1_PG               ,
      PLANO                  ,
      DT_PRORROG             ,
      CAMPANHA               ,
      MSISDN                 ,
      VENC_ORIG              ,
      CT_CLI_SIE             ,
      QTD_MSISDN             ,
      PRE_PG                 ,
      INTELIG                ,
      VESPER                 ,
      TELEMAR                ,
      TERCEIROS              ,
      OI                     ,
      EMBRATEL               ,
      OI_ID                  ,
      ABONO                  ,
      INTERINA               ,
      CEP                    ,
      MESANO_VENC            ,
      QTD_MSISDN_ATIVO       ,
      QTD_MSISDN_INATIVO     ,
      S_COD_PDV_SAP     ,
      S_PLANO_PRECO_MSISDN   ,
      S_PLANO_PRECO_CREDITO  ,
      DT_EMISSAO
    From SCOPE.SCOPE_BASEFATURAS')


    ALTER TABLE D_Faturas_Base_Oi ALTER COLUMN ID_FATURA BigInt
    ALTER TABLE D_Faturas_Base_Oi ALTER COLUMN FAT_ARBOR BigInt
    ALTER TABLE D_Faturas_Base_Oi ALTER COLUMN DT_VENC DATETIME
    ALTER TABLE D_Faturas_Base_Oi ALTER COLUMN VL_FATURA DECIMAL(23,2)
    ALTER TABLE D_Faturas_Base_Oi ALTER COLUMN DIAS_ATR BIGINT
    ALTER TABLE D_Faturas_Base_Oi ALTER COLUMN VL_DISPUTA Decimal (23,2)
    ALTER TABLE D_Faturas_Base_Oi ALTER COLUMN DT_DISPUTA DATETIME
    ALTER TABLE D_Faturas_Base_Oi ALTER COLUMN VL_AJUSTE Decimal (23,2)
    ALTER TABLE D_Faturas_Base_Oi ALTER COLUMN DT_AJUSTE DATETIME
    ALTER TABLE D_Faturas_Base_Oi ALTER COLUMN FLG_PARC CHAR(1)
    ALTER TABLE D_Faturas_Base_Oi ALTER COLUMN CICLO Varchar(50)
    ALTER TABLE D_Faturas_Base_Oi ALTER COLUMN SEG_CLI Varchar(50)
    ALTER TABLE D_Faturas_Base_Oi ALTER COLUMN FORMA_PG Varchar(50)
    ALTER TABLE D_Faturas_Base_Oi ALTER COLUMN AGE_CONTA BIGINT
    ALTER TABLE D_Faturas_Base_Oi ALTER COLUMN DEALER BIGINT
    ALTER TABLE D_Faturas_Base_Oi ALTER COLUMN PRODUTO VARCHAR
    ALTER TABLE D_Faturas_Base_Oi ALTER COLUMN SCORE BIGINT
    ALTER TABLE D_Faturas_Base_Oi ALTER COLUMN CL_RISCO CHAR(1)
    ALTER TABLE D_Faturas_Base_Oi ALTER COLUMN CANAL VARCHAR(50)
    ALTER TABLE D_Faturas_Base_Oi ALTER COLUMN VL_N_FAT Decimal (23,2)
    ALTER TABLE D_Faturas_Base_Oi ALTER COLUMN LIM_CRED Decimal (23,2)
    ALTER TABLE D_Faturas_Base_Oi ALTER COLUMN MES_REF DATETIME
    ALTER TABLE D_Faturas_Base_Oi ALTER COLUMN WO_COB BIGINT
    ALTER TABLE D_Faturas_Base_Oi ALTER COLUMN WO_FRAUDE BIGINT
    ALTER TABLE D_Faturas_Base_Oi ALTER COLUMN SLD_DEV DECIMAL (23,2)
    ALTER TABLE D_Faturas_Base_Oi ALTER COLUMN UF CHAR(3)
    ALTER TABLE D_Faturas_Base_Oi ALTER COLUMN DT_PGG DATETIME
    ALTER TABLE D_Faturas_Base_Oi ALTER COLUMN VL_PGG DECIMAL (23,2)
    ALTER TABLE D_Faturas_Base_Oi ALTER COLUMN ROW_ID VARCHAR(50)
    ALTER TABLE D_Faturas_Base_Oi ALTER COLUMN REGIONAL CHAR(2)
    ALTER TABLE D_Faturas_Base_Oi ALTER COLUMN TIPO_DOC BIGINT
    ALTER TABLE D_Faturas_Base_Oi ALTER COLUMN CONTA_SIEB BIGINT
    ALTER TABLE D_Faturas_Base_Oi ALTER COLUMN ID_AG BIGINT
    ALTER TABLE D_Faturas_Base_Oi ALTER COLUMN CPF_CNPJ_A BIGINT
    ALTER TABLE D_Faturas_Base_Oi ALTER COLUMN DT_ATIV DATETIME
    ALTER TABLE D_Faturas_Base_Oi ALTER COLUMN BEHAVIOUR CHAR(1)
    ALTER TABLE D_Faturas_Base_Oi ALTER COLUMN STATUS VARCHAR(50)
    ALTER TABLE D_Faturas_Base_Oi ALTER COLUMN FLG_1_PG CHAR(1)
    ALTER TABLE D_Faturas_Base_Oi ALTER COLUMN PLANO VARCHAR(50)
    ALTER TABLE D_Faturas_Base_Oi ALTER COLUMN DT_PRORROG DATETIME
    ALTER TABLE D_Faturas_Base_Oi ALTER COLUMN CAMPANHA VARCHAR(50)
    ALTER TABLE D_Faturas_Base_Oi ALTER COLUMN MSISDN BIGINT
    ALTER TABLE D_Faturas_Base_Oi ALTER COLUMN VENC_ORIG DATETIME
    ALTER TABLE D_Faturas_Base_Oi ALTER COLUMN CT_CLI_SIE VARCHAR(50)
    ALTER TABLE D_Faturas_Base_Oi ALTER COLUMN QTD_MSISDN BIGINT
    ALTER TABLE D_Faturas_Base_Oi ALTER COLUMN PRE_PG DECIMAL (23,2)
    ALTER TABLE D_Faturas_Base_Oi ALTER COLUMN INTELIG DECIMAL (23,2)
    ALTER TABLE D_Faturas_Base_Oi ALTER COLUMN VESPER DECIMAL (23,2)
    ALTER TABLE D_Faturas_Base_Oi ALTER COLUMN TELEMAR DECIMAL (23,2)
    ALTER TABLE D_Faturas_Base_Oi ALTER COLUMN TERCEIROS DECIMAL (23,2)
    ALTER TABLE D_Faturas_Base_Oi ALTER COLUMN OI DECIMAL (23,2)
    ALTER TABLE D_Faturas_Base_Oi ALTER COLUMN EMBRATEL DECIMAL (23,2)
    ALTER TABLE D_Faturas_Base_Oi ALTER COLUMN OI_ID DECIMAL (23,2)
    ALTER TABLE D_Faturas_Base_Oi ALTER COLUMN ABONO DECIMAL (23,2)
    ALTER TABLE D_Faturas_Base_Oi ALTER COLUMN INTERINA BIGINT
    ALTER TABLE D_Faturas_Base_Oi ALTER COLUMN MESANO_VENC BIGINT
    ALTER TABLE D_Faturas_Base_Oi ALTER COLUMN QTD_MSISDN_ATIVO BIGINT
    ALTER TABLE D_Faturas_Base_Oi ALTER COLUMN QTD_MSISDN_INATIVO BIGINT
    ALTER TABLE D_Faturas_Base_Oi ALTER COLUMN S_COD_PDV_SAP BIGINT
    ALTER TABLE D_Faturas_Base_Oi ALTER COLUMN S_PLANO_PRECO_MSISDN BIGINT
    ALTER TABLE D_Faturas_Base_Oi ALTER COLUMN S_PLANO_PRECO_CREDITO BIGINT
    ALTER TABLE D_Faturas_Base_Oi ALTER COLUMN DT_EMISSAO DATETIME





     

    CREATE UNIQUE CLUSTERED INDEX [PK_D_Faturas_Base_Oi] ON [dbo].[D_Faturas_Base_Oi]

    (

        ID_FATURA ASC,

        FAT_ARBOR ASC
     

    )



     

    CREATE NONCLUSTERED INDEX [D_Idx_D_Faturas_Base_Oi] ON [dbo].[D_Faturas_Base_Oi]

    (

     DT_VENC ASC,

     VL_FATURA ASC,

     SLD_DEV ASC,

     VL_PGG ASC,

     VL_AJUSTE ASC,

     INTELIG ASC,
     
     VESPER ASC,

     TELEMAR ASC,

     TERCEIROS ASC,

     OI ASC,

     EMBRATEL ASC
    )

    quinta-feira, 5 de fevereiro de 2009 16:32
  • Boa Tarde,

    Primeiramente edite o seu post e coloque o código em um formato legível (você deve colocar no formato SQL e não HTML).

    Do ponto de vista de extração, certamente essa não é a melhor prática, mas não posso condenar o procedimento, pois, não sei que ferramentas você tem a mão. O ideal seria partir pro SSIS se possível.

    Do ponto de vista de procedimentos pós- extração acredito que trocar o tipo de dados para cada campo seja muito dispendioso. Possivelmente ele irá reconstruir a tabela de 80 milhões de registro a cada tipo de dados que for trocado e isso demanda muito tempo e recursos. Seria melhor se durante a extração os tipos já fossem mapeados corretamente. Idealmente você não deve alterar os tipos de dados das tabelas de destino.

    A reconstrução do índice (clustered primeiro e nonclustered depois) é indicada somente se toda carga você estiver repopulando a tabela. Se a tabela já possuir registros, é preciso rever, pois, se uma tabela possui por exemplo 1bilhão de registros e por conta de 80milhões você está dropando o índice a carga é mais rápida, mas a reconstrução do índice é infinitamente mais lenta.

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com
    Classifique as respostas. O seu feedback é imprescindível
    quinta-feira, 5 de fevereiro de 2009 16:39
  • Já editei o Post. Eu tenho o SSIS mas acho que irá demorar mais, conforme outras dificuldades que já tive e me indicaram desta maneira.

    A reconstrução do indice é necessário, pois eu drop a tabela em questão e realizo um Select INTO na mesma..

    Então uma coisa é certa devo realizar a trasformação do campo no momento do Select lá no ORACLE. Quanto o ambiente ainda estou na dúvida.
    Daniel
    quinta-feira, 5 de fevereiro de 2009 16:58
  • Olá Daniel,

    Não estou certo se o SSIS irá demorar mais visto que é uma ferramenta bem mais apropriada do que um código TSQL. Apenas um teste pode afirmar, mas eu ainda optaria pelo SSIS se possível. Não sei quem lhe indicou, mas imagino que tenha analisado suas alternativas e restrições para indicar essa solução (seria a última que eu iria utilizar para um volume desses). O SSIS ou o Loader do ORACLE combinado com o BCP do SQL Server certamente são soluções muito mais performáticas.

    Se possível, faça o SELECT no ORACLE já para converter os campos para tipos compatíveis com o SQL Server. Utilizar um ALTER COLUMN pode na pior das hipóteses provocar a reconstrução da tabela em cada instrução. É muito ineficiente reconstruir uma tabela com 80 milhões de registros várias vezes. Se você fizer a consulta para retornar tipos compatíveis, não irá precisar reconstruí-la.

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com
    Classifique as respostas. O seu feedback é imprescindível
    quinta-feira, 5 de fevereiro de 2009 17:16
  • Vou testar as duas opções. SSIS e o TSQL.  Porém se eu utilizar o SSIS como vou fazer para converte os tipos de dados?
    Daniel
    quinta-feira, 5 de fevereiro de 2009 17:21
  • Boa Tarde,

    Há tarefas no SSIS para fazer a conversão, mas recomendo fazer a conversão já na query submetida ao ORACLE. O SSIS faria isso mais facilmente com o Derived Column e ainda assim seria mais eficiente que o TSQL. Só que se você fizer no ORACLE não há esse Overhead extra.

    Considere pedir ao DBA Oracle que gere os arquivos TXT com os dados que você precisa. O SQL Server possui o utilitário BCP que importa milhões de registros em poucos minutos (já consegui importar 3 milhões de registros em 1 minuto). Como sua carga não parece ter transformação, esse seria o método mais eficiente.

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com


    Classifique as respostas. O seu feedback é imprescindível
    quinta-feira, 5 de fevereiro de 2009 17:29
  • DrAlves,

    Com certeza a flexibilidade existente no SSIS, poderá contribuir muito para o processo de importação, existente diversos componentes que poderam ser utilizados para facilitar todo processo de carga, extração e transformação.

    Concordo com a sugestão do Gustavo em realizar a conversão dos dados na query e passar já convertido para o SSIS, o ganho de processamento é muito grande, e a probabilidade de falhar de conversão e gravação dos dados é bem menor!!!


    Também vejo como ótima solução utilizar o utilitário bcp ou até mesmo o SQLCMD para gerar um arquivo txt.

    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    quinta-feira, 5 de fevereiro de 2009 17:42
  • Gustavo,

    Estou querendo deixar processo rodando hoje a noite. Sendo assim ainda tenho algumas dúvidas:

    Utilizo o componete Execute SQL TASK ou OLE DB? Se for o OLE DB SOURCE como vou fazer a consersão?

    Aproveito para tirar uma dúvida sobre o BCP. Como faço para utilizar esse BCP? Onde ele fica no SSIS?

    Gustavo muito obrigado + uma vez.
    Daniel
    quinta-feira, 5 de fevereiro de 2009 18:16
  • Olá Daniel,

    Utilize o OLEDB Source. Utilizar o Execute SQL Task é o mesmo que fazer a consulta no SQL Server Management Studio. Ao invés de escolher uma tabela ou uma View, escolha a opção SQLCommand e coloque sua consulta no OLEDB Source do ORACLE, utilize as funções TO_CHAR, CAST, etc do Oracle na consulta para fazer as conversões necessárias.

    O BCP não é uma tarefa do SSIS. Ele é um utilitário de comando para importar dados de um arquivo TXT. Ele só é válido, se ao invés de você conectar-se ao ORACLE, o DBA de ORACLE lhe entregar os dados necessários em um arquivo TXT.

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com
    Classifique as respostas. O seu feedback é imprescindível
    quinta-feira, 5 de fevereiro de 2009 18:28
  • Gustavo,

    infelizmente não consegui deixar rodando. Como vc pode perceber deixei de me comunicar com vcs, pois entrei em uma reunião.

    Fiz exatamente o que você indicou e está rodando. Vamos aguardar

    Com relação ao arq.txt eu tenho um arquivo que possui 200 Milhoes de registro e gostaria de usar BCP. Vc tem algum exemplo?
    Daniel
    sexta-feira, 6 de fevereiro de 2009 11:23
  • Bom Dia Daniel,

    Não possuo nenhum exemplo de BCP no momento, mas a Internet está cheia deles.
    Você poderá encontrar maiores informações no link abaixo:

    Utilize BCP with SQL Server 2000
    http://www.databasejournal.com/features/mssql/article.php/3391761/Utilize-BCP-with-SQL-Server-2000.htm

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com
    Classifique as respostas. O seu feedback é imprescindível
    sexta-feira, 6 de fevereiro de 2009 11:38
  • Gustavo,

    O Bulk Insert Task é a mesma coisa do que BCP?
    Daniel
    sexta-feira, 6 de fevereiro de 2009 12:54
  • Olá Daniel,

    Sim. A diferença é que o Bulk INSERT é uma instrução TSQL enquanto o BCP é um prompt de comando. O BCP permite tanto importar quanto exportar dados em TXT enquanto que o BULK INSERT permite apenas a importação.

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com
    Classifique as respostas. O seu feedback é imprescindível
    sexta-feira, 6 de fevereiro de 2009 13:17
  • na pratica

    bulk insert tabela from 'caminho\arquivo'

    com bcp

    ( prompt do dos )

    http://www.freecode.com.br/drartigos/artigo.php?cdart=171&id=17381


    mcolla@bol.com.br
    sexta-feira, 6 de fevereiro de 2009 13:32