You are on page 1of 30

1

ESCOLA SUPERIOR ABERTA DO BRASIL ESAB

ADMINISTRAO DE SISTEMAS DE GERENCIAMENTO DE BANCO DE


DADOS: ESTUDO DAS MELHORES PRTICAS NO ORACLE 12C

Douglas Boff Nandi Ps-graduando em Engenharia de Sistemas na Escola Superior


Aberta do Brasil ESAB.
Hudson Ramos Mestre em Engenharia de Software.

Resumo
Neste artigo apresenta-se um levantamento bibliogrfica com referncias contemporneas
para o banco de dados Oracle 12c, bem como a realizao de testes prticos de distintas
cargas de dados, a fim de se obterem parmetros que possam auxiliar a um desenvolvedor na
escolha da melhor tcnica para se implementar tal funcionalidade. Como metodologia,
realizada uma pesquisa exploratria com coleta de dados por meio da pesquisa bibliogrfica e
experimental no qual os dados coletados com os ensaios so apresentados e discutidos
comparativamente. Com os resultados, pode-se observar os diferentes comportamentos das
tecnologias de cargas de dados com os distintos cenrios apresentados, o qual pode-se
concluir que diferentes situaes do dia-a-dia vo exigir diferentes tcnicas de
implementao, a fim de se obter o aproveitamento mximo dos recursos computacionais
disponveis.
Palavras-chave: Oracle 12c. Melhorias SQL. Carga de Dados.

Introduo
A crescente demanda pelo armazenamento de informaes de maneira computacional

torna a tarefa de administrao eficiente destes dados um desafio. Com isto, no s


fornecedores de Sistemas Gerenciadores de Banco de Dados (SGBD) vem buscando
melhorias na arquitetura das suas solues, como seus usurios vem buscando utilizar os
recursos disponveis da melhor forma possvel.
Dado o aumento da complexidade dos sistemas atuais, e o nmero de acessos
concorrentes que realizado de um sistema por diferentes operadores, os bancos de dados
podem vir a se tornar um gargalo no processamento em situaes de m utilizao.
E com o volume de dados em banco de dados cada vez maior, e maior informatizao
das empresas por diferentes sistemas, cada vez h mais a necessidade de realizar integraes
de dados entre estes sistemas. Os dados entre os sistemas, muitas vezes, precisam serem

integrados em tempo real para atendimento da necessidade dos usurios, enquanto outros
dados uma espera de at uma semana pode ser aceitvel.
Neste sentido, neste trabalho destina-se a apresentar um estudo e levantamento terico
de boas prticas de administrao de dados, tais como otimizaes nas construes de SQLs,
melhoria na parametrizao de ndices e otimizaes gerais para melhoria do desempenho de
aplicaes e de cargas de dados que so comuns ao dia-a-dia dos usurios e administradores
de bases de dados Oracle.
Para o estudo terico sobre o Oracle 12c, foram apontadas diferentes bibliografias
contemporneas, as quais buscam enfatizar as diferenas do mesmo com o seu antecessor, o
Oracle 11g.
A metodologia adotada para este artigo ser uma pesquisa exploratria com coleta de
dados por meio de pesquisa bibliogrfica e experimental. O experimento ser realizado por
meio de testes de carga de pequeno e mdio porte com os softwares Oracle 12c no ambiente
Windows 8.1. Os resultados sero apresentados na forma de um quadro comparativo.

Viso Aprofundada do Oracle 12c


Neste captulo apresenta-se conceitos e tecnologias especficas do Oracle que sero

utilizadas e sero base para entendimento dos experimentos.

2.1

Arquitetura Multi-Inquilino
A arquitetura da base de dados Oracle 12c Release 1 permite a configurao de vrias

sub-bases de dados dentro de uma nica base de dados superior. Este conceito foi denominado
de Continer de Base de Dados Multi-Inquilo (Multitenant Container Database ou
Consolidated Database (CDB)) suporta at 252 sub-bases, intituladas como Banco de Dados
Plugveis (Pluggable Database PDB) (LLEWELLYN, 2013) (ASHDOWN e KYTE,
2014).
Um PDB representa um conjunto de schemas, objetos schemas e objetos non-schema
que so vistos pelas sesses via Oracle Net Client como sendo uma base non-CDB, ou seja,
de forma convencional (ASHDOWN e KYTE, 2014). Na Figura 1 ilustra-se esta arquitetura.

Figura 1. Arquitetura CDB.


Fonte: (LLEWELLYN, 2013).

2.2

Gerenciamento de Usurios
Em uma arquitetura CDB, possvel tanto criar usurios comuns quanto usurios

locais (HUEY, 2014). O usurio comum, que deve ser nomeado com o prefixo C##, um
usurio conhecido pela raiz e por toda as PDBs. Estes usurios conectam diretamente raiz, e
podem possuir privilgios em um PDB. J o usurio local, que no pode ser nomeado com o
prefixo C##, conhecido apenas em um PDB especfico.

2.3

ndices
Um ndice uma estrutura opcional que pode ser criado relacionando-se a uma ou

mais colunas de uma tabela. Um ndice pode melhorar o desempenho da recuperao de


dados. Quando processando uma requisio, o banco de dados verifica se possvel utilizar os
ndices existentes de uma maneira eficiente. ndices so teis quando uma aplicao
frequentemente acessa uma linha ou um grupo de linhas (ASHDOWN e KYTE, 2014).

2.4

Diretrios
Os diretrios correspondem ponte entre o banco de dados Oracle e leitura e escrita

em arquivos do sistema operacional. Estes objetos provm uma camada de abstrao entre o
usurio e o sistema operacional (WATSON, 2014).

2.5

Estruturas de Armazenamento
Uma das caractersticas de um RDBMS a independncia entre as estruturas fsicas e

lgicas do banco de dados. Devido a esta independncia, possvel gerenciar as

configuraes de estrutura fsica sem afetar as estruturas lgicas, tornando a mudana


transparente para o usurio do banco de dados (ASHDOWN e KYTE, 2014).
Uma viso geral destes componentes fsicos e lgicos de armazenamento
demonstrado na Figura 2 e detalhado nas subsees seguintes.

Figura 2. Modelo de Armazenamento do Oracle 12c.


Fonte: (ASHDOWN e KYTE, 2014).

2.5.1 Tablespace
uma unidade de armazenamento do banco de dados para agrupamento de estruturas
lgicas, que contm muitos segmentos e muitos datafiles (ASHDOWN e KYTE, 2014),
conforme demonstrado na Figura 3.

Figura 3. Distribuio das estruturas lgicas por entre as estruturas de armazenamento fsicas e lgicas.

Fonte: (ASHDOWN e KYTE, 2014).

2.5.2 Segmento
Representa qualquer objeto do banco de dados que armazena dados e requer espao
fsico. Os segmentos tpicos so ndices e tabelas. Um segmento deve pertencer a um nico
tablespace, mas o tablespace pode ser dividido em vrios datafiles (ASHDOWN e KYTE,
2014), conforme demonstrado na Figura 3.

2.5.3 Extenso
O gerenciamento bloco a bloco pode tornar-se uma tarefa rdua, por isto os blocos so
agrupados em extenses. Uma extenso um conjunto de enumerados blocos Oracle
pertencentes a um datafile. Cada segmento consiste em uma ou mais extenses, tambm
enumeradas (ASHDOWN e KYTE, 2014).

2.5.4 Bloco Oracle


Representam a unidade de armazenamento lgico do Oracle o qual tem o tamanho
definido, no momento da instalao, o valor padro de 8kb (ASHDOWN e KYTE, 2014). O
relacionamento do Bloco Oracle com os demais componentes demonstrado na Figura 4.

Figura 4. Segmentos, Extenses e Blocos do Oracle.


Fonte: (ASHDOWN e KYTE, 2014).

2.5.5 Datafile
um arquivo fsico no disco que criado pelo banco de dados Oracle, e contm dados
e estruturas, tais como tabelas e ndices (ASHDOWN e KYTE, 2014).

2.5.6 Blocos do Sistema Operacional


Ao nvel fsico, os dados do banco de dados so armazenados no disco nas unidades de
blocos do sistema operacional. Trata-se da unidade mnima de tamanho que o SO pode lidar
atravs da leitura ou escrita (ASHDOWN e KYTE, 2014).

2.6

Shared Pool
A tecnologia Shared Pool do banco de dados Oracle pode armazenar e provisionar

diferentes tipos de dados, incluindo blocos PL/SQL e SQL, a qual pode gerar benefcios. Se
um comando SQL est no Shared Pool, parte da etapa de interpretao do comando omitida,
onde as informaes ficam disponveis para reutilizaes, reduzindo consumo de CPU e de
I/O (CHAN, 2014) (ALAPATI, KUHN e PADFIELD, 2013).

2.7

Movendo Dados
Uma das comuns necessidades em um ambiente de banco de dados movimentar estes

dados de um local para outro. Para estas demandas, a base de dados Oracle prov diversas
maneiras para realizar esta operao: Datapump, SQL*Loader, Ligaes de Bancos de Dados
ou Tabelas Externas (WATSON, 2014), os quais sero apresentados nas subsees seguintes.

2.7.1 Ligaes de Bancos de Dados


Dentre as opes disponveis est a utilizao de links de banco de dados. Este link
um objeto no banco de dados que habilita o acesso outra base de dados (ROESER, 2013),
podendo tornar o acesso a outra base transparente (ASHDOWN, 2014). Na Figura 5
demonstra-se a sintaxe para criao deste objeto.
CREATE [ SHARED ] [ PUBLIC ] DATABASE LINK dblink [ CONNECT TO {
CURRENT_USER | user IDENTIFIED BY password [ dblink_authentication ] }
| dblink_authentication ] [ USING connect_string ] ;
Figura 5. Comando para criao de um link entre bancos de dados.
Fonte: (OHEARN, 2010).

2.8

Tabelas Externas
Conforme a definio de OHEARN (2010), uma tabela externa a uma tabela onde a

sua definio (metadado) est no banco de dados, porm a tabela em si (contedo) reside fora
do banco de dados, proporcionando como uma das vantagens e principal benefcio a
facilidade de configurao e manipulao de dados que a mesma possibilita (OHEARN,
2010).
Para se declarar uma tabela externa, necessrio explicitar o metadado da tabela, o
nome e diretrio do arquivo externo e o driver de acesso e seus parmetros, conforme
demonstrado na Figura 6.

Figura 6. Arquitetura da Tecnologia de Tabelas Externas.


Fonte: (ASHDOWN e KYTE, 2014).

2.9

Data Pump
Segundo THOMAS (2014), o Oracle Data Pump mecanismo de alta velocidade para

transferir dados ou metadados de uma base de dados Oracle para outra. Este utilitrio um
executado do lado do servidor, e por isto tem acesso direto aos datafiles melhorando
drasticamente o desempenho (WATSON, 2014).
Os arquivos dump gerados pela exportao contm marcaes em XML, e isto pode
implicar em um overhead considervel dependendo da tabela. Desproporcionalmente maior
para tabelas menores, porm desconsiderveis para tabelas maiores (WATSON, 2014).

O Data Pump possui dois mtodos para carga e descarga de dados: caminho direto e
caminho de tabela externa. Para importar pelo mtodo do caminho direto, o Data Pump l do
arquivo de dump, usa o contedo para criar blocos de dados e os escreve diretamente no
datafile. J no mtodo tabela externa, o Data Pumo constri SQL Inserts do contedo do
arquivo de dump que est sendo lido e os executa pelo processo normal. A definio de um
mtodo ou outro que ser utilizado transparente para o usurio e depende da complexidade
da tabela que est sendo carregada/descarregada (ASHDOWN e KYTE, 2014).

2.10

SQL*Loader
A tecnologia de troca de dados entre diferentes bases disponvel no Oracle o

SQL*Loader, no qual um processo como os demais e ser requerido para ler dados gerados
por outras bases, desde que o formato seja compatvel (ROESER, 2013).
Para o carregamento de informaes, existem duas tcnicas: convencional e o caminho
direto. O mtodo convencional converte as linhas do arquivo lido em comandos INSERT.
Este mtodo usa o cache do banco e gera segmentos de UNDO e REDO. O comando
COMMIT deve ser realizado para efetuar a modificao no banco (ROESER, 2013).
J o mtodo caminho direto, ao contrrio do mtodo convencional, ignora o buffer
cache. O SQL*Loader neste caso acessa l o contedo do arquivo e envia-o para o processo
no servidor. Este processo monta blocos de tabelas na PGA e escreve estes dados diretamente
nos datafiles (ROESER, 2013).

Otimizao de Consultas

3.1

Criao e Otimizao de ndices


O ndice e seus atributos devem ser corretamente aplicados. A escolha correta e a

configurao do mesmo pode maximizar ainda mais o desempenho do banco de dados. Cada
coluna pode ser classificada de uma maneira diferente de outra em funo dos dados que ela
tende a possuir (ASHDOWN, 2014).
O banco de dados Oracle 12c prov uma variedade de opes para criao de ndices.
Estes aspectos so demostrados nas subsees seguintes (CHAN, 2014) (ALAPATI, KUHN e
PADFIELD, 2013):

3.1.1 Tipos do ndices


Nesta subseo so demonstrados os tipos de ndices disponveis no Oracle 12c e suas
recomendaes de utilizao (ASHDOWN, 2014).

B-Tree: o ndice padro da arvore balanceada. Seu uso recomendado para


colunas que apresentarem um alto grau de valores distintos (alta cardinalidade)
(ASHDOWN, 2014).

Unique B-Tree: ndice para colunas de mximo grau de distino de valores.

Bitmap: A apropriado para colunas de baixa cardinalidade (ASHDOWN e


KYTE, 2014).

B-tree Function-based Index: til para colunas que possuem SQLs com
funes, no qual o resultado um valor de alta cardinalidade, por exemplo,
formatar um texto (ASHDOWN, 2014).

Bitmap Function-based Index: til para colunas que possuem SQLs com
funes, no qual o resultado um valor de baixa cardinalidade, por exemplo,
pegar a primeira letra de um texto (OHEARN, 2010).

3.1.2 Colunas Candidatas


Alguns passos podem ser seguidos para identificao de colunas que necessitam de um
ndice. Como regra geral, pode-se criar ndices para os seguintes cenrios (ALAPATI, KUHN
e PADFIELD, 2013):

Criar uma chave primria para a tabela onde um ndice nico ser criado.

Explicitar a criao de ndices em chaves estrangeiras, para otimizao do JOIN.

Considerar a criao de ndices em colunas usadas nas clusulas ORDER BY,


GROUP BY, UNION, e DISTINCT pode maximizar o desempenho. Utilizar funes
se necessrio.

3.2

Criando SQL Eficiente


A maioria dos problemas de desempenho das aplicaes so causados pela utilizao

de SQL mal escritos. Uma boa estruturao destes comandos est diretamente relacionada ao
uso eficiente dos recursos, e desta forma contribuindo para melhoria do desempenho do banco

10

de dados como um todo. Alm disso, uma boa estruturao nestes comandos contribui para
facilitar a manuteno das aplicaes (ALAPATI, KUHN e PADFIELD, 2013).
Neste sentido, um recurso para melhoria de desempenho disponvel pela Oracle o
reuso do parsing do SQL por meio do Shared Pool (ASHDOWN, 2014).
O Shared Pool o local onde as estruturas que compe o resultado final desse
processo de so memorizadas e compartilhadas por entre os usurios do banco de dados, j o
parser o artifcio que interpreta o comando SQL e cria um plano de execuo para o mesmo.
Este processo tem muitas etapas, tais como verificao de sintaxe e segurana (ALAPATI,
KUHN e PADFIELD, 2013). No Oracle 12c, existem dois tipos de operaes de parsing:

Hard Parsing: Quando um comando SQL utilizado pela primeira vez todas as etapas
do parsing so executadas. Este processo o mais custoso.

Soft Parsing: Quando um comando SQL re-utilizado, parte do processo feito no hard
parsing aproveitada atravs do Shared Pool, gerando uma melhoria de desempenho.
Somente as etapas de verificao as sintaxe e segurana so realizadas.
O processo de parsing deve ser minimizado do tanto quanto for possvel e cabe aos

desenvolvedores construir as aplicaes de modo a utilizar as tcnicas de reaproveitamento


disponveis.
Dentre os mtodos que o desenvolvedor pode utilizar, a tcnica de bind variables pode
ser utilizada como ferramenta para realizar o reaproveitamento de comandos, e por
conseguinte diminuindo o tempo de parsing e utilizao de recursos. Esta tcnica consiste na
utilizao de variveis que substituem partes das consultas que sero trocadas por valores
literais em tempo de execuo.
O uso do soft parsing pode reduzir quase a totalidade da utilizao de recursos para
interpretao lxica se comparada ao hard parsing, e pode-se chegar a um ganho geral de
desempenho de 70% no tempo de resposta dependendo cenrio (CHAN, 2014).

Experimentos
Neste captulo so apresentadas e demonstradas as etapas que foram realizadas no

experimento de Carga de Dados.

11

4.1

Configuraes Iniciais
Todos os experimentos foram realizados no ambiente Sistema Operacional Windows

8.1, 64-bit, em ingls, recm instalado, em um computador Processador Intel Core i5 4200U
4 Gerao 8GB de memria DDR3 1600MHZ contendo um Solid State Drive (SSD) de 256
GB. A verso do banco de dados Oracle 12c a 12.1.0.1.0 Enterprise Edition para Microsoft
Windows 64 bits, o qual foi baixada sobre a licena de desenvolvimento, testes, prototipao
e demonstrao OTN (Oracle Technology Network).
Nas subsees seguintes apresentam-se os componentes de reuso dos experimentos, os
quais serviro como facilitadores para a execuo dos mesmos.

4.1.1 PDB e Usurios Locais


Para os experimentos sero necessrios que sejam criados dois PDBs, no qual ser
utilizado o usurio recm criado para conexo com os mesmos. Ambos os PDBs sero criados
com a mesma configurao. Como nomenclatura um se chamar PDBTST, e o outro ser
PDBPRD. O comando para criao dos mesmos demonstrado no Exemplo 1 no apndice, o
qual cria o PDBTST com usurio TSTADM e senha TSTADM com privilrios de DBA, e o
PDBPRD com usurio PRDADM senha PRDADM com privilgios de DBA, no qual ambos
PDB so criados baseados no PDBSEED (modelo disponibilizado na instalao da Oracle).

4.1.2 Conexes
Para configurao de conexes base de dados, duas entradas no arquivo
TNSNAMES.ORA sero criadas, conforme Figura 7.

PDBPRD = (DESCRIPTION = ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST =


localhost)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = PDBPRD) ) )
PDBTST = (DESCRIPTION = ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST =
localhost)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = PDBTST) ) )
Figura 7. Entrada PDBPRD e PDBTST no arquivo TNSNAMES.ORA.
Fonte: Dados da Pesquisa (2014).

12

4.1.3 Tabelas
O experimento consiste no translado de dados de um lado para outro com distintos
tamanhos, nmero de linha e nmero de colunas. Sero realizados 4 experimentos seguindo a
mesma metodologia adotada para os demais. Neste sentido, nesta etapa sero criadas 4 tabelas
vazias em ambos PDBs.
Para os experimentos, foram geradas quatro tabelas, sendo as nomeadas em
TABELA_10MB_1COL e TABELA_100MB_1COL possuindo 1 coluna com o tamanho 16
caracteres

alfanumricos

do

tipo

VARCHAR2(16),

as

outras

nomeadas

em

TABELA_10MB_10COL e TABELA_100MB_10COL, possuindo 10 colunas com o


tamanho 16 caracteres alfanumricos do tipo VARCHAR2(16). Todas as tabelas foram
criadas nos ambos schemas PRDADM do PDBPRD e TSTADM do PDBTST, conforme
demonstrado na Figura 8.

create table TABELA_100MB_10COL (


COL1 varchar2(16), COL2 varchar2(16), COL3 varchar2(16),
COL4 varchar2(16), COL5 varchar2(16), COL6 varchar2(16),
COL7 varchar2(16), COL8 varchar2(16), COL9 varchar2(16),
COL10 varchar2(16));
create table TABELA_10MB_10COL as select * from TABELA_100MB_10COL;
create table TABELA_100MB_1COL as select COL1 from TABELA_100MB_10COL;
create table TABELA_10MB_1COL as select COL1 from TABELA_100MB_10COL;
Figura 8. Criao das tabelas TABELA_1COLUNA e TABELA_10COLUNAS.
Fonte: Dados da Pesquisa (2014).

Alm da criao da estrutura, adicionado o parmetro nologging s tabelas em


ambos PDBs, conforme Figura 9, para desativar a gerao de segmentos REDO e UNDO logs
ao se utilizar o mtodo de insero por caminho direto serial (ROESER, 2013) (URBANO,
2014).
alter table TABELA_10MB_1COL nologging;
alter table TABELA_10MB_10COL nologging;
alter table TABELA_100MB_1COL nologging;
alter table TABELA_100MB_10COL nologging;
Figura 9. Atribuio do parmetro NOLOGGING.
Fonte: Dados da Pesquisa (2014).

13

4.1.4 Preparao de Dados


Para a execuo dos experimentos, necessria uma massa de dados significativa, a
fim de sejam obtidos resultados mensurveis onde haja uma possibilidade de se medir o
esforo que os servidores de banco de dados estejam executando.
Neste sentido, foram criadas massas de dados apenas no PDBTST com distintos
tamanhos, colunas e nmero de linhas, e inseridas em suas respectivas tabelas, conforme a
Tabela 1.

Tabela

N de Linhas

TABELA_10MB_1COL
TABELA_10MB_10COL
TABELA_100MB_1COL
TABELA_100MB_10COL

N de Colunas

655360
65536
6553600
655360

1
10
1
10

Tamanho
10MB
10MB
100MB
100MB

Tabela 1. Definio da Massa de Dados.


Fonte: Dados da Pesquisa (2014).

O comando para inserir valores aleatrios demostrado no Exemplo 4 no apndice


onde utilizada uma funo j existente para preenchimento dos dados. A fim de que
existisse a garantia que os textos no se repetissem na mesma coluna, foi realizado um teste
posterior.
Para criao do diretrio no PDBPRD e no PDBTST, o comando a ser utilizado
demonstrado na Figura 10, no qual o qual nomeado em DIRPRD.

create or replace directory DIRPRD as 'C:\DIRPRD';


Figura 10. Criao do Diretrio DIRPRD.
Fonte: Dados da Pesquisa (2014).

Na sequncia, foram gerados arquivos CSV no diretrio DIRPRD com estes dados,
para utilizao no experimento com tabelas externas. Os nomes dos arquivos so
ARQUIVO_10MB_1COL.csv,

ARQUIVO_10MB_10COL.csv,

ARQUIVO_100MB_1COL.csv e ARQUIVO_10MB_1COL.csv, representando as massas de


dados

das

tabelas

TABELA_10MB_1COL,

TABELA_10MB_10COL,

TABELA_100MB_1COL e TABELA_100MB_10COL, respectivamente.

14

4.2

Metodologia
Cada uma das cargas ser executada sequencialmente para uma carga de 5000MB.

Para isto, o nmero de execues foi ajustado para cada uma das tabelas de teste, de modo a
que seja verificado ao final estatsticas que sero comparados aos outros mtodos. Ao final, o
tempo total da execuo ser coletado e apresentado em um quadro comparativo.
Em todos os cenrios, os testes sero executados por um bloco PL/SQL ou por script
Windows Batch File, que faro o controle das execues, e em todos os experimentos o tempo
da primeira execuo do teste descartado.
Para as cargas de 10MB, sero mensurados os tempos de execuo de um lote de 500
execues, e para as cargas de 100MB o lote de 50, totalizando 5000MB para todos os
experimentos.

4.2.1 Ligaes entre Bancos de Dados


Em funo de que os dados inicialmente constam no PDBTST, o primeiro
experimento consiste na mensurao do tempo total que estes dados levam para transladar do
PDBPRD para o PDBTST por meio do DBLINKTST.
No sentido de realizar o teste desta tecnologia de forma a testar o desempenho dos
protocolos de comunicao e isolar o fator da interface de rede, no experimento sero
utilizaras duas instncias Oracle em uma mesma mquina. Por definio, criado um link do
banco de dados PDBPRD para o PDBTST conforme a Figura 11.
CREATE DATABASE LINK DBLINKTST
CONNECT TO TSTADM IDENTIFIED BY TSTADM USING 'PDBTST';
Figura 11. Criao do Link do Banco de Dados DBLINKTST.
Fonte: Dados da Pesquisa (2014).

Para a execuo dos experimentos, foram criados blocos em PL/SQL para realizar a
chamada das cargas, conforme descrito no apndice no Exemplo 3.
Na sequncia, cada um dos experimentos executado o nmero de vezes suficiente
para que se obter uma carga total de 5000MB, conforme Exemplo 5 no apndice.

15

4.2.2 Tabelas Externas


Para este experimento sero criadas 4 tabelas externas no PDBPRD representando as
diferentes cargas de dados existentes conforme Exemplo 6 no apndice.
Foram criados procedimentos em PL/SQL para realizar a chamada das cargas, este
procedimento est descrito no Exemplo 7 no apndice.
Na sequncia, cada um dos experimentos foi executado o nmero de vezes suficiente
para se obter uma carga total de 5000 MB, conforme apndice Exemplo 8.

4.2.3 Data Pump


Nas subsees seguintes estaro descritas as etapas realizadas com o experimento com
Data Pump. Para gerar a carga de dados a ser lida, utilizado a funo do Oracle Data Pump
Export, para que sejam gerados os arquivos a serem lidos.
Os arquivos so originados do mesmo conjunto de dados dos testes anteriores. Os
arquivos

sero

nomeados

TABELA_10MB_1COL,
TABELA_100MB_10COL,

preenchidos

com

TABELA_10MB_10COL,
com

os

nomes,

base

os

dados

da

tabela

TABELA_100MB_1COL

DUMP_10MB_1COL.DMP,

DUMP_10MB_10COL.DMP, DUMP_100MB_1COL.DMP e DUMP_100MB_10COL.DMP,


respectivamente. O comando para gerar estes arquivos demostrado no Exemplo 9 no
apndice.
Os arquivos gerados podero ser utilizados para a leitura na ferramenta impdp. J para
a utilizao do driver do Oracle Data Pump com tabelas externas, ser realizada outra
extrao, de acordo com os comandos descritos no Exemplo 10 no apndice.
Neste experimento, duas estratgias sero testadas. A primeira estratgia consiste no
uso do adaptador do Oracle Data Pump existente para a configurao de Tabelas Externas,
enquanto o segundo experimento consiste na utilizao do programa impdp, o qual
executado via linha de comando no servidor.
Para o primeiro mtodo, com uso de tabelas externas, foram criados procedimentos em
PL/SQL para realizar a chamada das cargas, este procedimento est descrito no Exemplo 11
no apndice.

16

Na sequncia, cada um dos experimentos foi executado o nmero de vezes suficiente


para que se obtivesse uma carga total de 5000MB, conforme Exemplo 12 no apndice.
No segundo mtodo, com uso da ferramenta impdp, foram criados procedimentos em
PL/SQL para realizar a chamada das cargas, este procedimento est descrito no Exemplo 13
no apndice.
Na sequncia, cada um dos experimentos foi executado o nmero de vezes suficiente
para se obter uma carga total de 5000MB, conforme Exemplo 14 no apndice.

4.2.4 SQL*Loader
O SQL*Loader requer que a sua execuo seja via linha de comando e que sejam
criados arquivos de controle com as configuraes de execuo, os quais so demonstradas
em Exemplo 15, Exemplo 16, Exemplo 17 e Exemplo 18 no apndice.
Na sequncia, cada um dos experimentos foi executado o nmero de vezes suficiente
para que se obtivesse uma carga total de 5000MB, conforme apndice Exemplo 19 em
Windows Batch File.

Anlise e Discusso dos Resultados


Neste captulo ser apresentada a anlise dos resultados obtida a partir dos

experimentos. Na Tabela 2, apresentado o resultado geral do experimento, com o Tempo


Total (s).
10 MB

100 MB

1 Coluna

10 Colunas

1 Coluna

10 Colunas

Ligao de
Banco de Dados

715

450

668

350

Tabela Externa

523

221

223

155

388

286

331

172

2027

2014

195

195

501

240

306

140

Data Pump Tab. Externa


Data Pump IMPDP
SQL*Loader

Tabela 2. Resultado do Experimento com o tempo em segundos.


Fonte: Dados da Pesquisa (2014).

17

Para o experimento de Ligao de Banco de Dados, os tempos para carga foram 715,
450, 668 e 350 segundos. J para o Tabela Externa foram 523, 221, 223, 155 segundos. Na
utilizao do Data Pump via Tabela Externa os tempos foram 388, 286, 331 e 172 segundos.
J para Data Pump via IMPDP os tempos foram 2027, 2014, 195, 195 segundos. Para o
SQL*Loader os tempos foram 501, 240, 306 e 140 segundos para as cargas de 10MB 1
coluna, 10MB 10 colunas, 100MB 1 coluna e 100MB 10 colunas, respectivamente.
Na Figura 12 demonstrado o throughtput em mb/s obtido com os experimentos.

Figura 12. Throughput obtido com os experimentos.


Fonte: Dados da Pesquisa(2014).

O maior throughtput foi obtido por meio da tecnologia SQL*Loader carga 100MB de
10 colunas que obteve uma velocidade mdia de 35,7 mb/s. J a menor velocidade foi por
meio da tecnologia Data Pump IMPDP para a carga 10MB, o qual apresentou o valor de 2,5
mb/s.
Segundo anlises, o uso de um mesmo conjunto de dados, porm em linhas ao invs
de colunas, tem um comportamento diferente de desempenho para as diferentes tecnologias.
Para o Ligao de Banco de Dados, a converso de linhas para colunas oferece um
ganho de 59% em tempo para 10MB e 91% para 100MB. J o Tabela Externa o ganho de
137% para 10MB e 44% para 100MB. Com o Data Pump via Tabela Externa, o ganho foi de
36% para 10MB e 92% para 100MB, j o Data Pump com IMPDP no houve ganho
considervel para as diferentes cargas. Para o SQL*Loader o ganho foi de 109% para a carga
de 10MB e 119% para a carga de 100MB.

18

Concluses
possvel notar, a partir dos resultados dos experimentos, que duas massas de dados

de mesmo tamanho, porm com uma diferente distribuio, possuem resultados distintos, no
qual o arquivo com maior nmero de linhas tem um desempenho inferior ao arquivo de
mesmo tamanho com maior nmero de colunas.
A estratgia DBLINK por sua vez apresenta vantagens com relaes facilidade de
configurao e a necessidade de se possurem os dados atualizados constantemente, porm, o
fator de rede que no foi avaliado pode se tornar um vilo para grandes volumes de dados.
Os experimentos com Tabelas Externas possuem configurao simples, e o
desempenho apresentado para pequenas e mdias cargas foi mediano comparado aos seus
concorrentes.
J a estratgia de Data Pump utilizando a API PL/SQL demonstrou uma configurao
complexa, e resultados poucos satisfatrios para pequenos conjuntos de dados. Por outro lado,
o Data Pump utilizando Tabelas Externas se demonstrou de fcil configurao e eficiente
tambm para pequenos e mdios conjuntos de dados, entretanto sua aplicao muito
especfica.
O SQL*Loader por sua vez, demonstrou o melhor desempenho mdio dentre os
experimentos. Sua configurao fcil, entretanto, o mesmo no possui uma API em PL/SQL
para que sua chamada seja realizada internamente ao banco Oracle, facilitando o acesso a sua
configurao.
Abstract
This paper presents a literature review of contemporary references to the Oracle 12c database
as well as conducting practical tests for different data loads to obtain parameters that can
assist a developer in choosing the best technique for to implement data loading. As a
methodology, an exploratory study with data collection through literature and experimental
research in which data collected from the tests are presented and discussed in comparison is
performed. From the results, it is possible to conclude that the different behavior of the load
data with the technologies presented different scenarios, which different situations will
require different implementation techniques in order to obtain the maximum utilization of
available computational resources.
Palavras-chave: Oracle 12c, SQL Improvements, Data Loading.

19

Referncias
ALAPATI, S. R.; KUHN, D.; PADFIELD, B. Oracle Database 12c Performance
Tuning Recipes. [S.l.]: Apress, 2013.
ASHDOWN, L. Oracle Database SQL Tuning Guide 12c Release 1 (12.1). [S.l.]:
Oracle, 2014.
ASHDOWN, L.; KYTE, T. Oracle Database Concepts 12c Release 1 (12.1). [S.l.]:
Oracle, 2014.
CHAN, I. Oracle Database Performance Tuning Guide 12c Release 1 (12.1). [S.l.]:
Oracle, 2014.
HUEY, P. Oracle Database Security Guide 12c Release 1 (12.1). [S.l.]: Oracle,
2014.
LLEWELLYN, B. Oracle Multitenant. An Oracle White Paper, Redwood Shores,
CA, 2013.
OHEARN, S. OCA Oracle Database SQL Certified Expert Exam Guide. [S.l.]:
Oracle Press, 2010.
ROESER, M. B. Oracle Database SQL Language Reference 12c Release 1 (12.1).
[S.l.]: Oracle, 2013.
URBANO, R. Oracle Database Administrator's Guide 12c Release 1 (12.1). [S.l.]:
Oracle, 2014.
WATSON, J. OCA Oracle Database 12c Installation and Administration Exam
Guide. [S.l.]: McGraw-Hill, 2014.

Glossrio
CDB: Container Database Continer de Banco de Dados.
Datafile: Arquivo de Dados.
Datapump: Injeo de Dados.
PDB: Pluggable Database Banco de Dados Plugvel.
MB: Megabytes.

20

Mb/s: Megabytes / segundo.

Apndice
CREATE PLUGGABLE DATABASE PDBTST
ADMIN USER TSTADM IDENTIFIED BY TSTADM ROLES = (dba)
DEFAULT TABLESPACE users
DATAFILE 'C:\app\DouglasNandi\oradata\orcl\pdbtst\pdbtst01.dbf' SIZE
10000M AUTOEXTEND ON
FILE_NAME_CONVERT = ('C:\app\DouglasNandi\oradata\orcl\pdbseed\',
'C:\app\DouglasNandi\oradata\orcl\pdbtst\');
ALTER PLUGGABLE DATABASE PDBTST OPEN READ WRITE;
ALTER SESSION SET CONTAINER = PDBTST;
GRANT ALL PRIVILEGES TO TSTADM;
ALTER SESSION SET CONTAINER = CDB$ROOT;
CREATE PLUGGABLE DATABASE PDBPRD
ADMIN USER PRDADM IDENTIFIED BY PRDADM ROLES = (dba)
DEFAULT TABLESPACE users
DATAFILE 'C:\app\DouglasNandi\oradata\orcl\pdbprd\pdbprd01.dbf' SIZE
10000M AUTOEXTEND ON
FILE_NAME_CONVERT = ('C:\app\DouglasNandi\oradata\orcl\pdbseed\',
'C:\app\DouglasNandi\oradata\orcl\pdbprd\');
ALTER PLUGGABLE DATABASE PDBPRD OPEN READ WRITE;
ALTER SESSION SET CONTAINER = PDBPRD;
GRANT ALL PRIVILEGES TO PRDADM;
Exemplo 1. Comando para criao do PDBPRD e PDBTST

sqlplus TSTADM/TSTADM@PDBTST
SET TERMOUT OFF
set embedded on
set pagesize 0
set colsep '|'
set echo off
set feedback off
set linesize 1000
set trimspool on
set headsep of
set feedback off
set heading off
set echo off
SPOOL 'C:\DIRPRD\ARQUIVO_10MB_1COL.CSV';
select COL1 from TABELA_10MB_1COL;
SPOOL OFF;
SET
set
set
set
set
set
set

TERMOUT OFF
embedded on
pagesize 0
colsep '|'
echo off
feedback off
linesize 1000

21
set trimspool on
set headsep of
set feedback off
set heading off
set echo off
SPOOL 'C:\DIRPRD\ARQUIVO_100MB_1COL.CSV';
select COL1 from TABELA_100MB_1COL;
SPOOL OFF;
SET TERMOUT OFF
set embedded on
set pagesize 0
set colsep '|'
set echo off
set feedback off
set linesize 1000
set trimspool on
set headsep of
set feedback off
set heading off
set echo off
SPOOL 'C:\DIRPRD\ARQUIVO_10MB_10COL.CSV';
select
COL1||','||COL2||','||COL3||','||COL4||','||COL5||','||COL6||','||COL7||','
||COL8||','||COL9||','||COL10 from TABELA_10MB_10COL;
SPOOL OFF;
SET TERMOUT OFF
set embedded on
set pagesize 0
set colsep '|'
set echo off
set feedback off
set linesize 1000
set trimspool on
set headsep of
set feedback off
set heading off
set echo off
SPOOL 'C:\DIRPRD\ARQUIVO_100MB_10COL.CSV';
select
COL1||','||COL2||','||COL3||','||COL4||','||COL5||','||COL6||','||COL7||','
||COL8||','||COL9||','||COL10 from TABELA_100MB_10COL;
SPOOL OFF;

Exemplo 2. Script para Gerar os Arquivos CSV.

create or replace procedure CARREGA_10MB_1COL is begin


execute immediate 'truncate table TABELA_10MB_1COL';
insert /*+ APPEND */ into TABELA_10MB_1COL (COL1) select COL1 from
TABELA_10MB_1COL@DBLINKTST;
commit;
end;
/

22

create or replace procedure CARREGA_10MB_10COL is begin


execute immediate 'truncate table TABELA_10MB_10COL';
insert /*+ APPEND */ into TABELA_10MB_10COL
(COL1,COL2,COL3,COL4,COL5,COL6,COL7,COL8,COL9,COL10) select
COL1,COL2,COL3,COL4,COL5,COL6,COL7,COL8,COL9,COL10 from
TABELA_10MB_10COL@DBLINKTST;
commit;
end;
/
create or replace procedure CARREGA_100MB_1COL is begin
execute immediate 'truncate table TABELA_100MB_1COL';
insert /*+ APPEND */ into TABELA_100MB_1COL (COL1) select COL1 from
TABELA_100MB_1COL@DBLINKTST;
commit;
end;
/
create or replace procedure CARREGA_100MB_10COL is begin
execute immediate 'truncate table TABELA_100MB_10COL';
insert /*+ APPEND */ into TABELA_100MB_10COL
(COL1,COL2,COL3,COL4,COL5,COL6,COL7,COL8,COL9,COL10) select
COL1,COL2,COL3,COL4,COL5,COL6,COL7,COL8,COL9,COL10 from
TABELA_100MB_10COL@DBLINKTST;
commit;
end;
/
Exemplo 3. Procedimentos PL/SQL de Integrao de Dados.

begin
for j in 1..10 loop
for LINHAS in 1..65536 loop
for x in 1..10 loop
insert /*+ APPEND */ into TABELA_100MB_1COL(COL1)
values(DBMS_RANDOM.STRING('x',16));
end loop;
insert /*+ APPEND */ into
TABELA_100MB_10COL(COL1,COL2,COL3,COL4,COL5,COL6,COL7,COL8,COL9,COL10)
values(DBMS_RANDOM.STRING('x',16),DBMS_RANDOM.STRING('x',16),
DBMS_RANDOM.STRING('x',16),DBMS_RANDOM.STRING('x',16),
DBMS_RANDOM.STRING('x',16),DBMS_RANDOM.STRING('x',16),
DBMS_RANDOM.STRING('x',16),DBMS_RANDOM.STRING('x',16),
DBMS_RANDOM.STRING('x',16),DBMS_RANDOM.STRING('x',16));
end loop;
commit;
end loop;
insert /*+ APPEND */ into TABELA_10MB_1COL (COL1) select COL1 from
TABELA_100MB_1COL where ROWNUM <= 655360;
commit;
insert /*+ APPEND */ into TABELA_10MB_10COL
(COL1,COL2,COL3,COL4,COL5,COL6,COL7,COL8,COL9,COL10) select
COL1,COL2,COL3,COL4,COL5,COL6,COL7,COL8,COL9,COL10 from
TABELA_100MB_10COL where ROWNUM <= 65536;

23
commit;
end;
Exemplo 4. Gerao da massa de dados para os experimentos.

create or replace procedure COLETA_DB_LINK is


startTime timestamp;
begin
carrega_10mb_1col;
startTime := systimestamp;
for j in 1..500 loop carrega_10mb_1col; end loop;
dbms_output.put_line((systimestamp-startTime)||'=DBLINK_10MB_1COL');
carrega_10mb_10col;
startTime := systimestamp;
for j in 1..500 loop carrega_10mb_10col; end loop;
dbms_output.put_line((systimestamp-startTime)||'=DBLINK_10MB_10COL');
carrega_100mb_1col;
startTime := systimestamp;
for j in 1..50 loop carrega_100mb_1col; end loop;
dbms_output.put_line((systimestamp-startTime)||'=DBLINK_100MB_1COL');
carrega_100mb_10col;
startTime := systimestamp;
for j in 1..50 loop carrega_100mb_10col; end loop;
dbms_output.put_line((systimestamp-startTime)||'=DBLINK_100MB_10COL');
end;
/
Exemplo 5. Bloco PL/SQL para controle das chamadas.

create table TABELA_EXTERNA_10MB_1COL ( COL1 varchar2(16)) organization


external (type ORACLE_LOADER default directory DIRPRD access parameters
(records delimited by newline fields TERMINATED BY ',' (COL1 char))
location ('ARQUIVO_10MB_1COL.CSV'));
create table TABELA_EXTERNA_10MB_10COL (COL1 varchar2(16),COL2
varchar2(16),COL3 varchar2(16),COL4 varchar2(16),COL5 varchar2(16),COL6
varchar2(16),COL7 varchar2(16),COL8 varchar2(16),COL9 varchar2(16),
COL10 varchar2(16)) organization external (type ORACLE_LOADER default
directory DIRPRD access parameters (records delimited by newline fields
TERMINATED BY ',' ( COL1 char,COL2 char,COL3 char, COL4 char,COL5
char,COL6 char, COL7 char,COL8 char,COL9 char, COL10 char)) location
('ARQUIVO_10MB_10COL.CSV'));
create table TABELA_EXTERNA_100MB_1COL ( COL1 varchar2(16)) organization
external (type ORACLE_LOADER default directory DIRPRD
access parameters (records delimited by newline fields TERMINATED BY ','
(COL1 char)) location ('ARQUIVO_100MB_1COL.CSV'));
create table TABELA_EXTERNA_100MB_10COL (COL1 varchar2(16),COL2
varchar2(16),COL3 varchar2(16),COL4 varchar2(16),COL5 varchar2(16),COL6
varchar2(16),COL7 varchar2(16),COL8 varchar2(16),COL9 varchar2(16),
COL10 varchar2(16)) organization external (type ORACLE_LOADER default
directory DIRPRD access parameters (records delimited by newline fields

24
TERMINATED BY ',' ( COL1 char,COL2 char,COL3 char, COL4 char,COL5
char,COL6 char, COL7 char,COL8 char,COL9 char, COL10 char)) location
('ARQUIVO_100MB_10COL.CSV'));
Exemplo 6. Comando para Criao das Tabelas Externas.

create or replace procedure CARREGA_EXT_10MB_1COL is begin


execute immediate 'truncate table TABELA_10MB_1COL';
insert /*+ APPEND */ into TABELA_10MB_1COL (COL1) select COL1 from
TABELA_EXTERNA_10MB_1COL;
commit;
end;
/
create or replace procedure CARREGA_EXT_10MB_10COL is begin
execute immediate 'truncate table TABELA_10MB_10COL';
insert /*+ APPEND */ into TABELA_10MB_10COL
(COL1,COL2,COL3,COL4,COL5,COL6,COL7,COL8,COL9,COL10) select
COL1,COL2,COL3,COL4,COL5,COL6,COL7,COL8,COL9,COL10 from
TABELA_EXTERNA_10MB_10COL;
commit;
end;
/
create or replace procedure CARREGA_EXT_100MB_1COL is begin
execute immediate 'truncate table TABELA_100MB_1COL';
insert /*+ APPEND */ into TABELA_100MB_1COL (COL1) select COL1 from
TABELA_EXTERNA_100MB_1COL;
commit;
end;
/
create or replace procedure CARREGA_EXT_100MB_10COL is begin
execute immediate 'truncate table TABELA_100MB_10COL';
insert /*+ APPEND */ into TABELA_100MB_10COL
(COL1,COL2,COL3,COL4,COL5,COL6,COL7,COL8,COL9,COL10) select
COL1,COL2,COL3,COL4,COL5,COL6,COL7,COL8,COL9,COL10 from
TABELA_EXTERNA_100MB_10COL;
commit;
end;
/
Exemplo 7. Procedimentos de Carga de Tabela Externa.

create or replace procedure COLETA_TAB_EXT is


startTime timestamp;
begin
CARREGA_EXT_10MB_1COL;
startTime := systimestamp;
for J in 1..500 loop CARREGA_EXT_10MB_1COL; end loop;
dbms_output.put_line((systimestamp-startTime)||'=ET_10MB_1COL');
CARREGA_EXT_10MB_10COL;
startTime := systimestamp;
for J in 1..500 loop CARREGA_EXT_10MB_10COL; end loop;
dbms_output.put_line((systimestamp-startTime)||'=ET_10MB_10COL');

25
CARREGA_EXT_100MB_1COL;
startTime := systimestamp;
for J in 1..50 loop CARREGA_EXT_100MB_1COL; end loop;
dbms_output.put_line((systimestamp-startTime)||'=ET_100MB_1COL');
CARREGA_EXT_100MB_10COL;
startTime := systimestamp;
for J in 1..50 loop CARREGA_EXT_100MB_10COL; end loop;
dbms_output.put_line((systimestamp-startTime)||'=ET_100MB_10COL');
end;
/
Exemplo 8. Bloco PL/SQL para controle das chamadas.

expdp TSTADM/TSTADM@PDBTST CONTENT=DATA_ONLY NOLOGFILE=Y FULL=N


DIRECTORY=DIRPRD DUMPFILE=DUMP_10MB_1COL.DMP TABLES=TABELA_10MB_1COL
expdp TSTADM/TSTADM@PDBTST CONTENT=DATA_ONLY NOLOGFILE=Y FULL=N
DIRECTORY=DIRPRD DUMPFILE=DUMP_10MB_10COL.DMP TABLES=TABELA_10MB_10COL
expdp TSTADM/TSTADM@PDBTST CONTENT=DATA_ONLY NOLOGFILE=Y FULL=N
DIRECTORY=DIRPRD DUMPFILE=DUMP_100MB_1COL.DMP TABLES=TABELA_100MB_1COL
expdp TSTADM/TSTADM@PDBTST CONTENT=DATA_ONLY NOLOGFILE=Y FULL=N
DIRECTORY=DIRPRD DUMPFILE=DUMP_100MB_10COL.DMP TABLES=TABELA_100MB_10COL
Exemplo 9. Gerao de Arquivos DUMP.

create table TABELA_DUMP_10MB_1COL organization external


(type ORACLE_DATAPUMP default directory DIRPRD access parameters
(nologfile) location ('TABELA_DUMP_10MB_1COL.DMP')) as select COL1 from
TABELA_10MB_1COL@DBLINKTST;
create table TABELA_DUMP_10MB_10COL organization external
(type ORACLE_DATAPUMP default directory DIRPRD access parameters
(nologfile) location ('TABELA_DUMP_10MB_10COL.DMP')) as select
COL1,COL2,COL3,COL4,COL5,COL6,COL7,COL8,COL9,COL10 from
TABELA_10MB_10COL@DBLINKTST;
create table TABELA_DUMP_100MB_1COL organization external
(type ORACLE_DATAPUMP default directory DIRPRD access parameters
(nologfile) location ('TABELA_DUMP_100MB_1COL.DMP')) as select COL1 from
TABELA_100MB_1COL@DBLINKTST;
create table TABELA_DUMP_100MB_10COL organization external
(type ORACLE_DATAPUMP default directory DIRPRD access parameters
(nologfile) location ('TABELA_DUMP_100MB_10COL.DMP')) as select
COL1,COL2,COL3,COL4,COL5,COL6,COL7,COL8,COL9,COL10 from
TABELA_100MB_10COL@DBLINKTST;
Exemplo 10. Comandos para criao de tabelas externas com uso do driver Data Pump.

create or replace procedure carrega_ext_dmp_10mb_1col is


begin
execute immediate 'truncate table tabela_10mb_1col';
insert /*+ APPEND */ into tabela_10mb_1col (col1) select col1 from
TABELA_DUMP_10MB_1COL;
commit;

26
end;
/
create or replace procedure carrega_ext_dmp_10mb_10col is
begin
execute immediate 'truncate table tabela_10mb_10col';
insert /*+ APPEND */ into tabela_10mb_10col
(col1,col2,col3,col4,col5,col6,col7,col8,col9,col10) select
col1,col2,col3,col4,col5,col6,col7,col8,col9,col10 from
TABELA_DUMP_10MB_10COL;
commit;
end;
/
create or replace procedure carrega_ext_dmp_100mb_1col is
begin
execute immediate 'truncate table tabela_100mb_1col';
insert /*+ APPEND */ into tabela_100mb_1col (col1) select col1 from
TABELA_DUMP_100MB_1COL;
commit;
end;
/
create or replace procedure carrega_ext_dmp_100mb_10col is
begin
execute immediate 'truncate table tabela_100mb_10col';
insert /*+ APPEND */ into tabela_100mb_10col
(col1,col2,col3,col4,col5,col6,col7,col8,col9,col10) select
col1,col2,col3,col4,col5,col6,col7,col8,col9,col10 from
TABELA_DUMP_100MB_10COL;
commit;
end;
/
Exemplo 11. Procedimentos para carga das tabelas externas Data Pump.

create or replace procedure COLETA_DATA_PUMP_TAB_EXT is


startTime timestamp;
begin
CARREGA_EXT_DMP_10MB_1COL;
startTime := systimestamp;
for j in 1..500 loop CARREGA_EXT_DMP_10MB_1COL; end loop;
dbms_output.put_line((systimestamp-startTime)||'=DPET_10MB_1COL');
CARREGA_EXT_DMP_10MB_10COL;
startTime := systimestamp;
for j in 1..500 loop CARREGA_EXT_DMP_10MB_10COL; end loop;
dbms_output.put_line((systimestamp-startTime)||'=DPET_10MB_10COL');
CARREGA_EXT_DMP_100MB_1COL;
startTime := systimestamp;
for j in 1..50 loop CARREGA_EXT_DMP_100MB_1COL; end loop;
dbms_output.put_line((systimestamp-startTime)||'=DPET_100MB_1COL');
CARREGA_EXT_DMP_100MB_10COL;

27
startTime := systimestamp;
for j in 1..50 loop CARREGA_EXT_DMP_100MB_10COL; end loop;
dbms_output.put_line((systimestamp-startTime)||'=DPET_100MB_10COL');
end;
/
Exemplo 12. Procedimento para Gerar Estatsticas de Execuo.

create or replace procedure CARREGA_DP_10MB_1COL is


h1 number;
job_state varchar2(30);
begin
execute immediate 'truncate table TABELA_10MB_1COL';
h1 := dbms_datapump.open('IMPORT','TABLE',NULL,'TESTE1');
dbms_datapump.add_file(h1,'DUMP_10MB_1COL.DMP','DIRPRD');
dbms_datapump.start_job(h1);
dbms_datapump.wait_for_job(h1,job_state);
dbms_datapump.detach(h1);
end;
/
create or replace procedure CARREGA_DP_10MB_10COL is
h1 number;
job_state varchar2(30);
begin
execute immediate 'truncate table TABELA_10MB_10COL';
h1 := dbms_datapump.open('IMPORT','TABLE',NULL,'TESTE2');
dbms_datapump.add_file(h1,'DUMP_10MB_10COL.DMP','DIRPRD');
dbms_datapump.start_job(h1);
dbms_datapump.wait_for_job(h1,job_state);
dbms_datapump.detach(h1);
end;
/
create or replace procedure CARREGA_DP_100MB_1COL is
h1 number;
job_state varchar2(30);
begin
execute immediate 'truncate table TABELA_100MB_1COL';
h1 := dbms_datapump.open('IMPORT','TABLE',NULL,'TESTE3');
dbms_datapump.add_file(h1,'DUMP_100MB_1COL.DMP','DIRPRD');
dbms_datapump.start_job(h1);
dbms_datapump.wait_for_job(h1,job_state);
dbms_datapump.detach(h1);
end;
/
create or replace procedure CARREGA_DP_100MB_10COL is
h1 number;
job_state varchar2(30);
begin
execute immediate 'truncate table TABELA_100MB_10COL';
h1 := dbms_datapump.open('IMPORT','TABLE',NULL,'TESTE4');
dbms_datapump.add_file(h1,'DUMP_100MB_10COL.DMP','DIRPRD');
dbms_datapump.start_job(h1);
dbms_datapump.wait_for_job(h1,job_state);
dbms_datapump.detach(h1);
end;
/

28

Exemplo 13. Procedimentos para testes com Oracle Data Pump.

create or replace procedure coleta_data_pump is


startTime timestamp;
begin
CARREGA_DP_10MB_1COL;
startTime := systimestamp;
for j in 1..500 loop CARREGA_DP_10MB_1COL; end loop;
dbms_output.put_line((systimestamp-startTime)||'=DP_10MB_1COL');
CARREGA_DP_10MB_10COL;
startTime := systimestamp;
for j in 1..500 loop CARREGA_DP_10MB_10COL; end loop;
dbms_output.put_line((systimestamp-startTime)||'=DP_10MB_10COL');
CARREGA_DP_100MB_1COL;
startTime := systimestamp;
for j in 1..50 loop CARREGA_DP_100MB_1COL; end loop;
dbms_output.put_line((systimestamp-startTime)||'=DP_100MB_1COL');
CARREGA_DP_100MB_10COL;
startTime := systimestamp;
for j in 1..50 loop CARREGA_DP_100MB_10COL; end loop;
dbms_output.put_line((systimestamp-startTime)||'=DP_100MB_10COL');
end;
/
Exemplo 14. Script para coleta de estatsticas Data Pump API.

LOAD DATA INFILE 'c:\DIRPRD\ARQUIVO_10MB_1COL.CSV'


TRUNCATE INTO TABLE TABELA_10MB_1COL FIELDS TERMINATED BY ','
TRAILING NULLCOLS (COL1 CHAR)
Exemplo 15. Arquivo LOADER_10MB_1COL.CTL.

LOAD DATA INFILE 'c:\DIRPRD\ARQUIVO_10MB_10COL.CSV'


TRUNCATE INTO TABLE TABELA_10MB_10COL FIELDS TERMINATED BY ','
TRAILING NULLCOLS (COL1 char,COL2 char,COL3 char, char,COL5 char,COL6
char, COL7 char,COL8 char,COL9 char, COL10 char)
Exemplo 16.Arquivo LOADER_10MB_10COL.CTL

LOAD DATA INFILE 'c:\DIRPRD\ARQUIVO_100MB_1COL.CSV'


TRUNCATE INTO TABLE TABELA_100MB_1COL FIELDS TERMINATED BY ','
TRAILING NULLCOLS (COL1 CHAR)
Exemplo 17. Arquivo LOADER_100MB_1COL.CTL

29
LOAD DATA INFILE 'c:\DIRPRD\ARQUIVO_100MB_10COL.CSV'
TRUNCATE INTO TABLE TABELA_100MB_10COL FIELDS TERMINATED BY ','
TRAILING NULLCOLS (COL1 char,COL2 char,COL3 char, char,COL5 char,COL6
char, COL7 char,COL8 char,COL9 char, COL10 char)
Exemplo 18.Arquivo LOADER_100MB_10COL.CTL

@echo off
sqlldr PRDADM/PRDADM@PDBPRD CONTROL=LOADER_10MB_1COL.CTL SILENT=ALL
DIRECT=Y
set STARTTIME=%TIME%
for /l %%x in (1, 1, 500) do (
sqlldr PRDADM/PRDADM@PDBPRD CONTROL=LOADER_10MB_1COL.CTL SILENT=ALL
DIRECT=Y
)
set ENDTIME=%TIME%
set /A STARTTIME=(1%STARTTIME:~0,2%-100)*360000 + (1%STARTTIME:~3,2%100)*6000 + (1
%STARTTIME:~6,2%-100)*100 + (1%STARTTIME:~9,2%-100)
set /A ENDTIME=(1%ENDTIME:~0,2%-100)*360000 + (1%ENDTIME:~3,2%-100)*6000
+ (1%ENDTIME:~6,2%-100)
*100 + (1%ENDTIME:~9,2%-100)
set /A DURATION=%ENDTIME%-%STARTTIME%
echo %DURATION% milliseconds to run LOADER_10MB_1COL
sqlldr PRDADM/PRDADM@PDBPRD CONTROL=LOADER_10MB_10COL.CTL SILENT=ALL
DIRECT=Y
set STARTTIME=%TIME%
for /l %%x in (1, 1, 500) do (
sqlldr PRDADM/PRDADM@PDBPRD CONTROL=LOADER_10MB_10COL.CTL SILENT=ALL
DIRECT=Y
)
set ENDTIME=%TIME%
set /A STARTTIME=(1%STARTTIME:~0,2%-100)*360000 + (1%STARTTIME:~3,2%100)*6000 + (1
%STARTTIME:~6,2%-100)*100 + (1%STARTTIME:~9,2%-100)
set /A ENDTIME=(1%ENDTIME:~0,2%-100)*360000 + (1%ENDTIME:~3,2%-100)*6000
+ (1%ENDTIME:~6,2%-100)
*100 + (1%ENDTIME:~9,2%-100)
set /A DURATION=%ENDTIME%-%STARTTIME%
echo %DURATION% milliseconds to run LOADER_10MB_10COL
sqlldr PRDADM/PRDADM@PDBPRD CONTROL=LOADER_100MB_1COL.CTL SILENT=ALL
DIRECT=Y
set STARTTIME=%TIME%
for /l %%x in (1, 1, 50) do (
sqlldr PRDADM/PRDADM@PDBPRD CONTROL=LOADER_100MB_1COL.CTL SILENT=ALL
DIRECT=Y
)
set ENDTIME=%TIME%
set /A STARTTIME=(1%STARTTIME:~0,2%-100)*360000 + (1%STARTTIME:~3,2%100)*6000 + (1
%STARTTIME:~6,2%-100)*100 + (1%STARTTIME:~9,2%-100)
set /A ENDTIME=(1%ENDTIME:~0,2%-100)*360000 + (1%ENDTIME:~3,2%-100)*6000
+ (1%ENDTIME:~6,2%-100)
*100 + (1%ENDTIME:~9,2%-100)
set /A DURATION=%ENDTIME%-%STARTTIME%
echo %DURATION% milliseconds to run LOADER_100MB_1COL
sqlldr PRDADM/PRDADM@PDBPRD CONTROL=LOADER_100MB_10COL.CTL SILENT=ALL
DIRECT=Y

30
set STARTTIME=%TIME%
for /l %%x in (1, 1, 50) do (
sqlldr PRDADM/PRDADM@PDBPRD CONTROL=LOADER_100MB_10COL.CTL SILENT=ALL
DIRECT=Y
)
set ENDTIME=%TIME%
set /A STARTTIME=(1%STARTTIME:~0,2%-100)*360000 + (1%STARTTIME:~3,2%100)*6000 + (1
%STARTTIME:~6,2%-100)*100 + (1%STARTTIME:~9,2%-100)
set /A ENDTIME=(1%ENDTIME:~0,2%-100)*360000 + (1%ENDTIME:~3,2%-100)*6000
+ (1%ENDTIME:~6,2%-100)
*100 + (1%ENDTIME:~9,2%-100)
set /A DURATION=%ENDTIME%-%STARTTIME%
echo %DURATION% milliseconds to run LOADER_100MB_10COL
Exemplo 19. Executvel LOADER.BAT para controle de Chamadas ao SQL*Loader.

You might also like