Você está na página 1de 68

9

7
7
1
6
7
7
9
1
8
0
0
4
4
5
0
0
0
I
S
S
N
1
6
7
7
9
1
8
-
5
Sumrio
Proj. Software /
Modelagem
Modelo Pr-Fabricado
06 Modelagem de Dados: Estudo de Caso
Cenrio de Reserva de Hotel
Desafio SQL
Linguagem SQL
16 Desafio SQL Magazine
[ Wagner Crivelini ]
Proj. Software /
Modelagem
12 Modelagem de Dados Padro de nomenclatura de banco de dados
[ Carlos Tsuyoshi Matsuki ]
34 Modelagem de um Sistema de Integrao
de Fontes de Dados Heterogneas
[ Srgio Luis Sardi Mergen ]
Proj. Software /
Modelagem
Primeiros Passos
em Banco de Dados
44 Replicao Oracle Parte II: Mantenha os dados
sincronizados para garantir qualidade nos testes de software
[ Slvio Padlipskas e Marcio Henrique Guimares ]
Dia a dia
Linguagem SQL
30 Escrevendo Outer Joins em T-SQL
[ Kathi Kellenberger ]
[ Desafio SQL ] Neste tipo de artigo proposto um desafio para o
leitor; Em geral a resposta para o desafio se encontra no prprio artigo.
[ Linguagem SQL ] Artigo sobre ou que envolva a linguagem SQL
[ Proj. Software / Modelagem ] Artigo dentro do contexto
de Modelagem/Projeto/Engenharia de Software
Dia a dia
52 Monitoramento de base de dados: Como manter
os bancos de dados da sua empresa sob controle
[ Mauro Pichiliani ]
Linguagem SQL
22 Introduo a SQL (Structured Query Language) Parte I
[ Ary Jnior ]
[ Primeiros Passos em Banco de Dados ] Com foco no
leitor iniciante
[ Coluna Dia a dia ] Artigo sobre banco de dados com foco
em necessidades dirias de um administrador. Por exemplo, um
artigo sobre o trace de comandos SQL para encontrar algum lack
de performance.
Ol, eu sou o DevMan! Desta pgina em diante, eu estarei lhe
ajudando a compreender com ainda mais facilidade o conte-
do desta edio. Ser um prazer contar com sua companhia!
Confira abaixo o que teremos nesta revista:
Voc percebeu os cones ao lado de cada matria? Eles in-
dicam o que voc vai encontrar no artigo dessa forma,
voc tambm pode ter uma idia geral do que vai encon-
trar nesta edio como um todo! Os editores trabalham
sempre no sentido de fechar a revista seguindo esta defi-
nio, para oferecer a voc o melhor contedo didtico!
Confira abaixo a lista com a definio dos tipos de artigo
encontrados nesta edio:
60 Trabalhando na prtica com parties no MySQL 5.1
[ Giuseppe Maxia ]
Primeiros Passos
em Banco de Dados
[ Modelo Pr-Fabricado ] Este tipo de artigo apresenta um
modelo (E/R, UML, etc) pronto; O autor comenta os pontos prin-
cipais do modelo, como chegou a obt-lo, etc. O objetivo deste tipo
de artigo dar um caminho das pedras para o leitor, fornecendo
um modelo pr-construdo.
SQL54.indb 3 22.05.08 03:12:32
Expediente Editorial
Rodrigo Oliveira Spnola
editor@sqlmagazine.com.br
A revista SQL Magazine parte integrante da assinatura SQL PLUS.
Para mais informaes sobre o pacote SQL PLUS, acesse:
http://www.devmedia.com.br/sqlmagazine/pagina.asp
Apoio
Assinatura
Mais contedo SQL por menos!
Ano 5 - 54 Edio 2008 - ISSN 1677918-5 - Impresso no Brasil
Atendimento ao Leitor
A DevMedia conta com um departamento exclusivo
para o atendimento ao leitor. Se voc tiver algum
problema no recebimento do seu exemplar ou
precisar de algum esclarecimento sobre assinaturas,
exemplares anteriores, endereo de bancas de
jornal, entre outros, entre em contato com:
Carmelita Mulin Atendimento ao Leitor
www.devmedia.com.br/central/default.asp
(21) 3382-5025
Kaline Dolabella Gerente de Marketing e
Atendimento
kalined@terra.com.br
(21) 3382-5025
Publicidade
Para informaes sobre veiculao de anncio na
revista ou no site e para fechar parcerias ou aes
especficas de marketing com a DevMedia, entre
em contato com:
Kaline Dolabella
publicidade@devmedia.com.br
Corpo Editorial
Editor Geral
Rodrigo Oliveira Spnola
rodrigo@sqlmagazine.com.br
Sub Editores
Arilo Cludio Dias Neto, Eduardo Oliveira Spnola e
Ricardo Rezende
Editor de Arte
Vinicius O. Andrade
viniciusoandrade@gmail.com
Capa
Antonio Xavier
antonioxavier@devmedia.com.br
Reviso
Gregory Monteiro
gregory@clubedelphi.net
Na Web
www.devmedia.com.br/sqlmagazine/pagina.asp
Distribuio
Fernando Chinaglia Dist. S/A
Rua Teodoro da Silva, 907
Graja - RJ - 206563-900
Fale com o Editor!
muito importante para a equipe saber o que voc est
achando da revista: que tipo de artigo voc gostaria de
ler, que artigo voc mais gostou e qual artigo voc menos
gostou. Fique a vontade para entrar em contato com os
editores e dar a sua sugesto!
Se voc estiver interessado em publicar um artigo na
revista ou no site SQL Magazine, entre em contato com os
editores, informando o ttulo e mini-resumo do tema que
voc gostaria de publicar:
Rodrigo Oliveira Spnola - Editor da Revista
editor@sqlmagazine.com.br
EDITORIAL
Atualmente, o volume de dados armazenado nos sistemas de
bancos de dados das mais diversas organizaes est crescendo
de forma bastante acelerada. E para que isto ocorra, necess-
rio que os Sistemas Gerenciadores de Bancos de Dados (SGBD)
forneam opes para que o armazenamento de dados e poste-
riormente a recuperao de informaes ocorra da melhor for-
ma possvel.Para que isso seja possvel, a SQL prov um conjun-
to de facilidades. Neste contexto, a SQL Magazine destaca nesta
edio trs matrias com foco na SQL:
|ntroduao a SQL (Structured Query Language) - Parte |
Desafio SQL
Lscrevendo Outer 1oins em T-SQL
Destacamos tambm nesta edio uma matria muito interes-
sante sobre monitoria de banco de dados. A monitoria de base
de dados uma das principais responsabilidades do DBA, no
apenas por envolver diversas observaes, mas tambm por en-
globar todo o gerenciamento, administrao, manuteno e me-
lhorias nas bases de dados. Apesar de no ser uma tarefa muito
complexa, preciso contar com vrios recursos para estabelecer
uma monitoria confivel, segura e que pode representar a dife-
rena entre um ambiente controlado e um ambiente catico.
Nesta edio ainda temos:
Modelagem de Dados: Lstudo de Caso - Cenario de Peserva
de Hotel;
Modelagem de Dados: Padrao de nomenclatura de banco de
dados;
Modelagem de um Sistema de |ntegraao de Pontes de Dados
Heterogneas;
Peplicaao Oracle - Parte ||: Mantenha os dados sincronizados
para garantir qualidade nos testes de software;
Trabalhando na pratica com partioes no MySQL 5.l.
Uma tima leitura a todos.
Abraos.
SQL54.indb 4 22.05.08 03:12:35
Ediao 50 - SQL Magazine 5
A SQL Magazine tem que ser feita ao seu gosto. Para isso, precisamos saber o
que voc, leitor, acha da revista!
D seu voto sobre esta edio, artigo por artigo, atravs do link:
www.devmedia.com.br/sqlmagazine/feedback
Para votar, voc vai precisar do cdigo de banca desta edio, que : sonic
D seu feedback sobre esta edio!
Voc pode comprar todas as edies anteriores da SQL Magazine na verso impressa ou verso digital! Veja abaixo as opes:
Ldioes anteriores em formato impresso - acesse https://seguro.devmedia.com.br/edicoes_anteriores.asp
Edies anteriores em formato online (2 opes):
i) Com a assinatura GOLD, voce tem acesso integral a todas as edioes |a lanadas da SQL Magazine - Saiba mais em http://www.devmedia.com.br/assgold/
ii) Com Creditos DevMedia, voce pode comprar uma ediao online avulsa ou pode comprar somente os `artigos` que voce dese|ar - voce pode ate mesmo
misturar artigos de varias edioes, de forma l00% online! Para saber mais sobre Creditos DevMedia, acesse www.devmedia.com.br/creditos; Para visitar a
biblioteca digital de artigos da SQL Magazine, visite http://www.devmedia.com.br/assgold/listmag.asp?site=2
Edies Anteriores da SQL Magazine
Brinde na web desta edio
1) Comandos SQL na prtica - Parte I - Criando tabelas e restries de entradas de dados em colunas
Demonstrao de comandos SQL para criao de tabela e restries de entradas de dados em colunas.
2) Comandos SQL na prtica - Parte II - Restries avanadas na criao de tabelas
Demonstrao de comandos SQL para criao de tabelas e restries de entradas de dados em colunas.
3) Relatrios com ReportViewer no Visual Studio 2005 - Parte I
Lsta video aula mostra como criar relatorios com o Peportviewer. O autor mostra como criar uma listagem
simples.
4) Relatrios com ReportViewer no Visual Studio 2005 - Parte II
Lsta video aula mostra como criar relatorios com o Peportviewer. O autor mostra como atrabalhar com
parmetros em relatorios do Peport viewer.
Para visualizar acesse o link:
http://www.devmedia.com.br/articles/listcomp.asp?keyword=sql54&codigobanca=soni c
4
Vdeos
Gostou das vdeo aulas? O portal www.devmedia.com.br possui mais de 2 mil vdeo aulas e dezenas de
cursos online sobre desenvolvimento de software! Agora voc pode comprar as vdeo aulas que preferir e fazer
sua prpria combinao de vdeos! Saiba mais em www.devmedia.com.br/creditos
Informativo SQL Magazine
Portal SQL Magazine
www.devmedia.com.br/sql/
Na DevMedia, o leitor de banca tambm ganha!
D

s
e
u
F
e
edb
a
c
k
s
o
b
r
e
e
s
t
a
e
d
i o
SQL54.indb 5 22.05.08 03:12:36
6 SQL Magazine - Modelagem de Dados
Modelagem de Dados
Estudo de Caso Cenrio de Reserva de Hotel
[ Projeto ]
O
objetivo deste artigo apre-
sentar uma viso geral sobre
modelagem de dados, uma
habilidade que qualquer desenvolvedor
deveria ter, mesmo que de forma bsica.
Eles no precisam ser sempre especia-
listas neste assunto, mas devem estar
preparados para serem envolvidos na
criao de um modelo, ler um modelo de
dados existente, entender quando criar
ou no um modelo de dados e conhecer
as tcnicas fundamentais para sua ela-
borao. Para facilitar o entendimento
sobre modelagem de dados, neste artigo
ser apresentado um estudo de caso de
um sistema de reserves de hotel.
O que modelagem de dados?
Modelagem de dados se refere ativi-
dade de esecihcao das eslruluras de
dados e regras de negcio necessrias
para suportar uma rea de negcios.
Assim como outros artefatos de modela-
gem, modelos de dados podem ser usa-
dos para uma variedade de propsitos, a
partir do modelo conceitual de alto nvel
at o modelo fsico dos dados. Do ponto
de vista de um desenvolvedor que uti-
liza o paradigma orientado a objetos, a
modelagem de dados conceitualmente
similar modelagem das classes. Com
a modelagem dos dados voc idenlihca
tipos de entidade, assim como na mode-
lagem de classes voc idenlihca as clas-
ses. Atributos de dados so associados a
tipos de entidades, assim como atributos
e mtodos so associados a classes.
Existem associaes entre entidades,
similar s associaes entre as classes
relacionamentos, herana, composio e
agregao so tambm conceitos aplic-
veis modelagem de dados.
Entretanto, importante destacar que
a modelagem de dados tradicional di-
ferente da modelagem de classes porque
ela foca apenas nos dados, enquanto que
classes exploram tambm aspectos com-
portamentais e os dados de um domnio.
Ior conla desse foco, rohssionais que
atuam na modelagem de dados possuem
SQL54.indb 6 22.05.08 03:12:41
Ldiao 54 - SQL Magazine 7
PROJ. SOFTWARE / MODELAGEM E MODELO PR- FABRI CADO
uma tendncia em serem melhores na
dehnio de dados do que modeladores
de objetos. No entanto, alguns deles iro
modelar tambm mtodos de bancos de
dados (stored procedure, stored functions e
triggers) quando eles esto modelando os
dados hsicamenle.
Como modelos de dados so
usados na prtica?
Precisamos discutir agora como mo-
delos de dados podem ser usados na
prtica. Trs estilos bsicos de modelos
podem ser encontrados:
Modelo Conceitual de Dados: esses
modelos, algumas vezes chamado de
modelos de domnio, so tipicamente
usados para explorar conceitos do
domnio com os envolvidos no projeto.
Eles normalmente so criados como
parte do levantamento dos requisitos
de uma aplicao e so usados para ex-
plorar a estrutura e conceitos estticos
de alto nvel. Normalmente modelos
conceituais de dados so criados como
precursores ou alternativas para Mode-
los Lgicos de Dados.
Modelos Lgico de Dados: so
usados para explorar os conceitos do
domnio e seus relacionamentos. Isso
pode ser feito no escopo de um simples
projeto ou para uma empresa inteira.
Modelos lgicos de dados descrevem os
tipos lgicos de entidades, tipicamente
referenciados como tipos de entidades,
os atributos de dados descrevendo
essas entidades e os relacionamentos
entre as entidades.
Modelos Fsico de Dados: so usados
para projetar o esquema interno de banco
de dados, descrevendo tabelas de dados,
suas colunas e relacionamentos entre elas.
Estes modelos so o foco deste artigo.
Apesar de os modelos lgicos e fsicos
parecerem similar, e de fato eles so, o n-
vel de detalhe que eles modelam pode ser
signihcanlemenle diferenle. Islo orque
o objetivo de cada diagrama diferente.
AFigura 1 apresenta um simples modelo
lgico de dados e a Figura 2 um simples
modelo fsico, ambos modelando os con-
ceitos de clientes e endereos assim como
o relacionamento entre eles. Observe
como o modelo fsico de dados mostra
mais detalhes, incluindo uma tabela
associativa necessria para implementar
a associao bem como as chaves neces-
srias para manter os relacionamentos.
Um modelo fsico de dados deve tambm
indicar os tipos de dados para as colunas,
tais como integer e char(5).
Quando um banco de dados relacional
usado para armazenamento de dados,
recomenda-se criar um modelo fsico de
dados para modelar seu esquema interno.
Normalmente o modelo fsico de dados
um dos artefatos crticos de um projeto
de desenvolvimento de software.
Como modelar os dados
Veremos a part i r de agora como
desempenhar as seguintes tarefas no
Figura 1. Modelo lgico de dados.
contexto das atividades de modelagem
de dados:
Idenlihcar lios de enlidade,
Idenlihcar alribulos,
Idenlihcar relacionamenlos,
Dehnir chaves,
Transformar um modelo lgico de
dados em um modelo fsico de dados.
Para descrever tais passos, iremos usar
um estudo de caso de um sistema de
reservas de hotis.
Estudo de Caso: Sistema de
Reservas em Hotel
Um hotel local precisa de um sistema
que mantenha os registros de suas
reservas (futuras, atuais e arquivadas),
quartos e hspedes. Um quarto pode ser
de um tipo e uma faixa de preo par-
ticular. Os preos dos quartos variam
de quarto pra quarto (dependendo de
seu tipo, facilidades disponveis, faixas,
etc.) e de temporada para temporada
(dependendo do perodo do ano). Uma
reserva de quarto pode incluir um
quarto e mais que um cliente.
Diversas questes podem ser feitas
a partir dos dados do banco de dados,
tais como:
SQL54.indb 7 22.05.08 03:12:45
8 SQL Magazine - Modelagem de Dados
Quantos quartos esto atualmente
disponveis para reserva?
Quais facilidades esto disponveis
em quartos particulares?
Quais hspedes esto reservados para
uma semana?
Identificao de tipos de entidades
Um tipo de entidade, tambm chamado
simplesmente de entidade, conceitual-
mente similar ao conceito de classes em
orientao a objetos um tipo de enti-
dade representa uma coleo de objetos
similares. Um tipo de entidade pode
representar uma coleo de pessoas,
lugares, coisas, eventos ou conceitos.
No estudo de caso que estamos seguin-
do, as enlidades idenlihcadas foram:
Customers (Clienles),
Guests (Hsedes),
Rooms (Quarlos),
Bookings (Reservas),
Payments (Iagamenlos),
Room Types (Tios de Quarlo),
Price Bands (Iaixas de Ireo),
Room Facilities (Facilidades de Quarto).
Identificao de atributos
Cada tipo de entidade deve ter um ou
mais atributos de dados. Por exemplo,
na Figura 1 podemos ver que a entidade
Customer (Cliente) possui atributos como
First Name (Primeiro Nome) e Surname
(Sobrenome) e na Figura 2 que a tabela
TCUSTOMER possui as colunas de
dados correspondentes CUST_FIRST_
NAME e CUST_SURNAME (a coluna a
implementao de um atributo de dados
em um banco de dados relacional).
Atributos devem tambm estar de
acordo com o domnio da aplicao. Por
exemplo, na Figura 1 decidiu-se que seria
modelado o fato de que pessoas possuem
primeiro nome (rsi ncmc) e sobrenome
(surname), ao invs de model-las com
um atributo nico chamado nome (ex.:
Cludio e Dias vs. Cludio Dias).
Esta deciso bastante importante em
um banco de dados e possui um impacto
signihcanle nos esforos de desenvolvi-
mento e manuteno de um banco de
dados. Refatorar uma simples coluna
de dados em vrias colunas pode ser
difcil quando parte da aplicao j tiver
sido desenvolvida, por isso importante
atentar para este detalhe durante o pro-
jeto do modelo de dados.
No estudo de caso que estamos seguin-
do, a lista com os atributos das entidades
idenlihcadas anleriormenle esl aresen-
tada na Tabela 1. Os tipos dos atributos
sero dehnidos na conlinuidade desle
artigo. Alm disso, os relacionamentos
entre as tabelas, que sero abordados a
seguir, iro introduzir novos atributos e
novas tabelas ao modelo.
Identificao de relacionamentos
No mundo real, entidades possuem
relacionamentos com outras entidades.
Por exemplo, clientes FAZEM reservas e
quartos POSSUEM faixas de preo. FA-
ZLM ou ISSULM so lermos que deh-
nem relacionamentos entre entidades.
AFigura 3 descreve o modelo lgico de
dados para o sistema de reserva de hotel.
Ele deve seguir as regras estabelecidas
como requisitos para a aplicao:
Um Cliente pode fazer uma ou mais
Reservas,
Uma Reserva pode ser feita para um
ou vrios Hspedes o Hspede no
necessariamente a mesma pessoa que
fez a Reserva,
Um Quarto pode estar em uma ou
vrias reservas,
Um Quarto pode ter muitas Facilida-
des diferentes.
A primeira coisa a ser notada so os
vrios ttulos aplicados aos nomes dos re-
lacionamentos. Por exemplo, o relaciona-
mento entre Customers (Clientes) e Bookings
(Reserva) possui o nome faz, indicando
que um cliente responsvel pela solici-
tao de uma reserva no sistema. J em
relao s entidades Room (Quarto) e Price
Bands (Faixa de Preo), o relacionamento
foi chamado de associado, indicando
que cada quarto associado a uma (ou
Figure 2. Modelo fsico de dados.
SQL54.indb 8 22.05.08 03:12:50
Entidades Atributos
Customers
(Clientes)
Ttulo, Primeiro Nome, Sobrenome, Data de Nascimento, Rua, Cidade, Pas, CEP,
Telefone Residencial, Telefone Comercial, Telefone Celular e E-mail
Guests
(Hspedes)
Ttulo, Primeiro Nome, Sobrenome, Data de Nascimento, Rua, Cidade,
Pas, CEP e Telefone de Contato
Rooms
(Quartos)
Andar e Notas
Bookings
(Reservas)
Data da reserva, Hora da reserva, Data de entrada, Data de sada, Data do
pagamento, Total do pagamento e Comentrios
Payments
(Pagamentos)
Valor, Comentrio e Mtodo de Pagamento
Room Types
(Tipos de Quarto)
Descrio
Price Bands
(Faixas de Preo)
Descrio
Room Facilities
(Facilidades de Quarto)
Descrio
Tabela 1. Lista de atributos por entidade
vrios) faixa, dependendo da cardina-
lidade do relacionamento.
J que lembramos disso, precisamos
lambm idenlihcar a cardinalidade
e opcionalidade do relacionamento.
Cardinalidade representa o con-
ceito de quantos enquanto que a
opcionalidade representa o conceito
de se voc deve ter alguma coisa.
Ior exemlo, no suhcienle saber
que clientes solicitam reservas. As
informaes necessrias vo alm
disso: Quantas reservas podem um
cliente solicitar? Nenhuma, uma ou
vrias? Alm disso, relacionamentos
so bidirecionais: no apenas clien-
tes fazem reservas, mas reservas
so feitas por clientes. Isso sugere
questes como: quantos cl ientes
podem fazer uma nica reserva e
possvel ter uma reserva sem um
cliente associado?
A Figura 3 mostra que clientes
podem fazer uma ou mais reservas
(de acordo com o que foi dehnido
como restrio), e que uma reserva
precisa estar associada a um cliente.
Ela tambm mostra que um quarto
est associado a uma ou vrias faci-
lidades (diversas podem estar dis-
ponveis nele) e que uma facilidade
pode ser associada a zero, um ou
vrios quartos (um quarto pode ter
vrias das facilidades providas pelo
hotel, ou nenhuma).
Definio de chaves
Existem duas estratgias fun-
damentais para defi nir chaves
para tabelas. Primeiro, podemos
definir uma chave natural que
formada por um ou mais atribu-
tos de dados existentes na tabela
que identificam unicamente um
registro. No estudo de caso de
caso para o si stema de reser-
vas, nenhuma tabela possui um
atributo que permita identificar
unicamente um registro. Como
no temos, devemos adot ar a
segunda estratgia, onde pode-
mos introduzir uma nova coluna
chamada de chave substituta, ou
seja, uma chave que no tem sig-
nificado algum para o domnio.
Um exemplo disso seria a criao
de um atributo CustomerID na
tabela Customers (Clientes), pois
esta tabela no possui uma chave
natural (a no ser que fosse feita
uma combi nao com diversos
campos at se garantir unicidade).
Portanto, introduzir uma chave
substituta a melhor opo para
nosso caso. Na continuidade deste
artigo iremos conhecer as chaves
criadas para cada tabela.
Apesar de o debate entre chaves
naturais vs. substitutas ser uma
das vrias questes religiosas na
comunidade de banco de dados, o
02 - Modelagem de Dados 9 29.05.08 01:38:34
10 SQL Magazine - Modelagem de Dados
fato que nenhuma das estratgias
perfeita e voc s descobrir na prtica
que algumas vezes faz mais sentido usar
chaves naturais e em outras situaes
chaves substitutas.
Transformando o modelo lgico de
dados em modelo fsico de dados
Com o modelo lgico de dados dehni-
do, podemos criar o seu modelo fsico.
Alguns passos devem ser seguidos para
essa transformao, mas o primeiro deles
seria a traduo dos termos que usamos
nos modelos lgicos, como entidades,
classes, objetos, atributos, agregao,
herana, dentre outros, para os termos
esechcos usados nos modelos fsicos,
como tabelas, colunas, chaves e restri-
es. Obviamente, esta simples trans-
formao conceitual no ir resultar em
um projeto de banco de dados completo
e correto, ele apenas o primeiro passo.
A transformao consiste tambm nos
demais passos:
Transformar enlidades em labelas,
Transformar alribulos em colunas,
Transformar domnios em tipos de
dados e reslries,
Transformar relacionamentos em
novas tabelas ou em atributos de tabelas
que j fazem parte do modelo.
Para apoiar o mapeamento de atributos
a colunas de tabelas precisamos mapear
cada domnio lgico do atributo para um
tipo de dados fsico e talvez adicionar al-
gumas restries. Em um banco de dados
fsico, cada coluna deve ser associada a
um tipo de dados. Certos tipos de dados
requerem um tamanho mximo a ser
esecihcado. Ior exemlo, um lio de da-
dos caraclere ode ser esecihcado como
CHAR(25), indicando que at 25 caracteres
podem ser armazenados na coluna.
Como | foi dilo, a esecihcao de uma
chave primria parte de um projeto
fsico de entidades e atributos.
Talvez o ponto mais importante des-
ta transformao seja a interpretao
dos relacionamentos do modelo de
dados lgico, adicionando-os ao mo-
delo fsico. Isso requer algumas regras
bsicas que iremos utilizar para a
construo do modelo fsico de dados
para o estudo de caso do sistema de
reservas de hotel:
Relacionamentos com multiplicida-
de 1:1 se transformam em uma coluna
(chave estrangeira) em qualquer uma das
tabelas que formam o relacionamento.
Com isso, nada feito no modelo.
Em relacionamentos com multiplici-
dade 1:N a chave primria da tabela com
multiplicidade 1 pode ser adicionada
como uma chave estrangeira na tabela
com multiplicidade N. Com isso, nada
feito no modelo.
Em relacionamentos com multiplici-
dade N:N torna-se necessria a criao
de uma tabela de associao, que ser
composta basicamente por uma chave
primria substituta (a ser criada), e duas
chaves estrangeiras referentes s chaves
primrias das duas tabelas que formam
o relacionamento, alm de eventuais
outros atributos que caracterizem a
relao. A nova tabela ter uma cardina-
lidade de 1:N com cada uma das tabelas
que formam o relacionamento.
Dessa forma, o modelo fsico para
nosso estudo de caso est representado
na Figura 4.
O que foi feito nesse modelo:
O relacionamento entre as tabe-
las Reserva (tbl_Bookings) e Quarto
(tbl_Rooms) e Reserva (tbl_Bookings) e
Hspede (tbl_Guests) resultou em uma
nova tabela, chamada na Figura 4 de
tbLINK_BookingsRooms, composta pelas
chaves estrangeiras das tabelas de Reser-
va (tbl_Bookings), quarto (tbl_Rooms) e
hspedes (tbl_Guests).
O relacionamento entre as tabelas
Quarto (tbl_Room) e Facilidades (tbl-
FacilitiesList) resultou em uma nova
tabela, chamada na Figura 4 de tbLINK_
RoomsFacilities, composta pelas chaves
estrangeiras das tabelas tbl_Rooms e
tblFacilitiesList.
Assim, este modelo est pronto para
gerao do banco de dados.
Concluso
Este artigo apresentou um estudo de
caso de um sistema de reservas de hotel
para o qual foi feita sua modelagem de
dados desde a parte conceitual (modelo
lgico de dados) at chegarmos no mo-
delo fsico de dados. O sistema em si no
to complexo e no apresenta muitos
desahos de modelagem. ob|elivo com
o seu uso foi apresentar um ponto de
partida para que os desenvolvedores
possam entender como funciona o pro-
cesso de modelagem de dados.
D seu feedback sobre esta edio!
A SQL Magazine tem que ser feita ao seu
gosto. Para isso, precisamos saber o que
voc, leitor, acha da revista!
D seu voto sobre este artigo, atravs do link:
www.devmedia.com.br/sqlmagazine/feedback
D

s
e
u
Feedbac
k
s
o
b
r
e
e
s
t
a
e
d i o
Figura 3. Modelo logico de dados para o Sistema de Peservas.
SQL54.indb 10 22.05.08 03:12:54
Ldiao 54 - SQL Magazine 11
PROJ. SOFTWARE / MODELAGEM E MODELO PR- FABRI CADO
Figura 4. Modelo Plsico de Dados para o Sistema de Peservas.
AMIGO
Existem coisas
que no conseguimos
ficar sem!
...s pra lembrar,
sua assinatura pode
estar acabando!
Renove J!
www.devmedia.com.br/renovacao
Para mais informaes:
www.devmedia.com.br/central
SQL54.indb 11 22.05.08 03:12:56
12 SQL Magazine - Modelagem de Dados
Modelagem de Dados
Padro de nomenclatura de banco de dados
Carlos Tsuyoshi Matsuki
cmatsuki@gmail.com
Formado em Engenharia de Computao pela
UNICAMP, trabalha atualmente na IBM Brasil
como DBA de desenvolvimento em um projeto
internacional. Trabalhou em diversas reas da
computao (programao, anlise de dados, su-
porte ao cliente) e especialista em modelagem
de banco de dados.
[ Projeto ]
Projeto SQL Magazine
A coluna projeto deste ms nos traz
boas prticas antes de iniciar um projeto
de banco de dados.
Carlos Tsuyoshi Matsuki usa da sua
experincia como especialista em mo-
delagem de banco de dados e tambm
como DBA para listar uma srie de dicas
de padronizao para a nomenclatura de
banco de dados.
Boa leitura
Ricardo Rezende
Editor tcnico
DevMan - Veja neste artigo:
Padres de nomenclatura na modelagem de banco de dados.
- Definio de mnemnicos para os tipos de colunas;
- Abreviaes dos nomes utilizados nas entidades;
- Mnemnicos diferentes para diferentes modelos de dados;
- Melhor posicionamento para a identificao do tipo de coluna;
- Padres de nomenclaturas legados.
SQL54.indb 12 22.05.08 03:13:00
Ldiao 54 - SQL Magazine 13
PROJETO DE SOFTWARE E MODELAGEM
U
ma boa prtica para a mode-
lagem de dados definir um
padro de nomenclatura para
os objetos do banco de dados (modela-
gem fsica). Isso ajuda na visualizao
e entendimento do banco de dados,
bem como a defi nio dos li mites
entre diferentes estruturas de bancos
de dados dentro de um sistema mais
amplo (composto de vrios modelos
de bancos de dados integrados). Este
artigo objetiva apoiar o analista de
dados a organizar melhor a sua mo-
delagem e tornar a modelagem fsica
uma boa ferramenta no entendimento
do sistema proposto para o banco.
Vamos s boas prticas!
Defina mnemnicos para os
tipos de colunas
Os mnemnicos podem ser definidos
como abreviaturas das entidades ou
atributos do modelo lgico (por exem-
plo, podemos usar TBL para definir
tabela, TBS para definir tablespace,
etc). Eles so muito teis na visuali-
zao da estrutura das tabelas, pois
definem bem o escopo de cada coluna.
Estes mnemnicos podem ser classifi-
cados de diversas maneiras e diversos
tamanhos, mas um bom padro uti-
lizarmos dois ou trs caracteres para
cada mnemnico. Os tipos de colunas
mais comuns so:
Nome/Descrio: define o nome
ou descrio de um objeto. Muitas
vezes estes tipos de colunas podem
ser confundidos entre si, entretanto,
a coluna nome simplesmente a defi-
nio do objeto em si e descrio um
algo a mais de informao relativo ao
objeto. Por exemplo, numa entidade
Produtos Japoneses poderamos
ter atributos nome do Produto e
descrio do Produto, que poderiam
ter valores, por exemplo: WASABI
e Pasta temperada picante muito
utilizada na cozinha japonesa, de-
monstrando o nome do produto e uma
breve descrio do que o produto.
Quando o nome em si j defi ne o
objeto, sem ser necessria nenhuma
coluna adicional para explicar o ob-
jeto, a coluna descrio no se faz
necessria. Estes dois campos so do
tipo CARACTERE, e algumas de seus
mnemnicos mais encontrados so:
NM, NOM (para Nome) e DS, DSC ou
DLS (ara descrio),
Cdigo: dehne um cdigo (geral-
mente mnemnico) de um objeto. Por
exemplo, para uma tabela de unidades
de medidas, poderamos ter um atribu-
to Cdigo Medida, com valores M
(metro), L (litro), MIN (minutos), e
assim por diante. Esta coluna do tipo
CARACTERE, embora muitas vezes
possamos encontrar valores inteiros
para esta coluna, principalmente desig-
nando uma coluna de chave primria
(PK) para uma tabela (embora, para
colunas que so chaves primrias de
uma labela eu rehra a coluna Iden-
lihcao, descrila abaixo). Iossveis
mnemnicos so CD, CD,
Status: a coluna status em uma ta-
bela dehne o eslado do regislro. Assim
como o cdigo, geralmente ela possui
valores como A,AT (Ativo), CAN
(Cancelado), I,IN (Inativo), EXP
(Expirado), etc. Esta coluna do tipo
CARACTERE e possveis mnemnicos
so ST, STA,
Observao/Texto: so colunas utili-
zadas para informao adicional. Estes
campos so CARACTERE e possveis
mnemnicos so OB, OBS (Observao)
e TX, TXT (Texlo),
Data: coluna que indica data, sejam
elas datas com ou sem incluso de horas,
minutos, segundos e at milissegundos.
Possveis mnemnicos so DT, DAT, TS
(Timestamp, campo com indicao de
al milisegundos),
Idenlihcador: coluna que geralmenle
indica a chave primria (PK). Geralmen-
te associamos esta coluna a uma seqn-
cia. Com isso, esta uma coluna do tipo
NUMRICO, e possveis mnemnicos
so ID, IDL,
Nmero/Valor/Quantidade: colunas
usadas ara dehnir diferenles lios NU-
MRICOS (por exemplo, valor de com-
pra do produto, quantidade comprada
do produto, nmero da casa). Possveis
mnemnicos so NUM, NBR (Nmero),
VL, VLR, VAL (Valor) e QT, QTD, QTT
(Quanlidade),
Abreviaes dos nomes utilizados nas
entidades
Dehna abreviaes ara os nomes que
so utilizados nas entidades (modelo
lgico) de forma que voc possa com-
por os nomes de campos e/ou tabelas
do modelo fsico. Muitas vezes criamos
os nomes de colunas/tabelas si m-
plesmente eliminando os espaos em
branco utilizados nos modelos lgicos
e substituindo-os por _ (por exemplo,
uma coluna/tabela chamada Carac-
terstica Produto viraria, no modelo
fsico, CARACTERISTICA_PRODU-
TO), mas os bancos de dados em geral
possuem limitao de tamanho para
nomes de tabelas e colunas.
O Oracle, por exemplo, tem uma limi-
tao de tamanho de 30 caracteres, mas
verses mais antigas de DB2 possuem
limitao de apenas 18 caracteres. Mui-
tas empresas j possuem um dicionrio
de dados onde dehnem reviamenle as
abreviaes dos nomes mais utilizados.
Desta forma, seria uma boa idia que
voc tambm comeasse a criar seu
prprio dicionrio de dados com estes
nomes (uma dica, comece a compor
seu dicionrio com nomes que voc vai
encontrar muito: cliente, produto, ende-
reo, tipo...). No exemplo citado anterior-
mente poderamos ter CARAC_PROD
ara Caraclerslica Irodulo,
Estabelea mnemnicos para diferentes
modelos de dados dentro de
um sistema maior
Um sistema pode conter vrios mode-
los de dados que poderiam ser melhor
visualizados se todas as tabelas de um
modelo possurem um mnemnico
que os represente. Por exemplo, um
sistema de informao de uma em-
presa pode ter sistemas relativos ao
selor hnanceiro, ao selor comercial, ao
setor administrativo, etc. Poderamos
ter as tabelas que comecem com os
mnemnicos FIN (Financeiro), COM
(Comercial) e ADM (Administrati-
vo), dehnindo cada um dos modelos.
Vale destacar que esta boa prtica
pode ser ignorada se os diferentes
modelos dentro de um sistema maior
esto em diferentes schemas, pois os
SQL54.indb 13 22.05.08 03:13:01
14 SQL Magazine - Modelagem de Dados
Figura 1. Modelo lgico base.
schemas | dehniriam os limiles de
cada um dos modelos.
Identificao do tipo de coluna
no comeo ou no final?
Por exemplo, atributo Identifica-
o Produto seria ID_PROD ou
PROD_ID? Em geral seguimos a or-
dem das palavras dos atributos. Ento,
ara Idenlihcao Irodulo leramos
ID_PROD, mas se formos fazer a
modelagem de dados em ingls, o atri-
bulo seria Iroducl Idenliher, e assim
teramos PROD_ID como nome fsico
desta coluna.
Padres de nomenclatura j
existentes no cliente
Se voc vai desenvolver um modelo de
dados para um cliente, sempre pergunte
se eles j possuem um documento com
regras de nomenclatura de banco de
dados. Se existe um documento com
padres de nomenclatura, use-as. Caso
negalivo, dehna o modelo com seu r-
prio padro de nomenclatura, e quem
sabe seu padro de nomenclatura possa
ser discutido no cliente e virar a regra de
nomenclatura da empresa.
padronizada teramos que recorrer
ao modelo para ver o tipo do campo
cli ente (tabel a ENTRADA_CAIXA).
Esta uma pequena visualizao de
modelo, mas imagine um modelo com
dezenas de tabelas e nomes de colunas
to diferentes, e sem padronizao.
Concluses
Estas so apenas algumas dicas de
como voc ode dehnir seu rrio a-
dro de nomenclatura de banco de dados,
o que torna seu modelo mais organizado
e de fcil visualizao e entendimento.
Isso tambm pode trazer benefcios nas
atividades de modelagem uma vez que
voc vai seguir um padro j existente,
agilizando o seu trabalho.
Exemplos de modelagem com e
sem padronizao
Este exemplo no de um modelo real,
vou criar entidades isoladas de modelos de
sislemas hnanceiros, comerciais e adminis-
trativos, a partir de um modelo lgico.
A Figura 1 apresenta o modelo lgico
utilizado como base.
Com base no modelo lgico apresen-
tado na Figura 1, criei um modelo fsico
sem utilizar qualquer padronizao (ver
Figura 2). Infelizmente no raro nos
depararmos com este tipo de abordagem
na vida real.
Com base no mesmo modelo lgico
apresentado na Figura 1, criei tambm
um modelo fsico utilizando os conceitos
de padronizao apresentados neste
artigo (ver Figura 3). Perceba como a
visualizao se torna muito mais clara.
No modelo padronizado da Figura
3 vemos quai s tabelas pertencem
aos sistemas financeiro, administra-
tivo e comercial. Alm disso, com a
padronizao das colunas sabemos
de antemo (sem precisar ol har o
modelo) que a coluna id_cliente (tabela
FIN_ENTRD_CAIXA) um campo nu-
mrico, sendo que na modelagem no
D seu feedback sobre esta edio!
A SQL Magazine tem que ser feita ao seu
gosto. Para isso, precisamos saber o que
voc, leitor, acha da revista!
D seu voto sobre este artigo, atravs do link:
www.devmedia.com.br/sqlmagazine/feedback
D

s
e
u
Feedbac
k
s
o
b
r
e
e
s
t
a
e
d i o
SQL54.indb 14 22.05.08 03:13:05
Ldiao 54 - SQL Magazine 15
PROJETO DE SOFTWARE E MODELAGEM
Figura 2. Modelo fsico sem padronizao.
Figura 3. Modelo fsico padronizado.
SQL54.indb 15 22.05.08 03:13:08
16 SQL Magazine - Desao de SQL
Desafio de SQL
Wagner Crivelini
wcrivelini@gmail.com
atua a 15 anos na rea de Business Intelligence.
Engenheiro formado pela UNICAMP, trabalha na
IBM na unidade de Global Business Services.Atu-
almente ocupa a posio de lder tcnico em pro-
jeto internacional na rea de telecomunicaes.
[ Desenvolvimento ]
Q
uem tem acompanhado os
desahos das llimas edies,
j est se acostumando com o
negcio e a forma de trabalhar da em-
presa ItsMyBusiness.
O problema que viemos acompanhando
nas duas ltimas edies sobre o contro-
le do saldo em estoque. Ns criamos:
1. um gatilho (ou trigger, para quem
prefere) para atualizao automtica do
saldo as cada venda,
2. depois adaptamos o modelo fsico
do banco de dados para permitir uma
maior performance no clculo do saldo
de esloque,
3. criamos um processo para atualiza- criamos um processo para atualiza-
o peridica das novas tabelas usadas
neste modelo fsico.
Na verdade, saldo de estoque dos pro-
dutos , ou deveria ser, uma preocupao
constante em praticamente todas as ati-
vidades industriais e comerciais.
No modelo fsico implementado no
banco de dados da ItsMyBusiness, temos
um mlodo ehcienle de clculo, mas
um processo delicado. Ele envolve o uso
de trs tabelas, como se v na Figura 1
(veja que o modelo de dados da empresa
fornece dados de saldo de estoque por
lote de produto, mas este um detalhe
que no afeta o nosso estudo).
Portanto, para consultar o saldo
de um dado lote de produto em um
determinado instante, ser sempre
Os D8As da empresa |tsMy8usiness realmente
no tm sossego. Mais dores de cabea vista.
Wagner Crivelini continua te desafiando com
base no crescimento do sistema da empresa
|tsMy8usiness. Desta vez, a empresa enviou
um requisito ao time de DBAs para que
desenvolvam um mecanismo que garanta a
confiabilidade de todo e qualquer clculo que
envolva o estoque da empresa.
E caso voc tenha um desafio que gostaria de
compartilhar conosco, envie sua sugesto para
webeditor@sqlmagazine.com.br
Divirtam-se.
Picardo Pezende
Editor tcnico
A
r
t
i
g
o

d
e

C
A
P
A
SQL54.indb 16 22.05.08 03:13:10
Ldiao 53 - SQL Magazine 17
DESAFI O SQL E LI NGUAGEM SQL
Figura 1. Esquema fsico das tabelas de saldo de estoque.
necessrio escrever uma declarao
SQL complexa. Voc ter a oportunida-
de de compreender o quo complexa
esta lgica, quando comear a solucio-
nar o desaho.
Na realidade, ns j apresentamos
procedimentos de clculo de estoque
dentro do gati l ho que criamos na
edio 52 e tambm dentro do proce-
dimento de atualizao das tabelas de
saldo de estoque criadas na edio 53.
Mas nenhum deles pode ser conside-
rado um procedimento genrico, til
em todos os cenrios em que necessi-
taremos calcular saldo em estoque de
um produto.
Mas no se preocupe se voc no acom-
panhou os desafios anteriores. Basta
baixar o script completo de criao deste
banco no portal da SQL Magazine.
Observe porque a ItsMyBusiness est
to preocupada com o clculo de saldo
de estoque:
a empresa precisa ter informaes
confiveis de saldo em estoque dos
rodulos,
consultas sobre saldo em estoque so
exlremamenle frequenles,
a lgica de clculo consideravel-
mente complexa e, portanto, sujeita a
erros de cdigo,
existem diferentes cenrios em que pre-
cisaremos calcular saldo em estoque.
Nosso desaho desle ms advm de uma
necessidade muito simples. A empresa
ItsMyBusiness precisa de um mtodo
simles e seguro que garanla a conhabi-
lidade do clculo de estoque em todas as
possveis situaes de negcio.
Sendo assim, vamos aos detalhes que
deveremos considerar para elaborar
nossa soluo.
Requisito #1: Os dados de saldo de
estoque de um lote em um dado instan-
te podem ser consultados e at mesmo
cruzados com dados de outras tabelas
do banco de dados da empresa.
Requisito #2: Sempre que calcularmos o
saldo de estoque de um lote em um dado
instante, precisamos informar qual o
inslanle considerado, idenlihcar o saldo
anterior do lote, vlido no momento em
que houve a ltima atualizao da tabe-
la tblSaldoEstoque. Em seguida, temos
que reconhecer todas as transaes que
ocorreram entre a ltima atualizao da
tabela de saldos e este instante que espe-
cihcamos. Iinalmenle, somamos o saldo
anterior e os movimentos de estoque para
chegarmos ao saldo instantneo.
Requisito #3: Se o instante que considerar-
mos ara dehnio do esloque do rodulo
for anterior data da ltima atualizao
da tabela de saldo de estoque (tblSaldoEs-
toque), ento deveremos subtrair do saldo
anterior todos os movimentos de estoque
ocorridos entre a data desejada e a ltima
atualizao do estoque.
Requisito #4: Alm de considerar as
trs tabelas, devemos ter em mente que
teremos ao menos quatro diferentes
cenrios dentro destas tabelas:
1. os lotes de produtos que so novos:
eles aparecem na tabela de movimento
de estoque, mas ainda no tem nenhuma
informao sobre o saldo de estoque an-
lerior (no eslo na labela de saldos),
2. os lotes que tm um saldo anterior
(esto na tabela de saldos), mas no
tiveram nenhuma movimentao de
estoque desde a ltima atualizao da
labela de saldos,
3. os lotes que tm um saldo anterior e
tiveram movimentao desde a ltima
atualizao da tabela de saldos (ou seja,
aparecem nas tabelas de saldo e movi-
menlo de esloque),
4. os lotes que foram cadastrados no
sistema, mas ainda no entraram no
estoque da empresa (portanto no apare-
cem em nenhuma das duas tabelas).
Requisito #5: Nossa soluo precisa ser
capaz de retornar dados de saldo de esto-
que de vrios lotes ao mesmo tempo.
Agora a sua vez. Boa sorte!
SQL54.indb 17 22.05.08 03:13:12
18 SQL Magazine - Desao de SQL
Vamos direto ao ponto. Primeiro:
em qual tipo de objeto vamos guardar
nosso cdigo?
O Requisito #1 j descarta implicitamen-
te o uso de um procedimento armazena-
do (ou stored procedure). O resultado retor-
nado por um procedimento armazenado
no pode ser cruzado diretamente com
outras tabelas e vises do banco de dados.
Seria necessrio fazer muita gambiarra
para conseguir algo minimamente pare-
cido com o que desejamos.
J os Requisitos #2 e #3 praticamente
descartam o uso de vises (ou views). Em
primeiro lugar, porque estabelecemos
que a soluo aceitar um parmetro
que estabelece para qual instante cal-
cularemos o saldo do lote (vises no
aceitam parmetros). Segundo porque
precisaremos de uma lgica elaborada
para os casos em que o instante consi-
derado for anterior ou posterior ltima
atualizao da tabela de saldos.
O Requisito #5 descarta o uso de funes
escalares dehnidas elo usurio, orque
diz que nossa soluo pode retornar os re-
sultados de vrios lotes ao mesmo tempo.
Assim, que tipo de objeto nos resta
considerar e que atenda a todos estes
requisitos?
Temos sim uma opo que atende tudo
isso. So as funes labulares dehnidas
pelo usurio, que chamaremos de UDF ta-
bular (Nota DevMan 1) daqui por diante.
As UDFs tabulares so parte do pa-
dro ANSI SQL. Elas respeitam todos
os nossos requisitos e ainda por cima
mantm a performance da soluo em
nveis muito bons.
Detalhes da lgica
Com relao a detalhes da lgica neces-
sria, vamos considerar alguns pontos.
Requisilo ~2 dehne que recisaremos
passar dois argumentos na nossa UDF
tabular. O primeiro o codLote e o se-
gundo o instante que vamos considerar
para clculo do saldo do estoque. Sobre o
uso de datas, por favor, veja Nota 1.
Para atender ao Requisito #3, preferimos
usar um teste lgico para tornarmos o
cdigo mais didtico. Para datas poste-
riores atualizao da tabela de saldos,
somaremos os movimentos de estoque.
Para datas anteriores, subtrairemos os
movimentos de estoque.
Atendendo ao Requisito #4, considera-
mos uma juno de tabelas que toma por
base a tabela de lotes e usa LEFT OUTER
JOINs nas tabelas de saldo e movimento
de estoque. (Nota 2). Em razo disso,
pode haver situaes em que teremos um
valor nulo para o saldo ou movimento de
estoque do lote. Por conta disso, usamos a
funo COALESCE para retornar ZERO
caso o valor do campo seja nulo.
Listagem 1. UDP tabular para calculo de saldo em estoque.
1 CREATE FUNCTION funCalculaEstoque
2 (@codLote INT, @DataDesejada DATETIME )
3 RETURNS @tmpResultado TABLE
4 (
5 codLote INT,
6 Qtd NUMERIC (11,2)
7 )
8 AS
9 BEGIN
10 --Esta funo calcula o saldo de estoque por lote
11 --para qualquer momento do histrico deste(s) lote(s)
12 DECLARE @DataAtualizacao DATETIME
13
14 SELECT @DataAtualizacao = MAX(A.DataAtualizacao)
15 FROM tblSaldoEstoqueAtualizacao A
16
17 --este teste controla os clculos
18 --para o caso em que a data desejada seja anterior
19 -- data da ltima atualizao da tabela de saldos
20 IF @DataDesejada >= @DataAtualizacao
21 BEGIN
22 INSERT INTO @tmpResultado
23 SELECT
24 L.codLote,
25 COALESCE(S.Qtd, 0) + COALESCE(M.Qtd, 0) AS Qtd
26 FROM tblLote L
27 LEFT JOIN tblSaldoEstoque S ON L.codLote = S.codLote
28 LEFT JOIN (
29 SELECT X.codLote, SUM(X.Qtd) AS Qtd
30 FROM tblMovimentoEstoque X
31 WHERE X.DataSaida > @DataAtualizacao
32 AND X.DataSaida <= @DataDesejada
33 GROUP BY X.codLote
34 ) M ON L.codLote = M.codLote
35 WHERE L.codLote = @codLote
36 END
37 ELSE
38 BEGIN
39 INSERT INTO @tmpResultado
40 SELECT
41 L.codLote,
42 COALESCE(S.Qtd, 0) - COALESCE(M.Qtd, 0) AS Qtd
43 FROM tblLote L
44 LEFT JOIN tblSaldoEstoque S ON L.codLote = S.codLote
45 LEFT JOIN (
46 SELECT X.codLote, SUM(X.Qtd) AS Qtd
47 FROM tblMovimentoEstoque X
48 WHERE X.DataSaida < @DataAtualizacao
49 AND X.DataSaida >= @DataDesejada
50 GROUP BY X.codLote
51 ) M ON L.codLote = M.codLote
52 WHERE L.codLote = @codLote
53 END
54 RETURN
55 END
56 GO
RESPOSTA DO DESAFIO
A Listagem 1 mostra esta declara-
o SQL para criao da nossa funo
usando o T-SQL, a linguagem adotada
pelo SQL SERVER. A lgica simples,
apesar de extensa. A UDF recebe como
parmetros o cdigo do lote e a data para
a qual desejamos calcular o saldo em es-
loque. Lm rimeiro lugar, idenlihcamos
a data da ltima atualizao da tabela de
estoques. Se esta data for anterior data
desejada, vamos somar as movimenta-
es de estoque ocorridas entre estas
duas datas ao saldo de estoque anterior.
Do contrrio, vamos subtrair do saldo
anterior todos os movimentos de estoque
ocorridos no perodo.
SQL54.indb 18 22.05.08 03:13:14
Ldiao 53 - SQL Magazine 19
DESAFI O SQL E LI NGUAGEM SQL
Nota do DevMan
1. User-Defined Functions - UDF
Em bancos de dados relacionais aderentes ao padro SQL, uma
funo definida pelo usurio (User-Defined Function UDF)
prov um mecanismo de extenso das funcionalidades do
servidor de banco de dados adicionando uma funo que pode
ser avaliada por uma consulta SQL.
O padro SQL divide as UDFs em funes escalares e funes
tabulares. Uma funo escalar retorna um nico valor (ou
NULO), enquanto uma funo tabular retorna uma tabela
(relacional) composta por zero ou mais linhas e cada linha
composta por uma ou mais colunas.
Uma UDF declarada usando a declarao CREATE FUNCTION.
Por exemplo, uma funo para converter graus Celsius (C) para
graus Fahrenheit (F) declarada da seguinte forma:
CREATE FUNCTION dbo.CtoF(Celsius FLOAT)
RETURNS FLOAT
RETURN (Celsius * 1.8) + 32
Uma vez criada, uma UDF pode ser usada como expresses de
comandos SQL. Por exemplo, ela pode ser chamada da mesma
forma que qualquer outra funo em uma declarao SQL.
Incluindo a declarao SELECT, onde a UDF pode ser usada para
retornar dados armazenados em tabelas no banco de dados.
Conceitualmente,uma UDF avaliada para cada linha retornada
pela consulta. Por exemplo, considerando uma tabela chamada
ELEMENTOS, com uma linha para cada elemento qumico
conhecido. Esta tabela possui uma coluna chamada EBULICAO,
para indicar o ponto de ebulio de cada elemento, em C.Veja
a consulta:
SELECT NOME, CtoF(EBULICAO) AS EbulicaoFahrenheit
FROM ELEMENTOS
A consulta acima retornar o nome e ponto de ebulio de
cada elemento. Ela chama a UDF CtoF para converter o valor
armazenado na coluna EBULICAO em C para um valor em F.
Cada UDF possui certas propriedades ou caractersticas. O
padro SQL define as seguintes propriedades:
- linguagem: define a linguagem de programao em que a
UDF implementada (SQL, C, Java, etc.);
- tipo de parmetro: define a conveno que ser usada para a
passagem de parmetros e resultados entre a implementao
da UDF e o sistema do banco de dados (aplicvel apenas para
linguagens que no sejam SQL);
- nome: nome da funo, que deve ser nico no banco de dados;
- determinismo: especifica se a UDF determinstica ou no.
A caracterstica do determinismo tem influncia na otimizao
da consulta no momento da compilao da mesma. A reescrita
de instrues SQL no devem alterar o nmero de vezes que a
funo chamadaem funes no determinsticas.
- acesso a dados SQL: informa ao SGBD se a funo no
contm instrues SQL (NO SQL), se contm instrues SQL,
mas no acessa nenhuma tabela ou view (CONTAINS SQL), l
dados de tabelas ou views (READ SQL DATA), ou altera dados no
banco de dados (MODIFIES SQL DATA);
UDFs no devem ser confundidas com procedimentos
armazenados (stored procedures - SP). SPs permitem ao
usurio agrupar um conjunto de comandos SQL. SPs podem
aceitar parmetros e executar os comandos SQL contidos
em seu cdigo dependendo dos parmetros fornecidos.
SPs no so expresses, portanto no podem ser utilizados
como UDFs.
Alguns SGBDs permitem a criao de UDFs em outras
linguagens, alm de SQL. O Microsoft SQL Server, por exemplo,
permite a utilizao da linguagem .NET enquanto DB2 e Oracle
suportam UDFs escritas em C ou Java.
Se voc vai testar seus conhecimentos usando ORACLE ou
FIREBIRD, cuidado. ORACLE e FIREBIRD no suportam o
tipo de dados DATETIME, que usamos aqui neste script.
Neste caso, voc dever substituir DATETIME por TIMESTAMP.
No ORACLE, especificamente, necessrio tambm
configurar o formato da data para que funcionem as
declaraes de INSERT que apresentamos aqui. Voc
dever executar o comando abaixo antes de comear a
insero de dados:
ALTER SESSION SET NLS_DATE_FORMAT = YYYY-MM-DD
No FIREBIRD, no h problema com formato de datas.
Nota 1. Trabalhando com datas no ORACLE ou FIREBIRD.
Este tipo de juno faz parte do padro ANSI SQL e se aplica
apenas a tabelas e vises.Existem trs formas de OUTER JOINs:
o primeiro o LEFT OUTER JOIN (ou apenas LEFT JOIN), usado
quando se deseja listar todos os dados da tabela da esquerda
independentemente de haver ou no correspondncia com
os dados da tabela direita da juno.
O segundo o RIGHT OUTER JOIN (ou RIGHT JOIN), que faz
o inverso: d prioridade para os dados da tabela direita
da juno.
O ltimo deles o FULL OUTER JOIN (ou simplesmente
FULL JOIN), que lista todos os registros de ambas as
tabelas, no importando se existe ou no correspondncia
entre os dados.
Nota 2. A juno OUTER JOIN.
SQL54.indb 19 22.05.08 03:13:18
20 SQL Magazine - Desao de SQL
Listagem 2. Gatilho usando a UDP tabular recem criada.
1 ALTER TRIGGER trgMovimentoEstoque ON tblNotaFiscalDetalhe
2 INSTEAD OF INSERT
3 AS
4 BEGIN
5 SET NOCOUNT ON
6 --se houver saldo suficiente no lote
7 IF (
8 SELECT I.Qtd - F.Qtd
9 FROM INSERTED I
10 CROSS APPLY funCalculaEstoque(I.codLote, GETDATE()) F
11 ) >= 0
12 BEGIN
13 INSERT INTO tblNotaFiscalDetalhe SELECT * FROM INSERTED
14
15 INSERT INTO tblMovimentoEstoque
16 SELECT I.codLote, GETDATE(), -I.Qtd
17 FROM INSERTED I
18
19 END
20 ELSE
21 BEGIN
22 -- identificando todos os lotes do produto
23 SELECT L1.codLote INTO #tmpLote
24 FROM tblLote L1
25 INNER JOIN (
26 SELECT codProduto
27 FROM tblLote L2 INNER JOIN INSERTED I
28 ON L2.codLote = I.codLote
29 ) X ON L1.codProduto = X.codProduto
30
31 -- verificando o saldo de todos os lotes do produto
32 IF (SELECT SUM(F.QTD) - (SELECT I.Qtd FROM INSERTED I)
33 FROM #tmpLote T
34 CROSS APPLY funCalculaEstoque(T.codLote, GETDATE()) F
35 ) >= 0
36 BEGIN
37 DECLARE @QTDVendida NUMERIC(9,2)
38 DECLARE @QTD NUMERIC(9,2)
39 DECLARE @LOTE INT
40
41 SELECT @QTDVendida = QTD, @LOTE = codLote
42 FROM INSERTED
43
44 --distribuindo a venda entre os vrios lotes
45 WHILE @QTDVendida > 0
46 BEGIN
47 --comeamos com o lote original
48 IF NOT EXISTS(
49 SELECT codLote FROM #tmpLote WHERE codLote = @LOTE
50 )
51 SELECT TOP 1 @LOTE = codLote FROM #tmpLote
52
53 DELETE FROM #tmpLote WHERE codLote = @LOTE
54
55 --consultamos o saldo disponvel do lote
56 SELECT @QTD = SUM(QTD)
57 FROM funCalculaEstoque(@LOTE, GETDATE()) F
58
59
60 IF @QTD > @QTDVendida
61 SET @QTD = @QTDVendida
62
63 INSERT INTO tblNotaFiscalDetalhe
64 SELECT I.codNotaFiscal, @LOTE, @QTD, I.ValorUnitario
65 FROM INSERTED I
66
67 INSERT INTO tblMovimentoEstoque
68 VALUES (@LOTE, GETDATE(), -@QTD)
69
70 --damos baixa na quantidade a ser atendida
71 SET @QTDVendida = @QTDVendida - @QTD
72 END
73 END
74 ELSE
75 RAISERROR(SALDO INSUFICIENTE. OPERAO ABORTADA, 18,1)
76 END
77
78 SET NOCOUNT OFF
79 END;
CRIVELINI, Wagner. UDFs e Funes Tabulares. SQL
Magazine, Edio 53, Maio/2008.
KOOPMAN, James. Returning Rows Through a Table
Function in Oracle. DATABASE JOURNAL. June, 19th 2003.
http://www.databasejournal.com/features/oracle/article.
php/2222781
Referncias
A ttulo de ilustrao, veja o gatilho que
apresentamos na edio 52 adaptado para
usar nossa nova funo tabular (Lista-
gem 2). Este gatilho executado antes da
aceitao de qualquer transao de venda.
Antes de inserir o registro da venda na
labela de ilens de nola hscal, checamos se
existe para o lote em questo um saldo em
esloque suhcienle ara alender a venda.
Caso no exisla, verihcaremos ainda se
poderemos usar outros lotes do mesmo
produto para atender a venda.
Desenvolvi tambm os cdigos das
Listagens 1 e 2 em PL/SQL, para serem
implementados em Oracle. Os scripts
esto no portal da SQL Magazine.
Assim lerminamos mais um desaho!
Espero que o exemplo lhe seja til.
D seu feedback sobre esta edio!
A SQL Magazine tem que ser feita ao seu
gosto. Para isso, precisamos saber o que
voc, leitor, acha da revista!
D seu voto sobre este artigo, atravs do link:
www.devmedia.com.br/sqlmagazine/feedback
D

s
e
u
Feedbac
k
s
o
b
r
e
e
s
t
a
e
d i o
SQL54.indb 20 22.05.08 03:13:23
SQL54.indb 21 22.05.08 03:13:32
22 SQL Magazine - |ntroduao a SQL
Introduo a SQL
(Structured Query Language) Parte I
Ary Jnior
ary@ajsolucoes.com.br
Mestre emCincias comnfase emInteligncia
Artificial eBancos deDados,Professor Universitrio
e Gerente de TI. Atua como professor desde 2000,
especialmente comdisciplinas na rea de Bancos
de Dados.Na rea deTI desde 1998comdesenvol-
vimento,anliseeprojetodeSistemas.Hojeemdia,
trabalha com Gerenciamento de Projetos e Siste-
mas de Bancos de Dados prestando servios para
diversas empresas nacionais emultinacionais.
[ Banco de dados ]
A
tualmente o volume de dados
armazenado nos sistemas de
bancos de dados das mais diver-
sas organizaes est crescendo de forma
bastante acelerada. E para que isto ocorra,
necessrio que os Sistemas Gerenciado-
res de Bancos de Dados (SGBD) forneam
opes para que o armazenamento de
dados e posteriormente a recuperao
de informaes ocorra da melhor forma
possvel. Para que isso seja possvel, a
linguagem de consulta estruturada (SQL
Structured Query Language) prov
estas tarefas, conforme discorreremos no
decorrer deste artigo, que ser divido em
vrias partes para que englobe as princi-
pais caractersticas da linguagem.
Desta forma, espera-se com este artigo
que o leitor consiga criar estruturas de
armazenamento e manipular dados para
a gerao de informaes. Nos prximos
artigos, abordaremos outras caracters-
ticas da SQL.
Iremos utilizar o SGBD PostgreSQL
para aplicarmos os conceitos citados
neste artigo. Optamos por este SGBD
primeiramente por ser um software
gratuito e bastante fcil de utilizar para
o propsito deste artigo.
Introduo
At a dcada de 70, quando um fa-
bricante de bancos de dados criava
um novo produto, ele tambm criava
uma linguagem para criar estruturas
e manipular os dados armazenados no
produto em questo. Da mesma forma, a
IBM desenvolveu a SQL, originalmente
chamada de Sequel, como parte inte-
grante do Sistema R, no incio dos anos
70. Esta linguagem sofreu evolues e
posteriormente teve seu nome alterado
para SQL. Ento, em 1986 o American Na-
tional Standard Institute (ANSI), publicou
a SQL como linguagem padro para os
bancos de dados relacionais, chamando-
o de SQL-86. Assim, a partir de 1986, os
sistemas gerenciadores de bancos de
dados relacionais passaram a adotar a
SQL como linguagem padro.
A
r
t
i
g
o

d
e

C
A
P
A
SQL54.indb 22 22.05.08 03:13:35
Ldiao 54 - SQL Magazine 23
LI NGUAGEM SQL
A SQL subdividida em trs sub-
linguagens, que so:
DDL (DaIa DefnlIlon Language):
que apresenta uma srie de comandos
que ermilem a dehnio dos dados.
Dentre os principais comandos, pode-
mos destacar o CREATE, que destinado
criao do Banco de Dados e das Tabe-
las que o compe, alm das relaes exis-
tentes entre as tabelas. Outros exemplos
de comandos DDL que podemos citar
neste momento so: ALTER e DROP, que
iremos delalhar nos rximos licos,
DML (DaIa ManluIaIlon Langua-
ge): que apresenta uma srie de coman-
dos destinados manipulao de dados,
tais como: consultas, inseres, excluses
e alteraes, para um ou mais registros
de uma ou mais tabelas de maneira
simultnea. Dentre alguns exemplos de
comandos DML, destacam-se: SELECT,
INSERT, UPDATE e DELETE, que iremos
delalhar nos rximos arligos,
DCL (DaIa ConIroI Language): que
apresenta uma srie de comandos para con-
trolar o acesso aos dados, usurios e gru-
pos. Dentre alguns exemplos de comandos
DCL, destaca-se o comando GRANT, que
iremos detalhar nos prximos artigos.
Aps a primeira verso do padro
SQL-86, tivemos algumas variaes que
originaram a SQL-92 e atualmente v-
rias caractersticas foram incorporadas
linguagem, tendo j sido publicado
o SQL-3. Foram adicionados recursos
relacionados orientao a objetos, den-
tre vrias outras caractersticas. Porm,
estas novas funcionalidades fogem do
escopo deste artigo, mas sero aborda-
das nos prximos.
Entretanto, alm do padro SQL, cada
fabricante de SGBD pode acrescentar
funcionalidades exclusivas ao SGBD. Isto
ocorre freqentemente, principalmente
com alguns dos principais fabricantes,
como Microsoft (SQL Server), Oracle
(atualmente com o Oracle11g) e IBM
(DB2). Neste artigo iremos abordar o
SQL padro.
Linguagem de Definio
de Dados (DDL)
Conforme abordamos anteriormente, o
primeiro tpico que iremos discorrer a
linguagem de dehnio de dados (DDL),
que faz parte da linguagem SQL. O
primeiro comando que precisamos deta-
lhar desta linguagem o comando para
criao de banco de dados, que pode
ser definido conforme a Listagem 1,
onde nome_db o nome do banco de
dados a ser criado.
Outro comando que iremos tratar o
comando CREATE TABLE, responsvel
por criar tabelas dentro de um determi-
nado banco de dados. A sintaxe padro
deste comando pode ser visualizada na
Listagem 2. Onde:
Figura 1. Modelo de Dados Pinal para Pagamentos e Pecebimentos
SQL54.indb 23 22.05.08 03:13:38
24 SQL Magazine - |ntroduao a SQL
Listagem 1. Criao de Bancos de Dados
CREATE DATABASE <nome_db>;
Listagem 2. Criaao de Tabelas em 8ancos de Dados
CREATE TABLE <Nome_tabela> (
<Nome_atributo1> <Tipo_Dados1> [NOT NULL],
<Nome_atributo2> <Tipo_Dados2> [NOT NULL],
....
<Nome_atributoN> <Tipo_DadosM> [NOT NULL],
PRIMARY KEY (Atributo_chave),
FOREIGN KEY (Atributo_chave_estrangeira) REFERENCES < Tabela_referenciada>);
Listagem 3. Criao do Banco de Dados SQLMagazine
CREATE DATABASE SQLMagazine;
Figura 2. PostgreSQL com o Banco de Dados SQLMagazine
Nome_tabela: indica o nome da ta-
bela a ser criada,
Nome_atributo1...Nome_atributoN:
so os alribulos da labela a ser criada,
Tipo_Dados1....Tipo_DadosN: so os
tipos de dados de cada um dos atributos
da labela a ser criada,
Atributo_chave: o nome do atributo
chave rimria da labela a ser criada,
Atributo_chave_estrangeira: o
atributo da tabela a ser criada, que
chave estrangeira, fazendo referncia a
oulra labela,
Tabela_referenciada: a tabela cuja
chave eslrangeira faz referncia,
NOT NULL: o comando que iden-
lihca se o alribulo ode receber valores
nulos ou no.
As a dehnio da sinlaxe, uliliza-
remos os comandos SQL para criao
do banco de dados e das tabelas de um
determinado modelo de dados. Como
modelo de exemplo, utilizaremos um
sistema de contas a pagar e receber (veja
a Figura 1).
Criando o Banco de Dados
Na Listagem 3 apresentamos o coman-
do SQL para criar o banco de dados com
o nome de SQLMagazine. Aps executar
este comando apresentada a Figura 2,
onde possvel observar o PostgreSQL
com o banco de dados criado.
Criando as tabelas
Iodemos verihcar no modelo de dados
da Figura 1 a existncia das seguintes
tabelas:
Endereo: responsvel por manter o
cadaslro de endereos,
Bairro: responsvel por manter o
cadaslro de bairros,
Cidade: responsvel por manter o
cadaslro de cidades,
CPagar: responsvel por manter o
cadaslro de conlas a agar,
CReceber: responsvel por manter o
cadaslro de conlas a receber,
Fisica: responsvel por manter o ca-
dastro de pessoas fsicas, especializando
da labela Iessoa,
Juridica: responsvel por manter o
cadastro de pessoas jurdicas, especia-
lizando da labela Iessoa,
Logradouro: responsvel por manter
o cadaslro de logradouros,
Pagamento: responsvel por manter
o cadastro de pagamentos de uma deter-
minada conla a agar,
Pessoa: responsvel por manter o
cadaslro generalizado de essoas,
Recebimento: responsvel por man-
ter o cadastro de recebimentos de uma
delerminada conla a receber,
TipoLogradouro: responsvel
por manter o cadastro de tipos de
logradouros,
Telefone: responsvel por manter o
cadaslro de lelefones,
UF: responsvel por manter o cadas-
tro de Unidades da Federao.
Agora iremos criar todas estas tabelas
no PostgreSQL. Para iniciarmos a criao
das tabelas, podemos selecionar a opo
marcada na Figura 3. Esta opo exe-
cuta o software pgAdminIII Query do
IoslgreSQL, que um ambienle grhco
responsvel por possibilitar aos usurios
a criao e execuo de consultas SQL
nos bancos de dados.
Antes de comearmos a criar as tabelas,
devemos verihcar que a ordem de cria-
o das tabelas deve partir das tabelas
SQL54.indb 24 22.05.08 03:13:39
Ldiao 54 - SQL Magazine 25
LI NGUAGEM SQL
que no possuem chaves estrangeiras.
No decorrer deste artigo explicaremos
melhor este detalhe, que pode gerar erro
ao criar as tabelas.
Desta forma, iremos criar inicialmente
a tabela Pessoa. Observe na Figura 1 que
a tabela Pessoa possui os atributos idPes-
soa, Nome, TipoPessoa e que idPessoa
a chave primria. Assim, o cdigo SQL
para criao desta tabela est descrito na
Listagem 4. Perceba que a tabela Pessoa
no possui chave estrangeira e por isto
o comando FOREIGN KEY apresentado
anteriormente no utilizado. Utili-
zamos o comando NOT NULL para a
chave primria, pois sabemos que as
chaves primrias no podem ser nulas e
tambm no podem se repetir. Podemos
utilizar o NOT NULL para qualquer
atributo, desde que o mesmo no possa
receber valores nulos, por exemplo, o
campo Nome.
Para criar esta tabela, iremos digitar o
cdigo da Listagem 4 no software pgA-
dminIII Query e executar este comando,
como pode ser visto na Figura 4.
Aps a execuo, o resultado apre-
sentado na Figura 5. Veja que aps
criar a tabela, exibida uma mensagem
informando que os comandos foram
executados com sucesso. Caso acontea
algum erro, tambm ser exibida uma
mensagem de erro. Nestes casos, trata-
remos algumas mensagens no decorrer
do artigo.
Na Figura 6 apresentamos o resultado
da criao da tabela Pessoa no pgAdmin
III, mostrando a tabela criada.
Da mesma forma que hzemos com o
cdigo SQL da Listagem 4, criaremos
agora a tabela Fisica, de acordo com a
Listagem 5. Repare na Figura 1 que a
tabela Fisica possui os atributos Pes-
soa_idIessoa, CII e RG. Verihcamos
tambm que Pessoa_idPessoa a chave
primria e tambm chave estrangeira
referenciando o atributo idPessoa da
tabela Pessoa. Assim, o cdigo SQL
para criao desta tabela est descrito
na Listagem 5.
Assim como na criao da tabela Pes-
soa, iremos executar este comando para
criao da tabela Fisica.
Dehniremos agora a labela Juridica,
conforme Listagem 6. Veja na Figura 1
Listagem 4. Criao da tabela Pessoa
CREATE TABLE PESSOA (
idPessoa Integer NOT NULL,
Nome varchar(40),
TipoPessoa char(1),
PRIMARY KEY(idPessoa));
Figura 3. pgAdmin||| Query
Figura 4. Criaao da Tabela Pessoa
SQL54.indb 25 22.05.08 03:13:40
26 SQL Magazine - |ntroduao a SQL
que a tabela esta possui os atributos Pes-
soa_idPessoa, CNPJ e InscricaoEstadual.
Verihcamos lambm que Iessoa_idIes-
soa a chave primria e tambm chave
estrangeira referenciando a tabela Pessoa.
Assim, o cdigo SQL para criao desta
tabela est descrito na Listagem 6.
Vamos criar agora a tabela Cidade.
Veja na Figura 1 que a tabela Cidade
possui os seguintes atributos: CodCid,
UF_CodUF e Descricao. Na Listagem 7,
apresentamos o cdigo SQL para criao
da referida tabela.
Repare que nesta tabela, existe o atri-
buto UF_CodUF que chave estrangeira
referenciando o atributo codUF da tabela
UF. Assim, se tentarmos criar a tabela
Cidade antes de criarmos a tabela UF
teremos um erro, pois o SGBD no ir
encontrar a tabela UF para fazer a refe-
rncia da chave estrangeira. Podemos ve-
rihcar esle erro na Figura 7. Entretanto,
se criarmos a tabela UF (Listagem 8) pri-
meiro, e depois criarmos a tabela Cidade
(Listagem 7) no teremos problemas.
Assim, vamos criar a tabela UF para
depois criarmos a tabela Cidade.
Agora, dehniremos as oulras labelas
da Figura 1.
Na Listagem 9, criamos a tabela
TipoLogradouro, com os atributos co-
dTL e Descricao, sendo codTL a chave
primria.
Na Listagem 10, criamos a tabela
Logradouro, com os atributos codLog
e Descricao, sendo codLog a chave
primria.
Da mesma forma, na Listagem 11,
criamos a tabela Bairro, com os atributos
codB e Descricao, sendo codB a chave
primria.
Figura 5. Pesultado da criaao da tabela Pessoa
Figura 6. Tabela Pessoa no Postgresql
SQL54.indb 26 22.05.08 03:13:49
Ldiao 54 - SQL Magazine 27
LI NGUAGEM SQL
Listagem 5. Criaao da tabela Pisica
CREATE TABLE FISICA (
Pessoa_idPessoa Integer NOT NULL,
CPF varchar(14),
RG varchar(20),
PRIMARY KEY (Pessoa_idPessoa),
FOREIGN KEY (Pessoa_idPessoa) REFERENCES PESSOA (idPessoa));
Listagem 6. Criaao da tabela 1uridica
CREATE TABLE JURIDICA (
Pessoa_idPessoa Integer NOT NULL,
CNPJ varchar(18),
InscricaoEstadual varchar(20),
PRIMARY KEY (Pessoa_idPessoa),
FOREIGN KEY (Pessoa_idPessoa) REFERENCES PESSOA (idPessoa));
Listagem 7. Criao da tabela Cidade
CREATE TABLE CIDADE (
CodCid Integer NOT NULL,
UF_CodUF Integer,
Descricao varchar(40),
PRIMARY KEY (CodCid),
FOREIGN KEY (UF_CodUF) REFERENCES UF(codUF));
Listagem 8. Criaao da tabela UP
CREATE TABLE UF (
codUF Integer NOT NULL,
Descricao varchar(2),
PRIMARY KEY (codUF));
Listagem 9. Criaao da tabela TipoLogradouro
CREATE TABLE TIPOLOGRADOURO (
codTL Integer NOT NULL,
Descricao varchar(30),
PRIMARY KEY (codTL));
Listagem 10. Criao da tabela Logradouro
CREATE TABLE LOGRADOURO (
codLog Integer NOT NULL,
Descricao varchar(40),
PRIMARY KEY (codLog));
Listagem 11. Criao da tabela Bairro
CREATE TABLE BAIRRO (
codB Integer NOT NULL,
Descricao varchar(40),
PRIMARY KEY (codB));
Na Listagem 12, criamos a tabela
Endereco, com os atributos CodEn,
Pessoa_idPessoa, Cidade_CodCid, Bair-
ro_codB, Logradouro_CodLog, TipoLo-
gradouro_codTL, nro, complemento e
TipoEndereco, onde a chave primria
CodEn e Pessoa_idPessoa chave es-
trangeira referenciando a tabela Pessoa,
Cidade_CodCid chave estrangeira refe-
renciando a tabela Cidade, Bairro_codB
chave estrangeira referenciando a
tabela Bairro, Logradouro_CodLog
chave estrangeira referenciando a tabela
Logradouro e TipoLogradouro_codTL
chave estrangeira referenciando a tabela
TipoLogradouro. Desta forma, o ende-
reo possuir um cdigo, uma chave
estrangeira para apontar de quem o
endereo cadastrado, uma chave estran-
geira para dizer de qual cidade aquele
endereo, uma chave estrangeira para
dizer de qual bairro aquele endereo
e o logradouro propriamente dito, com
seu nmero e complemento. O endereo
tambm possuir uma chave estrangeira
que ir informar o tipo de logradouro
que este endereo possui, por exemplo,
rua, avenida, praa, dentre outros, e o
tipo de endereo, que ir armazenar se
o referido endereo residencial, comer-
cial ou cobrana, por exemplo.
Na Listagem 13, criamos a tabela
Telefone, com os atributos CodTel,
Pessoa_idPessoa, Descricao, numero,
Tipotel, onde a chave primria CodTel
e Pessoa_idPessoa chave estrangeira
referenciando a tabela Pessoa, que ser
responsvel por informar de qual pessoa
o referido telefone. O atributo Tipotel
responsvel por informar se o referido
telefone residencial, comercial ou celu-
lar, por exemplo.
Na Listagem 14 criamos a tabela CPa-
gar, que ir armazenar as contas a pagar.
Esta tabela possui os atributos idCpagar,
Pessoa_idPessoa, DataPrevista, Valor-
Conta, Juros, multa, desconto, ValorTo-
tal, onde a chave primria idCpagar
e Pessoa_idPessoa chave estrangeira
referenciando a tabela Pessoa, que ser
responsvel por informar de qual pessoa
a referida conta a pagar.
Na Listagem 15, criamos a tabela Paga-
mento, que ir armazenar os pagamen-
tos das contas a pagar, ou seja, uma conta
Figura 7. Lrro na criaao da Tabela Cidade
SQL54.indb 27 22.05.08 03:13:51
28 SQL Magazine - |ntroduao a SQL
Listagem 12. Criao da tabela Endereco
CREATE TABLE ENDERECO (
CodEn Integer NOT NULL,
Pessoa_idPessoa Integer,
Cidade_CodCid Integer,
Bairro_codB Integer,
Logradouro_CodLog Integer,
TipoLogradouro_codTL Integer,
nro Integer,
complemento varchar(20),
TipoEndereco varchar(10),
PRIMARY KEY (CodEn),
FOREIGN KEY (Pessoa_idPessoa) REFERENCES PESSOA (idPessoa),
FOREIGN KEY (Cidade_CodCid) REFERENCES CIDADE (CodCid),
FOREIGN KEY (Bairro_CodB) REFERENCES BAIRRO (codB),
FOREIGN KEY (Logradouro_CodLog) REFERENCES LOGRADOURO (CodLog)
FOREIGN KEY (TipoLogradouro_codTL) REFERENCES TIPOLOGRADOURO (codTL));
Listagem 13. Criaao da tabela Telefone
CREATE TABLE TELEFONE (
CodTel Integer NOT NULL,
Pessoa_idPessoa Integer,
Descricao varchar(40),
numero varchar(14),
tipotel varchar(3),
PRIMARY KEY(CodTel),
FOREIGN KEY (Pessoa_idPessoa) REFERENCES PESSOA (idPessoa));
Listagem 14. Criao da tabela CPagar
CREATE TABLE CPAGAR (
idCpagar Integer NOT NULL,
Pessoa_idPessoa Integer,
DataPrevista DATE,
ValorConta FLOAT,
juros FLOAT,
multa FLOAT,
desconto FLOAT,
ValorTotal FLOAT,
PRIMARY KEY(idCpagar),
FOREIGN KEY(Pessoa_idPessoa) REFERENCES PESSOA(idPessoa));
Listagem 15. Criao da tabela Pagamento
CREATE TABLE PAGAMENTO (
idPagamento INteger NOT NULL,
Cpagar_idCpagar Integer,
DataPagamento DATE,
ValorRecebido FLOAT,
juros FLOAT,
multa FLOAT,
desconto FLOAT,
PRIMARY KEY(idPagamento),
FOREIGN KEY (Cpagar_idCpagar) REFERENCES CPAGAR (idCpagar));
Listagem 16. Criaao da tabela CPeceber
CREATE TABLE CRECEBER (
idCReceber Integer NOT NULL,
Pessoa_idPessoa Integer,
DataPrevista DATE,
ValorConta FLOAT,
juros FLOAT,
multa FLOAT,
desconto FLOAT,
ValorTotal FLOAT,
PRIMARY KEY(idCReceber),
FOREIGN KEY(Pessoa_idPessoa) REFERENCES PESSOA(idPessoa));
Listagem 17. Criaao da tabela Pecebimento
CREATE TABLE RECEBIMENTO (
idRecebimento INteger NOT NULL,
CReceber_idCReceber Integer,
DataRecebimento DATE,
ValorRecebido FLOAT,
juros FLOAT,
multa FLOAT,
desconto FLOAT,
PRIMARY KEY(idRecebimento),
FOREIGN KEY (CReceber_idCReceber) REFERENCES CRECEBER (idCReceber));
SQL54.indb 28 22.05.08 03:13:58
Ldiao 54 - SQL Magazine 29
LI NGUAGEM SQL
a pagar ir gerar um pagamento. Esta
tabela possui os atributos idpagamen-
to, Cpagar_idCpagar, DataPagamento,
ValorRecebido, Juros, multa, desconto,
onde a chave primria idPagamento
e Cpagar_idCpagar chave estrangeira
referenciando a tabela CPagar.
Na Listagem 16, criamos a tabela
CReceber, que ir armazenar as contas
a receber. Esta tabela possui os atributos
idCreceber, Pessoa_idPessoa, DataPre-
vista, ValorConta, Juros, multa, descon-
to, ValorTotal, onde a chave primria
idCReceber e Pessoa_idPessoa chave
estrangeira referenciando a tabela Pessoa,
que ser responsvel por informar de
qual pessoa a referida conta a receber.
Na Listagem 17, criamos a tabela Recebi-
mento, que ir armazenar os recebimentos
de uma conta a receber, armazenado na
tabela CReceber, ou seja, uma conta a
receber ir gerar um recebimento. Esta
tabela possui os atributos idRecebimento,
CReceber_idCReceber, DataRecebimento,
ValorRecebido, Juros, multa, desconto,
onde a chave primria idRecebimento e
CReceber_idCReceber chave estrangeira
referenciando a tabela CReceber.
Na Figura 8, apresentamos todas as
tabelas criadas no PostgreSQL, aps ter
executado os cdigos presentes nas lis-
tagens apresentadas neste artigo.
Concluso
No decorrer deste artigo apresentamos
uma introduo linguagem SQL e
posteriormente iniciamos a abordagem
sobre DDL, mais esecihcamenle com os
comandos CREATE DATABASE e CRE-
ATE TABLE. No prximo artigo apresen-
taremos os outros comandos DDL, por
exemplo, comandos para alterar tabelas,
excluir tabelas, dentre outros.
Posteriormente, nas prximas edies
abordaremos a linguagem de manipu-
lao de dados (DML-Data Manipulation
Language) e traremos exemplos prticos
para auxiliar no aprendizado do leitor,
assim como hzemos nesle arligo.
Desta forma, com um bom modelo de
dados e posteriormente com a aplicao
dos comandos deste artigo, possvel
criar toda a estrutura necessria para
que o projeto de banco de dados obtenha
os objetivos necessrios.
DATE, C.J.
Introduo a Sistemas de Bancos de Dados,
Editora Campus, 2004.
HARRINGTON, J. L.
Projetos de Bancos de Dados Relacionais,
Editora Campus, 2002.
MONTEIRO, Emiliano S.
Projeto de Sistemas e Bancos de Dados,
Brasport, 2004.
MULLER, Robert J.
Projeto de Banco de Dados,
Editora Berkeley, 2002.
ROCHA JNIOR, Ary dos Santos,
Normalizao de Dados,
SQL Magazine # 47, outubro 2007.
ROCHA JNIOR, Ary dos Santos,
Normalizao de Dados,
SQL Magazine # 50, fevereiro 2008.
ROCHA JNIOR, Ary dos Santos,
Normalizao de Dados,
SQL Magazine # 52, abril 2008.
SILBERSCHATZ, A. KORTH, H. F., SUDARSHAN, S.
Sistemas de Bancos de Dados,
Makron Books 1999.
Refermcias
Nota do DevMan
SGBD (Sistemas Gerenciadores de Bancos de Dados):
Um SGBD um conjunto de softwares responsveis pelo
gerenciamento de uma base de dados. O principal objetivo
de um SGBD gerenciar o acesso e a correta manuteno
dos dados armazenados em um banco de dados.
Orientao a Objetos: A orientao a objetos um
paradigma de anlise, projeto e desenvolvimento de
software baseado na manipulao de objetos. Um objeto
consegue armazenar seus estados atravs de atributos e
reagir a mensagens enviadas a ele assim como relacionar e
enviar mensagens a outros objetos.
Figura 8. Tabelas do modelo de dados da Figura 1 criadas no PostgreSQL
D seu feedback sobre esta edio!
A SQL Magazine tem que ser feita ao seu
gosto. Para isso, precisamos saber o que
voc, leitor, acha da revista!
D seu voto sobre este artigo, atravs do link:
www.devmedia.com.br/sqlmagazine/feedback
D

s
e
u
Feedbac
k
s
o
b
r
e
e
s
t
a
e
d i o
SQL54.indb 29 22.05.08 03:14:05
30 SQL Magazine - Lscrevendo Outer 1oins em T-SQL
Escrevendo Outer Joins em T-SQL
Kathi Kellenberger
DBA da Bryan Cave LLP, uma firma internacional
emSt. Louis. Ela co-autora do livroProfessional
SQLServer 2005IntegrationServices,autoradev-
rios artigos sobre SQL Server, e contribui freqente
para a revista SQL Server Standard. Kathi regular-
menteapresentaparagruposdeusuriosdoVisual
Basic eSQLServer tpicos sobreSQLServer.
[ Banco de dados ]
O
casionalmente algum ir pedir
ajuda com uma consulta e dizer
que as opes right outer join
e left outer join foram tentadas, mas os
resultados esperados no foram obtidos.
Isso nos faz perceber que desenvolvedo-
res no entendem completamente outer
joins. Nesse artigo iremos abordar como
utilizar este tipo de consulta.
Revisao sobre Inner Join
A clusula de juno mais usada co-
mumente por DBAs o INNER JOIN.
Este tipo de juno combina linhas a
partir de duas tabelas somente quando
ambas atendem condio de juno.
Normalmente a chave primria de uma
tabela corresponde a uma chave estran-
geira em outra tabela, mas condies de
juno podem ser mais complexas que
isso (ver Nota 1).
INNER JOIN ir recuperar uma linha
de resultado somente quando existe uma
perfeita combinao entre as duas tabe-
las na condio de juno. Voc poder
normalmente visualizar tambm uma
linha de uma das tabelas combinando
com mltiplas linhas na outra tabela. Por
exemplo, um cliente pode ter mais que
uma compra. Uma compra pode ter muitos
itens. Os dados em um lado sero repeti-
dos para cada linha no lado muitos. A
Listagem 1 apresenta uma consulta de
exemplo mostrando como a informao da
tabela Sales.SalesOrderHeader est repetida
em cada linha obtida pela consulta.
Introduo ao Outer Join
OUTER JOIN usado para juntar duas
tabelas apesar de no existir uma combi-
nao exata entre elas. Um OUTER JOIN
pode ser usado para retornar uma lista
de todos os clientes e as compras mesmo
se no existem compras realizadas por
alguns clientes. A palavra-chave RIGHT
ou LLIT usada ara esecihcar qual o
lado da juno que ir retornar todas as
possveis linhas. preferido usar o LEFT,
pois parece fazer mais sentido listar a
tabela mais importante primeiro que a
A
r
t
i
g
o

d
e

C
A
P
A
SQL54.indb 30 22.05.08 03:14:09
Ldiao 54 - SQL Magazine 31
DI A A DI A E LI NGUAGEM SQL
A maioria das informaes neste artigo pode ser aplicada
para views, assim como tabelas. Para simplificar o texto, a
palavra tabela ser usada significando tabelas e views,
a menos que seja explicitado o contrrio. Chaves no so
definidas em views,porm as colunas chaves de uma tabela
normalmente so includas em uma view. Para manter as
coisas simples, vamos assumir que o nosso caso.
Nota 1.Tabelas e Views
Listagem 1. Exemplo de consulta com linhas repetidas
SELECT s.SalesOrderID, OrderDate,ProductID
FROM Sales.SalesOrderHeader AS s
INNER JOIN Sales.SalesOrderDetail AS d ON s.SalesOrderID = d.SalesOrderID
ORDER BY s.SalesOrderID, ProductID
Listagem 2. Lxemplo de consulta com LLPT 1O|N
SELECT c.CustomerID, s.SalesOrderID
FROM Sales.Customer c
LEFT OUTER JOIN Sales.SalesOrderHeader s ON c.CustomerID = s.CustomerID
Listagem 3. Lxemplo de consulta com P|GHT 1O|N
SELECT c.CustomerID, s.SalesOrderID
FROM Sales.SalesOrderHeader s
RIGHT OUTER JOIN Sales.Customer c ON c.CustomerID = s.CustomerID
Listagem 4. Lxemplo de consulta com LLPT 1O|N exibindo primeiramente as linhas nao combinadas entre as tabelas
SELECT c.CustomerID, s.SalesOrderID
FROM Sales.Customer c
LEFT OUTER JOIN Sales.SalesOrderHeader s ON c.CustomerID = s.CustomerID
ORDER BY s.SalesOrderID
Listagem 5. Lxemplo de consulta com LLPT 1O|N exibindo os clientes que nao fizeram compras
SELECT c.CustomerID, s.SalesOrderID
FROM Sales.Customer c
LEFT OUTER JOIN Sales.SalesOrderHeader s ON c.CustomerID = s.CustomerID
WHERE s.SalesOrderID IS NULL
Listagem 6. Usando CTL
WITH s AS
( SELECT SalesOrderID, customerID
FROM Sales.SalesOrderHeader
WHERE OrderDate between 1/1/2002 and 12/31/2002
)
SELECT c.CustomerID, s.SalesOrderID
FROM Sales.Customer c
LEFT OUTER JOIN s ON c.customerID = s.customerID
WHERE s.SalesOrderID IS NULL
outra. Apesar de demonstrar um exem-
plo de RIGHT OUTER JOIN, este artigo
ir usar constantemente LEFT JOINs.
Apenas uma nota: as palavras-chaves
INNER e OUTER so opcionais.
O prximo exemplo apresentado na
Listagem 2 retorna uma lista de todos
os clientes e o cdigo de compra (Sale-
sOrderID) para as compras que foram
realizadas, se existirem.
Esta consulta utiliza a palavra-chave
LEFT porque a tabela Sales.Customer est
localizada no lado esquerdo e ns dese-
jamos que todas as linhas (clientes) sejam
retornadas a partir desta tabela existindo
ou no compra associada ao cliente (tabe-
laSales.SalesOrderHeader). Este um ponto
importante. Note tambm que a coluna
CustomerID a chave primria da tabela
Sales.Customer e chave estrangeira na ta-
bela Sales.SalesOrderHeader. Isso signihca
que deve existir um cliente vlido para
toda compra realizada. Escrever uma
consulta que retorne todas as ordens e os
clientes se eles combinam no faz sentido.
A tabela da esquerda deve sempre ser a
tabela de chave primria quando estamos
realizando um LEFT OUTER JOIN.
Se a localizao das tabelas na consulta
so trocadas, a palavra-chave RIGHT usa-
da e o mesmo resultado obtido, conforme
pode ser observado na Listagem 3.
Note que no mudamos a condio de
juno totalmente. No importa em qual
lado do sinal de igualdade as colunas so
lisladas, somenle o local onde as labelas so
nomeadas importante em uma consulta.
Se temos um LEFT OUTER JOIN, o que
retornado a partir da tabela do lado
direito da juno caso as colunas no
combinem? Cada coluna proveniente
do lado direito ir retornar NULL. Tente
executar a query apresentada na Lista-
gem 4 que lista primeiramente as linhas
que no combinaram.
Atravs da adio de uma clusula
WHERE para checar por uma ID de
compra (SalesOrderID) com um valor
NULL, voc pode encontrar todos os
clientes que no realizaram qualquer
compra. A Listagem 5 exibe uma con-
sulta que retorna apenas os clientes que
no realizaram qualquer compra.
Ocasionalmente, voc precisar ser mais
esechco. Como voc ode enconlrar lo-
dos os clienles que no hzeram comras
em 2002? Existem vrias formas para
resolver este problema. Voc pode criar
uma view de todas as compras realizadas
em 2002 e fazer uma juno da view com a
tabela Sales.Customer. Outra opo criar
uma CTE Common Table Expression (ler
Nota 2) das compras realizadas em 2002.
O exemplo apresentado na Listagem 6
mostra como usar uma CTE para atingir
os resultados esperados.
Nossa tcnica favorita para resolver
este problema, e a que iremos destacar
aqui, muito mais simples. Critrios
adicionais, nesle caso hllrar ela dala
da compra (OrderDate) podem ser
adicionados condio de juno. A
consulta faz uma juno de todos os
clientes para as ordens realizadas em
2002 (ver Listagem 7). Ento os resulta-
dos so restritos queles que no existe
uma combinao, ou seja, no realiza-
ram compras. Esta consulta ir retor-
nar exatamente os mesmos resultados
como as consultas mais complicadas
apresentadas anteriormente.
CTE um result set derivado de uma simples query definido
no escopo de uma clusula select, insert, update ou delete.
Nota 2. CTE
SQL54.indb 31 22.05.08 03:14:10
32 SQL Magazine - Lscrevendo Outer 1oins em T-SQL
Usando agregao com Outer Joins
Consultas agregadas apresentam ou-
lras armadilhas que recisamos hcar
atentos. O exemplo da Listagem 8 uma
tentativa de listar todos os clientes e a
contagem de compras que foram feitas
por cada um. Voc consegue observar
qual seria o problema?
Agora os clienles que no hzeram com-
pras parecem como se eles tivessem reali-
zado uma compra. Isso ocorre porque essa
consulta est contando a linha retornada.
Para resolver este problema, conte a coluna
SalesOrderID (Listagem 9). Valores NULL
so eliminados nesta contagem.
Mltiplos Joins
Uma vez que mais que duas tabelas so
envolvidas em uma consulta, as coisas
Listagem 7. Exemplo de consulta alterando a condio de juno
SELECT c.CustomerID, s.SalesOrderID
FROM Sales.Customer c
LEFT OUTER JOIN Sales.SalesOrderHeader s ON c.CustomerID = s.CustomerID and s.OrderDate
between 1/1/2002 and 12/31/2002
WHERE s.SalesOrderID IS NULL
Listagem 8. Exemplo de consulta com agregao
SELECT c.CustomerID, count(*) OrderCount
FROM Sales.Customer c
LEFT OUTER JOIN Sales.SalesOrderHeader s ON c.CustomerID = s.CustomerID
GROUP BY c.CustomerID
ORDER BY OrderCount
Listagem 9. Exemplo de consulta com agregao
SELECT c.CustomerID, count(SalesOrderID) OrderCount
FROM Sales.Customer c LEFT OUTER JOIN Sales.SalesOrderHeader s
ON c.CustomerID = s.CustomerID
GROUP BY c.CustomerID
ORDER BY OrderCount
Listagem 10. Exemplo de erro ao tentar fazer juno entre trs tabelas
SELECT c.CustomerID, s.SalesOrderID, d.SalesOrderDetailID
FROM Sales.Customer c
LEFT OUTER JOIN Sales.SalesOrderHeader s ON c.CustomerID = s.CustomerID
INNER JOIN Sales.SalesOrderDetail d ON s.SalesOrderID = d.SalesOrderID
WHERE s.SalesOrderID IS NULL
Listagem 11. Exemplo de juno entre trs tabelas (forma correta)
SELECT c.CustomerID, s.SalesOrderID, d.SalesOrderDetailID
FROM Sales.Customer c
LEFT OUTER JOIN Sales.SalesOrderHeader s ON c.CustomerID = s.CustomerID
LEFT OUTER JOIN Sales.SalesOrderDetail d ON s.SalesOrderID = d.SalesOrderID
WHERE s.SalesOrderID IS NULL
Listagem 12. Exemplo de juno entre trs tabelas onde a tabela nao retorna NULL
SELECT c.CustomerID, s.SalesOrderID, t.Name
FROM Sales.Customer c
LEFT OUTER JOIN Sales.SalesOrderHeader s ON c.CustomerID = s.CustomerID
INNER JOIN Sales.SalesTerritory t ON c.TerritoryID = t.TerritoryID
WHERE SalesOrderID IS NULL
Listagem 13. Outro exemplo de outer join (territrios x clientes)
SELECT t.Name, CustomerID
FROM Sales.SalesTerritory t
LEFT OUTER JOIN Sales.Customer c ON t.TerritoryID = c.TerritoryID
tornam-se um pouco mais complicadas.
Quando uma tabela faz uma juno
com a tabela do lado direito (RIGHT),
um LEFT OUTER JOIN deve ser usado.
Isso ocorre porque as linhas NULL pro-
venientes da tabela do lado direito no
iro combinar com qualquer linha da
nova tabela. Um INNER JOIN faz com
que as linhas no-combinadas sejam
eliminadas dos resultados. Se a tabela
Sales.SalesOrderDetail fez uma juno
com a tabela Sales.SalesOrderHeader e
um INNER JOIN usado, nenhum dos
clientes sem compras realizadas sero
exibidos. O valor NULL no permite
que ocorra juno com qualquer valor,
alm de NULL.
Para ilustrar esse ponto, quando adi-
cionamos a tabela Sales.SalesOrderDetail
para uma das consultas anteriores que
verihcou os clienles sem comra (Lista-
gem 5), nenhuma linha retornada (ver
Listagem 10).
Para corrigir esse problema, mudemos
o INNER JOIN para um LEFT JOIN
(Listagem 11).
O que podemos falar sobre tabelas
adicionais que fazem juno com a
tabela Sales.Customer, a tabela do lado
esquerdo? Devemos usar outer joins? Se
possvel que existam algumas linhas
no combinadas, deve ser usado um
outer join para garantir que nenhum
resultado seja perdido. A tabela Sales.
Customer possui uma chave estrangeira
apontando para a tabela Sales.SalesTerri-
tory. Assim, todos as ID de territrio na
tabela de clientes deve ser combinada
com um valor vlido na tabela Sales.
SalesTerritory. Neste caso todas as linhas
de clientes sero recuperadas, pois
impossvel eliminar qualquer cliente
fazendo uma juno com a tabela Sales.
SalesTerritory (Listagem 12).
Sales.SalesTerritory a chave primria da
labela, lodo clienle deve combinar com um
territrio vlido. Se voc desejar escrever
uma consulta que liste todos os territrios,
inclusive aqueles que no possuem clien-
tes, um outer join deve ser usado. Desta vez,
Sales.Customers o lado direito da juno,
como pode ser visto na Listagem 13.
Concluso
Consultas com outer joins podem ser
delicadas de serem reescritas. Esforo
extra e muito cuidado devem ser gastos
para se ter certeza que os resultados
esto corretos. Este artigo cobriu vrios
conceitos importantes que voc precisa
saber sobre outer joins.
D seu feedback sobre esta edio!
A SQL Magazine tem que ser feita ao seu
gosto. Para isso, precisamos saber o que
voc, leitor, acha da revista!
D seu voto sobre este artigo, atravs do link:
www.devmedia.com.br/sqlmagazine/feedback
D

s
e
u
Feedbac
k
s
o
b
r
e
e
s
t
a
e
d i o
SQL54.indb 32 22.05.08 03:14:37
SQL54.indb 33 22.05.08 03:14:52
34 SQL Magazine - Modelagem de um Sistema de |ntegraao de Pontes de Dados Heterogeneas
Modelagem de um Sistema de Integrao de
Fontes de Dados Heterogneas
Srgio Luis Sardi Mergen
mergen@idealogic.com.br
bacharel emcincia da computao pela Univer-
sidade de Santa Cruz do Sul (UNISC) e mestre pela
UniversidadeFederal doRioGrandedoSul (UFRGS)
na rea de Sistemas de Informao. Atualmente
est cursando doutorado, tambm pela UFRGS,
trabalhandocomintegraodedados.Srgioum
dos scios daIdealogic Software,empresaquepro-
vsolues paraproblemas deintegrao.
[ Banco de dados ]
U
ma das caractersticas mais
marcantes dos tempos atuais
o crescimento vertiginoso
de dados disponveis para acesso via
Web. Um dos fatores que mais contri-
bui para esta exploso a facilidade
que as pessoas encontram em publicar
dados. Planilhas de custo, relatrios de
atividades, grficos de produo so
exemplos que mostram que no existem
limites para as informaes que podem
ser compartilhadas. Mesmo usurios
inexperientes podem rapidamente gerar
pginas HTML, usando ferramentas
intuitivas no estilo Wiki.
Dessa diversidade surge uma rede de
informaes, possivelmente relaciona-
das, espalhadas em diversos pontos e
modeladas em diferentes formatos. O
problema? Acessar todas essas fontes
de dados de uma forma transparente,
preferencialmente utilizando uma inter-
face nica de consulta. Esse na verdade
o objetivo primordial dos sistemas de
integrao de dados.
Sistemas deste tipo so usados em
diversas reas de interesse, tanto a nvel
mais cienlhco (como o acesso a bases de
dados biolgicas) quanto a nvel mais
geral (como as ferramentas de busca no
estilo Google Desktop ou MSN Search).
Neste artigo, abordarei diferentes formas
de modelar uma base de dados para que
ela possa ser usada por um sistema de inte-
grao. Ao investigar o problema, traarei
um paralelo com a modelagem orientada
a objetos, salientando como ela pode con-
tribuir para o caso aqui estudado.
Aplicao de exemplo
Muitas pessoas recorrem Web para
rocurar informaes sobre hlmes. L esse
comorlamenlo lenamenle |uslihcado.
Na Web, o domnio de hlmes cosluma ser
um dos mais ativos. O site IMDB um
exemplo disso. Trata-se de um servio de
consulta que permite descobrir diversas
informaes sobre um hlme, como o seu
elenco, o ano de lanamento, curiosidades
e hlmes com lemlica semelhanle.
SQL54.indb 34 22.05.08 03:14:55
Ldiao 54 - SQL Magazine 35
PROJETO DE SOFTWARE/ MODELAGEM
No entanto, apesar de possuir in-
formaes sobre um acervo de hlmes
gigantesco, a interface de consulta deixa
a desejar. Por exemplo, no existe uma
forma rida de descobrir quais hlmes
foram lanados em 1999, ou quais direto-
res atuaram com a produtora MGM.
Percebendo uma oportunidade de
mercado, uma empresa decidiu lan-
ar um novo servio de pesquisa por
hlmes com uma inlerface de consulla
mais rica. A parte interessante do
sistema a forma como se alimenta a
base de hlmes. Ao invs de deender
de recursos humanos para inserir os
hlmes na base, o sislema deve colelar
essas informaes automaticamente
em pginas HTML na Web.
Para que um sistema desse porte seja
construdo, alguns mdulos precisariam
ser desenvolvidos, como o crawler e o
wrapper. O papel do crawler varrer a Web
procura de pginas HTML que tratem
sobre hlmes. } o ael do wrapper extrair
as informaes das pginas em um forma-
to que facilite o seu processamento. No
nosso caso, o wrapper deve extrair tabelas
de dados a partir de pginas HTML.
Iara o hm rooslo nesle arligo, os
detalhes de implementao do crawler
e do wrapper no so relevantes. Assim,
vamos supor que eles j existam, e que
aps a sua execuo a coleo de tabelas
indicada na Tabela 1 pde ser extrada.
Neste caso, trata-se de uma coleo
pequena de tabelas, sendo que todas se
referem a uma mesma enlidade (hlme).
No entanto, as consideraes levantadas
neste artigo tambm so vlidas para
casos mais prximos da realidade, como
aqueles que envolvam a integrao de
milhares de tabelas e a representao de
diversas entidades diferentes.
Observe que os nomes das tabelas no
so nada expressivos. Isso uma limita-
o do nosso wrapper, que no consegue
encontrar um nome adequado para as
tabelas que ele extrai.
Outro detalhe pertinente que cada
tabela possui um conjunto de atributos
prprio, o que uma caracterstica das
fontes de dados na Web. Elas so, por
natureza, heterogneas. Afinal, no
se pode esperar que todas as pessoas
representem uma entidade da mesma
Tabela A
titulo ano genero
Pulp Fiction 1994 Acao
Armageddon 1998 Ficcao
American Pie 1999 Comedia
Tabela B
titulo ano diretor
Pulp Fiction 1994 Tarantino
The Matrix 1999 Wachowski
Tabela C
titulo ano
Senhor dos Aneis 2001
GrindHouse 2007
Tabela 1. Tabelas de dados coletadas a partir
de pginas Web
forma. A anlise das tabelas tambm
moslra que o hlme Iul Iiclion aa-
rece em duas fontes de dados, sendo que
cada fonte contribui com informaes
comlemenlares sobre o hlme. Redun-
dncia e sobreposio de informaes
so caractersticas bastante comuns em
fontes na Web, ainda mais quando o seu
criador lem aulonomia lolal na dehnio
do contedo que exposto.
aqui que ns, responsveis pela mo-
delagem da base de dados do sistema,
nos dearamos com um desaho. Como
integrar as informaes das fontes de da-
dos em uma base relacional, sabendo que
essas fontes podem possuir um conjunto
de atributos diferentes, e possivelmente
com dados redundantes e sobrepostos?
Que forma de modelagem apresentaria
o melhor custo-benefcio? So questes
como essa que sero analisadas nas
sees seguintes.
Abordagens de modelagem
Como ponto de partida, vamos nos
basear nas tcnicas usadas para repre-
sentar um modelo de dados orientado
a objetos em um modelo de dados rela-
cional. Estamos falando das tcnicas de
mapeamento objeto/relacional.
Figura 1. Um diagrama de classes tpico
SQL54.indb 35 22.05.08 03:14:58
36 SQL Magazine - Modelagem de um Sistema de |ntegraao de Pontes de Dados Heterogeneas
Essas tcnicas podem nos ser teis
uma vez que as colees de filmes
com as quais trabalhamos possuem
certa semelhana com o mundo das
classes e objetos. Para compreender
essa afirmao, veja o diagrama de
classes da Figura 1. Uma das conclu-
ses que podemos tirar com base neste
diagrama que nem todas as proprie-
dades so comuns a todas as classes.
A roriedade direlor esechca de
objetos da classe Filme, enquanto a
roriedade vocalisla esechca de
objetos da classe Musica.
O mesmo ocorre com as nossas tabelas
de hlmes. Alguns alribulos so comuns
a todas as tabelas, enquanto outros atri-
bulos so mais esechcos. Lis o molivo
pelo qual estudaremos nosso problema
como uma espcie de mapeamento
ob|elo1relacional. Isso no signihca que
estamos lidando com classes e objetos.
Apenas estamos utilizando as mesmas
idias ara um hm diferenle.
Existem, de modo geral, trs tcnicas
de mapeamento objeto/relacional: mape-
amento tipado, mapeamento horizontal
e mapeamento vertical. Para decidir-se
na escolha de uma delas, um projetista
deve avaliar uma srie de aspectos,
dentre os quais se destacam:
Custo de insero: o tempo que se
leva ara que um ob|elo se|a ersislido,
Custo de consulta: o tempo que se leva
ara que um ob|elo se|a recuerado,
Consumo de espao: a quantidade de
espao fsico necessria para armazenar
um ob|elo,
Custn dc pn!Imnrsmn: o nmero
de operaes necessrias para que um
objeto seja convertido de uma classe
ara oulra,
Custo de manuteno: o nmero de
operaes necessrias para modificar
a estrutura de uma classe. No nosso
caso de exemplo, o custo de manu-
teno ser medido como o nmero
de modificaes que o modelo deve
sofrer para que uma nova fonte de
dados (com uma estrutura diferente)
seja suportada.
Nas sees seguintes demonstrarei
como podemos modelar o nosso pro-
blema usando diferentes estratgias
de mapeamento. Para cada estratgia,
apresentarei uma anlise dos custos
gerados. cuslo de olimorhsmo no
ser discutido, pois ele no se aplica ao
nosso caso de uso. J o custo de consulta
ser estudado em uma seo parte.
Alm das trs estratgias de mape-
amento bsicas, demonstrarei uma
forma alternativa de mapeamento, que
neste artigo eu chamo de mapeamento
partido. Essa abordagem se mostra
particularmente til para o tipo de
problema que estamos estudando,
como ser visto mais adiante.
Mapeamento Tipado
No mapeamento tipado tradicional,
uma classe base e todas as suas sub-
classes so representadas como uma
nica tabela. Essa tabela contm todos
os atributos que esto presentes tanto
na classe base como nas sub-classes.
A Figura 2-a mostra como as tabelas
de filme seriam descritas seguindo
esta forma de mapeamento. Observe
que foi usado o tipo VARCHAR(255)
mesmo para atributos que sabemos que
oderiam ser dehnidos de oulra forma,
como ano. No entanto, como no existe
controle sobre o real formato dos dados
na sua origem, recomendvel utilizar
um tipo de dados mais genrico.
Nesla abordagem cada hlme arma-
zenado como um registro desta tabela,
o que torna o custo de insero baixo.
A incluso de uma nova fonte de dados
tambm oferece um custo relativamente
baixo. Por exemplo, para suportar uma
nova fonte com os atributos (titulo, dire-
lor), nenhuma modihcao recisaria ser
realizada. J no caso de uma fonte com
atributos novos, como titulo e cotacao,
bastaria adicionar uma nova coluna
(cotacao) tabela.
O mapeamento tipado utiliza um
atributo especial, que nesse caso foi
nomeado tipo. Este atributo usado
como uma cg que idenlihca a sub-classe
a qual cada registro de dados pertence.
Na nossa aplicao de exemplo, no en-
tanto, no existe o conceito de classes
e sub-classes. Isso no significa que
este atributo se torna sobressalente. Ele
apenas usado para uma funo dife-
rente. Nesse caso, esta cg usada para
idenlihcar as diferenles reresenlaes
de uma mesma entidade. Mais adiante
ser visto um caso onde essa informao
se torna relevante.
A Tabela 2 moslra como os hlmes co-
letados seriam materializados. O campo
lio esl idenlihcando os regislros
pelos atributos que eles contemplam.
Registros que contm titulo, ano
e genero so do tipo 1, registros que
contm titulo, ano e diretor so
do tipo 2, e assim por diante. Ou seja, os
registros iro conter valores nulos para
alguns campos. A ocorrncia de campos
nulos comum quando se trabalha com
o mapeamento tipado. Este espao no
SQL54.indb 36 22.05.08 03:15:03
Ldiao 54 - SQL Magazine 37
PROJETO DE SOFTWARE/ MODELAGEM
Filme
oid titulo ano genero diretor tipo
1 Pulp Fiction 1994 Acao Null 1
2 Armageddon 1998 Ficcao Null 1
3 American Pie 1999 Comedia Null 1
4 Pulp Fiction 1994 null Tarantino 2
5 The Matrix 1999 null Wachowski 2
6 Senhor dos Aneis 2001 null Null 3
7 GrindHouse 2007 null Null 3
Tabela 2. Materializao dos filmes seguindo o mapeamento tipado
utilizado uma inconvenincia deste
modelo. Conforme aumenta a segrega-
o dos atributos, aumenta o desperdcio
de espao fsico, o que pode se tornar
um problema.
Mapeamento Horizontal
No mapeamento horizontal cada classe
concreta se transforma em uma tabela
diferente. Relembrando conceitos de OO,
classe concreta aquela que pode ser ins-
tanciada. Excluem-se desta categoria as
classes abstratas e as interfaces. No nosso
caso de exemplo, supe-se que todas as
tabelas coletadas sejam classes concretas.
AFigura 2-b mostra como as tabelas de
hlme seriam descrilas seguindo esla forma
de mapeamento. Como se pode ver, cada
fonte d origem a uma tabela. A Tabela 3
aresenla como os hlmes seriam maleria-
lizados seguindo esta abordagem.
Assim como no mapeamento tipado, o
custo de insero no mapeamento hori-
zontal baixo. Basta inserir um registro
na tabela correspondente. O custo de
manuteno tambm baixo, visto que
toda nova fonte acaba sendo mapeada
para uma nova tabela. Alm disso, este
modelo no desperdia espao com
campos nulos, como ocorre com o mape-
amento tipado. O ponto negativo aparece
na hora da realizao de consultas, como
ser visto mais adiante.
Mapeamento Vertical
O mapeamento vertical procura mape-
ar uma hierarquia de classes com uma
hierarquia de tabelas. Cada classe d ori-
gem a uma tabela diferente. Alm disso,
cada tabela possui apenas os atributos
que so esechcos da classe que esl
sendo representada. As relaes entre
uma classe e suas sub-classes so repre-
sentadas atravs de chaves estrangeiras
entre as tabelas correspondentes.
Como na nossa aplicao no existe
uma hierarquia de classes de fato, essa
hierarquia precisa ser simulada. Isso
pode ser almejado refatorando as tabe-
las de hlme. Seguindo esse raciocnio,
atributos que so comuns a mais de uma
coleo so representados em uma mes-
ma tabela. O resultado dessa refatorao
pode ser visto na Figura 2-c. Nesse caso,
usamos o atributo oid para manter o
a) abordagem tipada b) abordagem horizontal
c) abordagem vertical
d) abordagem partida
Figura 2. Pormas posslveis de modelar as tabelas de filmes
SQL54.indb 37 22.05.08 03:15:05
38 SQL Magazine - Modelagem de um Sistema de |ntegraao de Pontes de Dados Heterogeneas
Filme 1
oid titulo ano
1 Senhor dos Aneis 2001
2 GrindHouse 2007
Filme 2
oid titulo ano genero
1 Pulp Fiction 1994 Acao
2 Armageddon 1998 Ficcao
3 American Pie 1999 Comedia
Filme 3
oid titulo ano diretor
1 Pulp Fiction 1994 Acao
2 The Matrix 1999 Ficcao
Tabela 3. Materializao dos filmes seguindo o
mapeamento horizontal
Filme 1
oid titulo ano
1 Pulp Fiction 1994
2 Armageddon 1998
3 American Pie 1999
4 Pulp Fiction 1994
5 The Matrix 1999
6 Senhor dos Aneis 2001
7 GrindHouse 2007
Filme 2
oid genero
1 Acao
2 Ficcao
3 Comedia
Filme 3
oid diretor
4 Tarantino
5 Wachowski
Tabela 4. Materializao dos filmes seguindo o
mapeamento vertical
Filme
oid
1
2
3
4
5
6
7
Filme 1
oid titulo
1 Pulp Fiction
2 Armageddon
3 American Pie
4 Pulp Fiction
5 The Matrix
6 Senhor dos Aneis
7 GrindHouse
Filme 2
oid ano
1 1994
2 1998
3 1999
4 1994
5 1999
6 2001
7 2007
Filme 3
oid genero
1 Acao
2 Ficcao
3 Comedia
Filme 4
oid diretor
1 Tarantino
2 Wachowski
Tabela 5. Materializao dos filmes seguindo o
mapeamento partido
relacionamento entre as tabelas.
ATabela 4 moslra como os hlmes seriam
materializadas em um modelo vertical. De
acordo com esle modelo, cada hlme ode
se transformar em mais de um registro,
dependendo da hierarquia de tabelas a
que ele est ligado. Registros de tabelas
diferentes com o mesmo oid so na ver-
dade arles dislinlas do mesmo hlme.
Como podemos observar pelo conte-
do das tabelas, o custo de insero neste
modelo superior aos modelos anterio-
res, visto que alguns registros precisam
ser divididos em mais de uma tabela. J
o consumo de espao baixo, uma vez
que no so usadas colunas nulas.
Para analisar o custo de manuteno,
deve-se primeiro entender um dos
pontos chave do nosso sistema de in-
tegrao: o sistema no impe que as
fontes sigam uma estrutura rgida. Ou
seja, qualquer combinao de atributos
pode ser usada.
Dito isso, suponha que se deseja incluir
uma nova fonte, e que ela possua os atri-
butos (titulo, diretor). Essa combinao
de atributos inviabilizaria o modelo de
dados vertical construdo, j que este
modelo sue que lodos os hlmes conle-
nham o atributo ano. Para corrigir esta
inconsistncia, um intenso trabalho de re-
modelagem precisaria ser executado, com
a criao de novas tabelas, a refatorao
de tabelas j existentes e a migrao dos
dados para a nova verso do modelo.
Mapeamento Partido
Este mapeamento na verdade uma
espcie de deturpao do mapeamento
vertical. Enquanto na abordagem verti-
cal criada uma tabela para cada classe,
nesta abordagem criada uma tabela
para cada atributo.
A Figura 2-d mostra como as colees
de hlme seriam modeladas seguindo
esta forma de mapeamento. Observe
que a hierarquia de tabelas se reduz
a dois nveis, sendo que o nvel raiz
composto por uma nica tabela, com um
nico atributo correspondente chave
primria. O objetivo desta tabela to
somente garantir a unicidade do oid
enlre hlmes diferenles.
ATabela 5 moslra como os hlmes seriam
materializados em um modelo partido.
SQL54.indb 38 22.05.08 03:15:08
Ldiao 54 - SQL Magazine 39
PROJETO DE SOFTWARE/ MODELAGEM
Alguns projetistas podero ver essa
estratgia de mapeamento como um srio
erro de modelagem. Ahnal, a rlica de
particionamento usada ao extremo, sen-
do que a eslrulura das labelas de hlmes co-
letadas no exige uma atitude to radical.
Cabe ressaltar aqui que no estamos lidan-
do com uma aplicao convencional. Em
um mapeamento objeto/relacional tpico,
essa abordagem realmente demonstra ser
inadequada. No entanto, para o sistema de
integrao proposto, essa abordagem tem
a sua razo de ser.
Ns j vimos o que acontece quando
se tenta suportar uma fonte contendo
(titulo, diretor) usando o mapeamento
vertical: algumas tabelas precisariam
ser reestruturadas. J o mapeamento
partido procura minimizar o impacto
negativo da manuteno quando se
deseja incorporar uma nova fonte de
dados. De fato, para que uma fonte
contendo (titulo, diretor) seja suportada
pelo nosso modelo, nenhuma tabela
recisaria ser modihcada.
Essa preocupao em minimizar o im-
pacto das mudanas tem suas razes na
teoria dos bancos de dados evolucionrios.
Bancos de dados evolucionrios so aqueles
que esto sujeitos a constantes alteraes
em seu modelo, devido s mudanas nos
requisitos da aplicao. De certa forma,
pode-se considerar a nossa aplicao como
uma espcie de banco de dados evolucio-
nrio, j que novas estruturas podem ser
adicionadas a todo o momento.
Os adeptos das metodologias geis de
programao defendem que um modelo
deve estar preparado para atender s
necessidades atuais apenas, e no deve
antecipar necessidades futuras. De
acordo com esta concepo, o modelo s
deve ser adaptado quando (se) ele apre-
sentar alguma limitao. Esse descaso
ao planejamento em longo prazo pode
funcionar para alguns tipos de projetos,
o que no nosso caso. Comear com
o modelo errado pode causar uma tre-
menda dor de cabea.
Agora o outro lado da moeda. Enquanto
o custo de manuteno baixo, o custo de
insero o mais alto de todos os mode-
los. Ahnal, a insero de um hlme vai exi-
gir um nmero de inseres proporcional
ao nmero de alribulos do hlme.
Listagem 1. Pespondendo a uma consulta simples
a) select titulo from filme where ano=1999
b) select titulo from filme1 where ano=1999
union all
select titulo from filme2 where ano=1999
union all
select titulo from filme3 where ano=1999
c) select titulo from filme1 where ano = 1999
d) select f1.titulo from filme1 f1, filme2 f2
where f1.oid = f2.oid and f2.ano = 1999
Listagem 2. Consultas usando junes de registros diferentes
a) select f1.titulo, f1.genero, f2.diretor from filme f1, filme f2
where f1.titulo = f2.titulo and f1.tipo = 1 and f2.tipo = 2
b) select f2.titulo,f2.genero, f3.diretor
from filme2 f2, filme3 f3 where f2.titulo = f3.titulo
c) select f1.titulo, f2.genero, f3.diretor
from filme1 f1, filme2 f2, filme1 f1_, filme3 f3
where f1.oid=f2.oid and f1_.oid=f3.oid and f1.titulo=f1_.titulo
d) select f1.titulo, f3.genero, f4.diretor
from filme1 f1, filme3 f3, filme1 f1_, filme4 f4
where f1.oid=f3.oid and f1_.oid=f4.oid and f1.titulo=f1_.titulo
Listagem 3. Suportando respostas incompletas
a) select titulo, genero, diretor from filme
b) select titulo, null, null from filme1
union all
select titulo, genero, null from filme2
union all
select titulo, null, diretor from filme3
c) select f1.titulo, f2.genero, null
from filme1 f1, filme2 f2 where f1.oid = f2.oid
union all
select f1.titulo, null, f3.diretor
from filme1 f1, filme3 f3 where f1.oid = f3.oid
d) select f1.titulo, f3.genero, null
from filme1 f1, filme3 f3 where f1.oid = f3.oid
union all
select f1.titulo, null, f4.diretor
from filme1 f1, filme4 f4 where f1.oid = f4.oid
SQL54.indb 39 22.05.08 03:15:13
40 SQL Magazine - Modelagem de um Sistema de |ntegraao de Pontes de Dados Heterogeneas
Analisando o custo de consulta
Uma vez materializados os dados,
pode-se disponibilizar o sistema para
uso. No entraremos no mrito de como
a interface de consulta est organizada,
mas iremos supor que o usurio seja
capaz de escolher os atributos que ele
dese|a acessar e ocionalmenle conhgu-
rar hllros de seleo.
A ergunla que hca , dada uma con-
sulta, como cada abordagem de mape-
amento se comporta para selecionar os
registros desejados? Para responder essa
pergunta, nada melhor do que alguns
exemplos prticos.
Vamos comear com uma consulta
simples: o usurio deseja saber o ttulo
de hlmes lanados em 1999. A Listagem 1
mostra os comandos SQL corresponden-
tes a cada modelo (a letra que antecede
a consulta identifica o mapeamento,
conforme indicado na Figura 2).
Observe que se usarmos tanto a aborda-
gem tipada quanto a vertical, as informa-
es de interesse podem ser encontradas
todas numa nica tabela. A consulta no
poderia ser mais simples do que isso. Para
a abordagem vertical, isso no passou de
um gole de sorle. Ahnal, se a consulla
requisitasse qualquer outro atributo, uma
juno teria que ser processada.
J a abordagem partida no consegue
escapar das junes, independentemente
dos atributos que forem requisitados.
o preo que se paga para se ter uma
soluo um ouco mais exvel. Nesle
modelo, o custo de uma consulta pro-
porcional ao nmero de atributos que
forem requisitados.
Enquanto que a abordagem horizontal,
diferentemente das demais abordagens,
precisa utilizar o operador de unio para
recuperar todos os registros de interesse
necessrio. Neste modelo, o custo de uma
consulta proporcional ao nmero de tabe-
las que podem contribuir com respostas.
importante ressaltar que, para todas
as formas de mapeamento, a responsa-
bilidade pela gerao das consultas
do sistema de integrao. Para que as
consultas sejam geradas corretamente,
o sistema precisa saber com exatido
como a modelagem foi feita, e onde cada
atributo pode ser recuperado.
O prximo exemplo envolve problemas
que so bastante comuns quando se tenta
integrar fontes de dados heterogneas:
redundncia e sobreposio de informa-
es. Conforme | foi conslalado, o hlme
Pulp Fiction pode ser encontrado em
duas fontes diferentes, sendo que as in-
formaes em uma fonte complementam
as informaes da outra. Agora suponha
que o usurio deseja saber o ttulo, o
gnero e o direlor de lodos os hlmes da
base. Sabemos que o hlme Iul Iiclion
possui todas as informaes requisitadas.
Resta saber como podemos recuper-las.
AListagem 2 mostra uma das formas de
resolver esse problema.
A soluo encontrada utiliza a juno
dos registros complementares. Para que
essa abordagem funcione, necessrio
saber qual alribulo da enlidade hlme lem
a funo de chave nica. Alm disso,
necessrio que esse atributo esteja pre-
sente em todas as tabelas que contenham
informaes complementares. No nosso
caso, esse atributo titulo.
Apesar desta soluo resolver o pro-
blema proposto, a ela lhe falta uma
qualidade que de extrema importn-
cia: escalabilidade. Quando se traba-
lha com um nmero maior de fontes de
dados, so grandes as chances de que
muitas delas sejam complementares
umas as outras. Dentro deste contexto
(e escolhendo qualquer abordagem de
mapeamento), imagine o tamanho das
consultas SQL necessrias para recu-
erar lodos os hlmes que lenha llulo,
diretor e gnero.
Feitos os clculos, podemos concluir
que precisamos de um plano alterna-
tivo. E no estou falando de um plano
de consulta alternativo. No importa a
consulta elaborada, ela continuar sendo
escabrosa. O que fazer ento, se utilizar
uma estratgia lazy e deixar para agru-
par os dados complementares em tempo
de consulta no funciona? Pois deixemos
a preguia de lado e faamos a integrao
em tempo de materializao! De que for-
ma? para isso que existem as tcnicas
de limpeza de dados, como as usadas
em processos de ETL (um processo ETL
extrai dados de uma base, transforma
estes dados e os carrega para uma base
destino, normalmente um datawarehose.
Seu nome um acrnimo para as trs
SQL54.indb 40 22.05.08 03:15:18
Ldiao 54 - SQL Magazine 41
PROJETO DE SOFTWARE/ MODELAGEM
fases do processo: Extract, Transform e
Load). A tcnica que estamos procuran-
do uma que faa a fuso de registros
redundantes e complementares.
Seguindo um conjunto simples (mas
poderoso) de regras, implementar uma
tcnica dessas a partir da estaca zero
uma tarefa relativamente fcil. Uma
abordagem prtica e eficiente seria
mesclar registros que tenham o mes-
mo valor (ou um valor similar) para
um atributo de ocorrncia nica, por
exemplo titulo. Essa a boa notcia.
A m notcia que apenas o modelo de
mapeamento tipado permite realizar a
fuso de registros. Os demais modelos
so simplesmente inconsistentes com
relao a esta tcnica de limpeza.
Depois de resolvidos todos esses
impasses, ns construmos o sistema,
o disponibilizamos para os usurios e
esticamos os ps para relaxar. Eis que
surge outra preocupao, levantada pelo
novo estagirio (no por ser inconve-
niente, mas interessado apenas). Como
suportar respostas incompletas, aquelas
cujos valores podem ser nulos para al-
gumas colunas? A intuio por trs das
respostas incompletas que na maioria
das vezes o usurio prefere receber da-
dos a menos a no receber nada.
Por exemplo, suponha que o usurio
deseja saber o ttulo, o gnero e o diretor
de lodos os hlmes da base, mas ele no se
importa se alguns dos atributos estiverem
ausentes. A Listagem 3 mostra como essa
requisio poderia ser atendida pelas
abordagens de mapeamento estudadas.
Novamente a abordagem mais simples
a tipada. Ela a nica que no requer
o uso do operador de unio.
Um fato curioso que, usando qual-
quer uma das consultas da Listagem
3, o filme Pulp Fiction aparece na
resposta, mesmo que os registros no
tenham sido fundidos numa etapa de
pr-processamento. Claro, aparecero
dois registros diferentes para o mesmo
hlme, com camo nulo, ora ara direlor,
ora para gnero. Mas como o usurio
disse anleriormenle: rehro receber da-
dos incompletos a no receber nada.
Qual abordagem escolher?
Conforme vimos no decorrer do artigo,
o mapeamento tipado vence em diversas
categorias, somente perdendo em custo
de manuteno para o mapeamento
partido e em custo de espao para todas
as demais abordagens.
Quanto ao primeiro quesito, reza as boas
prticas de modelagem que prefervel
adicionar caractersticas novas a um siste-
ma a modihcar caraclerslicas | exislenles.
Por isso, caso se deseje suportar um novo
atributo (por exemplo, a cotatao de um
hlme), diz-se que o cuslo de manuleno
no mapeamento partido menor porque
ele no requer a alterao de nenhuma
Voc j pode ler on-line TODAS
as edies da SQL Magazine.
Desde a numero 1!
Assinatura Gold
6x
R$
13,
31
Tudo isso por apenas
DE 50 EDIES
DE 500 ARTIGOS
SO
SQL54.indb 41 22.05.08 03:16:11
42 SQL Magazine - Modelagem de um Sistema de |ntegraao de Pontes de Dados Heterogeneas
D seu feedback sobre esta edio!
A SQL Magazine tem que ser feita ao seu
gosto. Para isso, precisamos saber o que
voc, leitor, acha da revista!
D seu voto sobre este artigo, atravs do link:
www.devmedia.com.br/sqlmagazine/feedback
D

s
e
u
Feedbac
k
s
o
b
r
e
e
s
t
a
e
d i o
tabela, apenas a adio de uma tabela
nova. Martin Fowler provavelmente con-
cordaria comigo nesla ahrmao.
No entanto, o custo de insero de um
novo atributo no mapeamento tipado no
lo maior assim. Ahnal, baslaria inserir
um novo atributo na tabela. Nem mesmo
seria necessrio fazer migrao dos dados
para o novo estado da tabela. Assim, caso
essa seja a sua nica preocupao, eu
diria que o mapeamento tipado poderia
ser usado sem peso na conscincia.
Quanto ao consumo de espao, deve-se
analisar se a diferena da base de dados
em tamanho realmente impactante ao
se usar o mapeamento tipado. Em muitos
casos prticos, talvez o tamanho ocupado
no seja muito maior, ou at mesmo pos-
svel que se verihque a relao inversa!
Caso a diferena de tamanho realmente
inviabilize a escolha desta forma de
mapeamento, aconselho escolher entre
o mapeamento horizontal e o mapea-
mento partido. O custo de manuteno
praticamente o mesmo para estas duas
abordagens, e o custo de insero me-
nor para a abordagem horizontal. No en-
tanto, creio que o fator mais importante
seja o custo de consulta, tendo em vista
que a insero de um registro ser feita
apenas uma vez, enquanto que o seu
acesso ser realizado inmeras vezes.
Para saber qual destas duas abordagens
apresenta o menor custo de consulta,
preciso usar um pouco da sua capacidade
dedutiva. Escolha o mapeamento horizon-
tal caso voc sinta que as consultas mais
populares envolvero poucas tabelas.
Escolha o mapeamento partido caso voc
sinta que as consultas mais populares
envolvero poucos atributos. Ter uma boa
noo dos tipos de consulta que so mais
comumente usados e de como os atributos
esto distribudos pelas fontes de dados
pode ajud-lo a tomar a melhor deciso.
Concluso
Neste artigo vimos diversas formas de
modelar uma base de dados que integre
informaes presentes em fontes de da-
dos heterogneas. O material aqui apre-
senlado o suhcienle ara iniciar uma
discusso que envolva a criao de um
sistema de integrao de dados. Existem,
porm, uma srie de outros aspectos que
tambm devem ser analisados.
Por exemplo, ao invs de materializar os
dados, poderamos adotar uma abordagem
virtual e deixar os dados nas fontes. Se
assim fosse, quando uma consulta fosse re-
alizada, o sistema teria que acessar as fontes
para recuperar as informaes desejadas.
Comparado com a abordagem materiali-
zada, onde recuperamos as informaes a
partir de uma base relacional, a abordagem
virtual traria uma perda considervel de
desempenho. Em compensao, teramos
a certeza de que a resposta das consultas
seria sempre a mais atualizada possvel.
Outra questo pertinente envolve a hetero-
geneidade no da estrutura, mas do contedo
das fontes. Muitas vezes a mesma informao
pode ser descrita de maneiras diferentes por
pessoas diferentes. Quando algum acha que
o hlme de maior sucesso dos irmos Wacho-
wski se chama Matrix e no The Matrix,
ou quando algum engole um d na hora
de descrever o hlme Armageddon, nosso
sistema de integrao precisa passar por uma
reviso. At que ponto um SGBD pode nos
ajudar quando os dados (ou as consultas) so
imprecisos? possvel que em casos como
esse seja melhor aliviar um pouco a carga
sobre o SGBD e trazer a complexidade para
o nvel da aplicao? Ou no?
Lnhm, ludo na vida exige a lomada de
decises, e elas nem sempre so fceis, es-
pecialmente em se tratando dos projetos
de integrao de dados. O pior que mui-
tas decises no podem ser postergadas.
O cliente espera, e uma plula precisa ser
escolhida: a azul ou a vermelha. A plula
errada nos far viver em um mundo de
fantasia, onde os dados so sempre con-
sistentes e as consultas bem comportadas.
Mas tome cuidado! Um dia o sonho acaba,
e o despertar para a realidade pode ser
um tanto amargo.
SQL54.indb 42 22.05.08 03:16:24
SQL54.indb 43 22.05.08 03:16:30
44 SQL Magazine - Peplicaao Oracle - Parte ||
Replicao Oracle Parte II
Mantenha os dados sincronizados para garantir
qualidade nos testes de software
Marcio Henrique Guimares
profmarcioguimaraes@fiap.com.br
professor titular da FIAP nas reas de Java M-
bile e Banco de Dados. Atua h 19 anos nas reas
de:Anlise de Sistemas e Administrao de Banco
de Dados. Ps-Graduado pela Fiap em Adminis-
trao de Banco de Dados.Profissional certificado
Oracle em Banco de Dados e Oracle Developer,
atualmente trabalha como DBA Oracle para a
Inter Commerce Technologies.
Slvio Padlipskas
salvio@fiap.com.br
professor titular da FIAP na rea de Banco de
Dados. Atua h 17 anos nas reas de: Anlise de
Sistemas e Administrao de Banco de Dados.
mestre pelo IPT/USP, na rea de Engenharia de
Software. Profissional certificado Oracle, atual-
mente trabalha no Grupo Ultra como DBA Oracle.
[ Banco de dados ]
E
ssa matria a continuao da
anterior e tem por objetivo apli-
car replicao de dados de forma
passo a passo utilizando a ferramenta
de replicao da Oracle. Para isso, fare-
mos uso do mesmo modelo de dados da
matria anterior.
De incio, importante ter em mente
que a replicao pode ser sncrona ou
assncrona, as replicaes assncronas
so as mais usadas em razo de que
oneram menos o banco de dados nos pro-
cessos transacionais, pois ocorrem em
perodos de tempo pr-determinados.
A replicao sncrona mais onerosa,
porm em determinadas situaes so
de extrema importncia. Nesta matria
abordaremos a replicao sncrona, mas
veremos lambm a resoluo de conilos
que algo muito importante na replica-
o assncrona.
A verso do SGBD que usamos foi
o Oracle Enterprise 9i, os passos para
realizarmos a replicao na verso 10g
so praticamente os mesmos.
Usamos a ferramenta Enterprise Ma-
nager que automatizou boa parte da
implementao, alguns passos, porm,
sero realizados por meio do SQL*Plus.
Antes de iniciarmos, vamos tratar de
alguns conceitos importantes que iro
facilitar o entendimento do passo a passo
da soluo que mostraremos no tpico
Iniciando o Processo.
Preparando a replicao
Primeiro devemos preparar a replicao
entendendo os conceitos que a envolvem.
Todo processo de replicao envolve um
replicador ou, como denominado no
Oracle Enterprise Manager, Site Mestre.
O Site-Mestre o mecanismo de refe-
rncia que relaciona todas as instncias
envolvidas no processo de replicao.
atravs deste mecanismo que criamos o
canal de comunicao entre as instn-
cias a serem replicadas. Isso ser feito
mediante o uso de Database Links, da
mesma forma que utilizamos na primei-
ra parte deste artigo.
SQL54.indb 44 22.05.08 03:16:31
Ldiao 54 - SQL Magazine 45
PRI MEI ROS PASSOS EM BANCO DE DADOS
Devemos criar um database link em
cada instncia de banco de dados envolvi-
da. O primeiro database link referenciar
a segunda instncia (neste caso chamada
GPTEST9R, instncia Replicada) e o
segundo database link referenciar a ins-
tncia GPTEST9 de onde sero propaga-
dos os dados para a segunda instncia.
Uma replicao pode envolver diversas
instncias, desde que estas participem
na dehnio dos siles meslres. Na im-
plementao deste artigo iremos tratar
apenas de duas instncias GPTEST9
(Emissor) e GPTEST9R (Receptor).
Na conslruo da relicao iremos deh-
nir as instncias como emissoras (aquelas
que enviam informaes a outra instncia)
e como receptoras (aquelas que recebem
informaes de outra instncia).
Antes de criarmos os Database Links,
devemos criar os usurios de replicao
nas duas instncias, esses usurios so
padronizados e sero chamados de RE-
PADMIN. Nada impede que utilizemos
outro usurio, s no recomendado
utilizarmos os usurios SYS ou SYSTEM.
Este usurio que criaremos dever ter
Nota do DevMan
Replicao
Replicao o processo de criar e manter rplicas de
objetos do banco de dados (tabelas, por exemplo) em
sistemas de banco de dados distribudos.
Replicao pode melhor o desempenho e aumentar
sensivelmente a disponibilidade da aplicao pelo fato
do acesso aos dados estarem disponveis em diferentes
localidades. Por exemplo, os usurios podem acessar um
banco de dados local ao invs de um banco de dados em
um servidor remoto, minimizando assim o trfego de rede.
Alm deste exemplo, a aplicao pode ainda continuar
funcionando normalmente caso parte do sistema
distribudo esteja fora do ar, pois as rplicas continuaro
disponveis e acessveis.
Note que replicao de dados fundamentalmente
diferente de distribuir dados. Quando os dados so
distribudos, podem ser acessados de vrios locais de
maneira transparente, mas a tabela em questo est
localizada em apenas um lugar e este lugar o responsvel
pela segurana e integridade desta informao.
Em contrapartida, dados replicados residem em vrias
localidades simultaneamente e cada um deles compartilha
sua manuteno. A replicao de dados implica num
aumento no nvel de complexidade porque envolve
questes de sincronizao e latncia. Esta complexidade
o preo a ser pago para manter a operao contnua
mesmo quando uma fonte de dados remota no est
disponvel.
Listagem 1. Criando o usurio, atribuindo privilgios ao mesmo e criando os links de comunicao.
GPTEST9> CONN SYS@GPTEST9 AS SYSDBA
Informe a senha:
Conectado.
GPTEST9> GRANT CONNECT,RESOURCE TO REPADMIN IDENTIFIED BY REPADMIN;
GPTEST9> CREATE DATABASE LINK GPTEST9R CONNECT TO REPADMIN
2> IDENTIFIED BY REPADMIN USING GPTEST9R;
GPTEST9> GRANT EXECUTE ON SYS.DBMS_REPCAT_UTL2 TO REPADMIN;
GPTEST9> GRANT EXECUTE ON SYS.DBMS_REPCAT_RPC TO REPADMIN;
GPTEST9> GRANT EXECUTE ON SYS.DBMS_REPCAT_MAS TO REPADMIN;
GPTEST9> EXECUTE Dbms_Defer_Sys.Register_Propagator(username=>REPADMIN);
GPTEST9> GRANT EXECUTE ANY PROCEDURE TO repadmin;
GPTEST9> EXECUTE Dbms_Repcat_Admin.Grant_Admin_Any_Repgroup(REPADMIN);
GPTEST9> EXECUTE Dbms_Repcat_Admin.Grant_Admin_Any_Schema (username => REPADMIN);
GPTEST9> GRANT LOCK ANY TABLE TO repadmin;
GPTEST9> GRANT COMMENT ANY TABLE TO repadmin;
GPTEST9> CONN SYS@GPTEST9R AS SYSDBA
Informe a senha:
Conectado.
GPTEST9R> GRANT CONNECT,RESOURCE TO REPADMIN IDENTIFIED BY REPADMIN;
GPTEST9R> CREATE DATABASE LINK GPTEST9 CONNECT TO REPADMIN
2> IDENTIFIED BY REPADMIN USING GPTEST9;
GPTEST9R> GRANT EXECUTE ON SYS.DBMS_REPCAT_UTL2 TO REPADMIN;
GPTEST9R> GRANT EXECUTE ON SYS.DBMS_REPCAT_RPC TO REPADMIN;
GPTEST9R> GRANT EXECUTE ON SYS.DBMS_REPCAT_MAS TO REPADMIN;
GPTEST9R> EXECUTE Dbms_Defer_Sys.Register_Propagator(username=>REPADMIN);
GPTEST9R> GRANT EXECUTE ANY PROCEDURE TO repadmin;
GPTEST9R> EXECUTE Dbms_Repcat_Admin.Grant_Admin_Any_Repgroup(REPADMIN);
GPTEST9R> EXECUTE Dbms_Repcat_Admin.Grant_Admin_Any_Schema (username => REPADMIN);
GPTEST9R> GRANT LOCK ANY TABLE TO repadmin;
GPTEST9R> GRANT COMMENT ANY TABLE TO repadmin;
Listagem 2. Criando o usurio dono das tabelas que sofrero replicao.
GPTEST9> GRANT CONNECT,RESOURCE TO CARLOCA IDENTIFIED BY CARLOCA;
GPTEST9R> GRANT CONNECT,RESOURCE TO CARLOCA IDENTIFIED BY CARLOCA;
alguns privilgios conforme veremos no
tpico Iniciando o Processo.
A Listagem 1 mostra os processos de
criao do usurio REPADMIN.
Na Listagem 1 mostramos no comando
CONN atravs do qual conectamos em
cada uma das instncias a serem replica-
das como usurio SYS, uma vez que este
possui os objetos que precisamos para
que possamos realizar a replicao.
J o comando GRANT CONNECT,
RESOURCE TO REPADMIN IDENTI-
FIED BY REPADMIN realiza a criao
do usurio e ao mesmo tempo atribui
os direitos de conexo com o banco de
dados e o direito de criar objetos (tabelas,
ndices) no banco de dados.
O comando CREATE DATABASE
LINK cria o database link em cada
um dos bancos de dados, de forma que
o processo seja bidirecional.
Finalmente, consideramos DBMS_REP-
CAT_UTL2, DBMS_REPCAT_RPC e
DBMS_REPCAT_MAS que so os pa-
cotes necessrios para que a replicao
possa efetivamente funcionar.
Alm disso, precisa-se registrar o
SQL54.indb 45 22.05.08 03:16:34
46 SQL Magazine - Peplicaao Oracle - Parte ||
Sites Mestres: instncias envolvidas no processo de
replicao;
Grupos mestres de replicao: grupo ou agrupamento
lgico de objetos (tabelas, ndices, sinnimos, vises e
rotinas pl/sql).
Nota 1. Sites e Grupos Mestre
Figura 1. Assistente de Peplicaao, criando site mestre.
usurio propagador da replicao con-
forme o comando EXECUTE Dbms_De-
fer_Sys.Register_Propagator.
Precisa-se ainda dar direitos para o usu-
rio propagador (administrador) poder
administrar qualquer grupo de replicao,
conforme o comando EXECUTE Dbms_
Repcat_Admin.Grant_Admin_Any_Rep-
grou e, or hm, o direilo de adminislrar os
objetos de qualquer schema da instncia.
Para iniciarmos o processo de criao
da replicao, precisamos tambm deter-
minar qual ser o schema, ou quais ta-
belas de um determinado schema sero
trabalhadas pelo processo de replicao.
Nesta segunda parte do artigo criamos
um schema, chamado CARLOCA. Esse
schema dever ter alguns privilgios,
mostrados na Listagem 2.
Uma vez realizados estes passos, po-
demos preparar a criao do processo
de relicao, dehnindo os siles meslres
e depois criando os grupos mestres de
replicao. Nestes grupos incluiremos
as tabelas, vises, ndices, sinnimos e
rotinas pl/sql (procedimentos, funes
e pacotes) (ver Nota 1).
Iniciando o processo
O processo de criao da replicao
poder ser realizado atravs de scripts
em PL/SQL ou atravs da ferramenta
Enterprise Manager.
Neste artigo usaremos o Enterprise
Manager que realiza por sua vez a cria-
o dos scripts e os executa, tornando o
processo mais fcil de ser realizado.
Neste artigo listaremos parte do c-
digo gerado pela ferramenta, para que
se possa familiarizar com as rotinas
necessrias criao do processo.
1. Criando os sites mestres
da replicao
Como falamos anteriormente, o pri-
meiro passo a criao dos sites mestres
da replicao (no nosso caso, duas ins-
tncias). Isso indicar onde ocorrer a
replicao, ou seja, quem ser o emissor
e quem ser o receptor da replicao.
A Figura 1 mostra a tela do assistente
de replicao.
1) Clique na opo adicionar e indique os
dois sites mestres envolvidos (Figura 2).
2) Uma vez adicionados os dois sites,
selecione a opo OK e voltaremos para
a Figura 1. Clique em Prximo para indi-
car os usurios Administrador, Receptor
e Propagador.
3) Na tela do assistente chamada Es-
quemas de sites mestre, podemos clicar
em Prximo, j que criamos o usurio
conforme vimos na Listagem 2.
4) Conforme a Figura 3, vemos o tempo
Figura 2. Assistente de Peplicaao, criando site mestre.
em que a replicao ser acionada. Po-
demos indicar que em caso de erro no
processo deve-se interromper o job.
5) Podemos ainda personalizar o perodo
do job de expurgo conforme a Figura 4. Job
de expurgao um processo criado para
eliminao de pendncias que possam
ocorrer durante o processo de replicao.
6) Ao hnalizarmos a criao do sile
mestre podemos selecionar a opo re-
gistrar um script, que mostrar o script
hnal de criao dos siles meslres. Ao
selecionarmos hnalizar, ser edido o
local para gravao do script que foi
solicitado.
2. Criando os grupos mestres
de replicao
Selecione a opo Replicao Avanada,
Replicao Multimestre, Grupos-Mestre.
Clique com o boto esquerdo do mouse
sobre essa opo e selecione Criar.
Essa opo ir criar um grupo de replica-
o, pois atravs dela que iremos indicar
quais objetos sero replicados, que tipo
de replicao iremos utilizar (sncrona ou
assncrona), bem como qual ser o pro-
cesso de resoluo de conilo que iremos
adotar para o grupo. Entenda-se resoluo
de conilo como o meio de delerminar
quem ir prevalecer em termos de atuali-
zao quando um mesmo registro estiver
diferente nas duas bases.
Podemos ter um ou mais grupos mes-
tre, para efeito deste artigo usaremos
apenas um chamado GRP_MODELO.
SQL54.indb 46 22.05.08 03:16:36
Ldiao 54 - SQL Magazine 47
PRI MEI ROS PASSOS EM BANCO DE DADOS
Figura 3. Definindo quanto tempo ser usado na atualizao da replicao. Figura 4. Definindo quando dever ser rodado o job para expurgar,
transaes incompletas.
Figura 5. Adicionando objetos ao grupo-mestre.
Na pasta Objetos vemos os objetos que
fazem parte do grupo, clicando no boto
atualizar iremos informar quais objetos
queremos replicar e de qual schema ire-
mos selecion-los (ver Figura 5).
Uma vez selecionados os objetos, sele-
cionar OK (Figura 5). Voltando tela de
criao de grupos-mestre, selecione a aba
sites-mestre e clique em adicionar. Indi-
que que ir selecionar o site mestre atra-
vs da opo todos os vnculos de banco
de dados. Selecione o vnculo apropriado,
na implementao deste artigo usamos
um vnculo chamado GPTEST9R.
Uma vez criado o vnculo com o servi-
dor de replicao, o grupo mestre est
pronto para ser criado, selecione a opo
criar. A partir da os scripts gerados
internamente pelo Enterprise Manager
sero executados. Podemos observar na
Listagem 3 parte dos scripts usados na
gerao do grupo-mestre.
Uma vez criado o grupo mestre, pode-
mos conectar ao servidor que receber a
SQL54.indb 47 22.05.08 03:16:41
48 SQL Magazine - Peplicaao Oracle - Parte ||
Listagem 3. Pesultado da criaao do grupo mestre.
BEGIN
DBMS_REPCAT.ADD_MASTER_DATABASE(
gname => GRP_MODELO,
master => GPTEST9R.US.ORACLE.COM,
use_existing_objects => TRUE,
copy_rows => TRUE,
propagation_mode => SYNCHRONOUS);
END;
/
BEGIN
DBMS_REPCAT.CREATE_MASTER_REPOBJECT(
gname => GRP_MODELO ,
type => TABLE,
oname => LOC_CLIENTE,
sname => CARLOCA,
copy_rows => TRUE,
use_existing_object => TRUE);
END;
BEGIN
DBMS_REPCAT.CREATE_MASTER_REPOBJECT(
gname => GRP_MODELO,
type => INDEX,
oname => PK_CLIENTE,
sname => CARLOCA,
copy_rows => TRUE,
use_existing_object => TRUE);
END;
BEGIN
DBMS_REPCAT.RESUME_MASTER_ACTIVITY(
gname => GRP_MODELO);
END;
Listagem 4. Listagem de uma transao realizada enquanto a replicao estiver desligada.
SQL> update loc_cliente set nm_cliente = CLEBER SANTANA
2 where cd_cliente = 9;
update loc_cliente set nm_cliente = CLEBER SANTANA
*
ERRO na linha 1:
ORA-23326: grupo de objetos PUBLIC.GRP_MODELO est desativado
Figura 6. Verificando o status de replicao do grupo mestre.
replicao atravs do prprio Enterprise
Manager e poderemos ver se o grupo
mestre est criado no servidor.
A criao do grupo mestre no servidor
principal (GPTEST9) implica na criao
automtica do grupo mestre no servi-
dor de replicao (GPTEST9R). Caso
isso no tenha ocorrido, houve alguma
falha no processo de criao. Neste caso
recomenda-se apagar o grupo mestre
criado e reiniciar o passo de criao do
grupo mestre.
Uma vez que o grupo mestre tenha sido
replicado, podemos entender que o pro-
cesso de replicao est funcionando.
Nesle momenlo devemos verihcar se
a replicao est ativa. Isso pode ser
feito clicando-se no grupo mestre criado
(GRP_MODELO). Na rea de controle do
grupo mestre temos a opo do status
da Replicao (Figura 6). Se esta estiver
Executando (Normal), isso indica que a
mesma est funcionando, caso contr-
rio estar Interrompido (Desativado).
Para ativ-la clique no boto Submeter
Iniciar Solicitao.
Estando o grupo mestre ativo, todas
as transaes feitas na instncia mestre
(GPTEST9) sero levadas para a instncia
(GPTEST9R) e vice-versa.
Gerenciando transaes
A partir deste momento estamos com a
replicao sendo feita e isso implica que
devemos gerenciar as transaes.
O modelo que escolhemos, replicao
sncrona, bastante claro, pois no
existe delay (atraso) entre a realizao e
salvamento da transao e a respectiva
replicao. As transaes de replicao
geram os chamados jobs de controle de
replicao.
Quando criamos o site mestre, apon-
tamos qual seria o intervalo de tempo
para realizao das cargas e com qual
periodicidade deveramos o expurgo.
A implementao disso feita atra-
vs de jobs programados pelo pacote
DBMS_JOBS.
So programados trs jobs de replica-
o em cada instncia, sendo o criador
dos mesmos o usurio REPADMIN,
cabendo a este alter-los quanto a perio-
dicidade de realizao das tarefas. Figura 7. Verificando o status de replicao do grupo mestre.
SQL54.indb 48 22.05.08 03:16:42
Ldiao 54 - SQL Magazine 49
PRI MEI ROS PASSOS EM BANCO DE DADOS
Alterando as tabelas associadas
replicao
Podemos adicionar novas tabelas
replicao. Para isso, precisamos abrir
um novo grupo mestre de replicao
ou, no grupo mestre existente, adicio-
namos uma nova tabela. Sempre que
adicionarmos uma nova tabela, devemos
adicionar tambm os seus ndices, pois
eles sero necessrios tanto no servidor
de replicao quanto o so no servidor
propagador.
Veremos agora o passo a passo para a
incluso de uma nova tabela ao processo
de replicao:
Selecione o gruo meslre exislenle,
Clique na aba ob|elos,
Clique no boto adicionar. Ser exi-
bida a mensagem questionando se voc
deseja parar o processo de replicao.
Lscolha a oo Sim,
Selecione as tabelas e outros objetos,
bem como, o schema o qual deseja repli-
car e clique K,
Clique no boto gerar suporte a re-
plicao. Isso ir fazer com que a tabela
e ou demais estruturas sejam criadas na
inslncia relicada (GITLST9R),
Clique na aba Geral e clique no boto
submeter iniciar solicitao.
Figura 8. Legendas do mapa da topologia da replicao.
Figura 9. Tela de manutenao de ob|eto de replicaao, tabela LOC_CL|LNTL.
Figura 10. Tela de criaao de grupo de Colunas. Figura 11. Tela de criaao dos metodos de
resoluo.
SQL54.indb 49 22.05.08 03:16:47
50 SQL Magazine - Peplicaao Oracle - Parte ||
O processo de replicao ser reativado
e as transaes pendentes sero proces-
sadas. Durante este processo, as tabelas
envolvidas na replicao no podero
ser transacionadas, podendo apenas ser
consultadas. Caso ocorram atualizaes
na mesma, o erro apresentado na Lista-
gem 4 ser reportado.
O erro citado ocorrer em qualquer uma
das instncias, por isso em caso de manu-
teno, dependendo do tamanho e grau
de complexidade da mesma, seria interes-
sante criarmos um novo grupo mestre.
Grupos mestre com grandes quantidades
de objetos tendem a ter mais problemas
de manuteno ao longo do tempo.
Ve|amos como hcou o maa de relica-
o que aparece na primeira aba do pro-
cesso de replicao, conforme ilustrado
na Figura 7. Nesla hgura lemos os siles
mestre da replicao, mostrando ainda o
nmero de solicitaes administrativas
que foram processadas pela instncia
que recebe os dados da replicao.
Caso ha|a algum conilo ou roblema,
iro aparecer novos elementos visuais
como os mostrado na Figura 8.
No processo de criao do site mestre,
caso informssemos o uso de adiamento
das transaes, quando as mesmas ocor-
ressem seriam registradas no mapa de
replicao, conforme a legenda mostrada
na Figura 8.
Em caso de erro com as transaes, os
mesmos hcaro regislrados no maa da
Figura 8, neste mapa vemos o nmero
de transaes existentes e, em caso de
transaes com erro, aparecer o nu-
mero de transaes que apresentaram
alguma falha. s erros regislrados hcam
pendentes de resoluo que devem se
sujeitar a regras para resoluo dos mes-
mos (estas regras de resoluo estaro
explicadas no tpico seguinte).
Caso o link entre os dois servidores
esle|a vermelho, signihca que o mesmo
est interrompido e que as replicaes
no esto sendo realizadas, assim como
as manutenes nas tabelas envolvidas
tambm no esto sendo realizadas.
Tipos de conflitos durante
a replicao
Lxislem lrs lios de conilos:
Conflito de exclusividade: ocorre
quando a replicao de uma linha tenta
violar a integridade da entidade, como
uma restrio CHAVE PRIMRIA ou
EXCLUSIVO. Por exemplo, considere o
que acontece quando duas transaes
se originam de dois sites diferentes,
cada uma inserindo uma linha em uma
replicao de tabela respectiva com o
mesmo valor de chave primria.
Conilo de deleo: ocorre quando duas
transaes se originam de sites diferentes,
com uma transao deletando uma linha e
outra transao atualizando ou deletando a
mesma linha. Nesse caso, a linha no existe
mais para ser atualizada ou deletada.
Conilo de alualizao: ocorre quan-
do a replicao de uma atualizao para
uma linha enlra em conilo com oulra
alualizao na mesma linha. s conilos
de atualizao podem acontecer quando
duas transaes, originadas de sites
diferentes, atualizam a mesma linha
praticamente ao mesmo tempo.
Gerenciando conflitos
(replicao assncrona)
gerenciamenlo de conilos deve ser
realizado para cada objeto e as regras so
prprias de cada um dos objetos envol-
vidos no processo de replicao.
Veremos a partir de agora um exemplo
de como implementamos uma resoluo
de conilo.
Figura 12. Tela de criaao de grupo de Prioridades.
SQL54.indb 50 22.05.08 03:16:52
Ldiao 54 - SQL Magazine 51
PRI MEI ROS PASSOS EM BANCO DE DADOS
D seu feedback sobre esta edio!
A SQL Magazine tem que ser feita ao seu
gosto. Para isso, precisamos saber o que
voc, leitor, acha da revista!
D seu voto sobre este artigo, atravs do link:
www.devmedia.com.br/sqlmagazine/feedback
D

s
e
u
Feedbac
k
s
o
b
r
e
e
s
t
a
e
d i o
Vamos escolher uma tabela, LOC_
CLIENTE. Vamos localiz-la no Enterprise
Manager no respectivo grupo mestre. Cli-
que com o mouse no objeto LOC_CLIEN-
TE, aparecer a tela da Figura 9.
Clique na aba Resoluo de Conilo
para criarmos uma regra de resoluo
de conilo.
s conilos odem ser organizados
por grupos de colunas, que seriam
resultantes da seleo de colunas da ta-
bela, uma vez que estas colunas sofram
modihcaes em ambas as inslncias em
um intervalo de tempo de curta durao,
odero ocorrer conilos e os gruos de
conilo visam lralar esses roblemas
em forma de grupo. Podemos ter vrios
grupos de colunas e inclusive mais de
um grupo para uma mesma tabela,
conforme mostra a Figura 10.
Vamos criar um processo de resoluo.
Para isso selecione o grupo criado e cli-
que na opo Adicionar.
Devemos selecionar o mtodo de
resoluo que desejamos implementar
(Figura 11). Cada coluna pode ter o seu
prprio tipo de resoluo. A resoluo
que adotaremos o mtodo de priorida-
de de site, este mtodo indica qual site
dever revalecer em caso de conilo,
tpico para resoluo de problemas de
atualizao realizadas nos dois sites em
intervalo de tempo prximo (segundos).
Para isso, precisamos editar os grupos de
prioridade para criarmos um parmetro
que dever indicar qual site mestre deve-
r revalecer em caso de conilo.
A Figura 12 ilustra a criao de um
grupo de prioridade.
Clique na opo adicionar e crie os
valores de prioridade, no exemplo cria-
mos um grupo de prioridade chamado
PADRAO e no valor de Prioridade colo-
camos GPTEST9.
Ao voltarmos para a tela de criao dos
mtodos de resoluo, o grupo de priori-
dade que criamos est marcado. Clique na
opo OK e teremos o mtodo de resoluo
de conilos devidamenle criado.
Lembro que este processo, da mes-
ma forma que o processo de incluso
de novos objetos, obriga a parada do
processo de repl icao. Com isso,
recomendamos que este seja feito em
horrio que as tabelas envolvidas no
estejam sendo transacionadas para
que no haja uma interrupo dos
processos transacionais regulares.
A imlemenlao que hzemos (sncro-
na) no possui problema quanto reso-
luo de conilos, ois eles inexislem,
j que as alteraes so implementadas
imedialamenle as a sua conhrmao,
e os registros so travados por lock no
momento em que so executados.
Concluso
Este artigo teve o objetivo de auxiliar
no processo de criao de replicao
de forma detalhada e estruturada.
Esperamos que vocs tenham gostado
e que as tcnicas apresentadas possam
contribuir no seu trabalho.
SQL54.indb 51 22.05.08 03:17:00
52 SQL Magazine - Monitoramento de base de dados
Monitoramento de Base de Dados
Como manter os bancos de dados da sua empresa sob controle
Mauro Pichiliani
pichiliani@uol.com.br
bacharel em Cincia da Computao, mestre
pelo ITA (Instituto Tecnolgico de Aeronutica) e
MCP, MCDBA e MCTS.Trabalha h mais de 8 anos
utilizando diversos bancos de dados, como o SQL
Server, Oracle e MySQL. colunista de SQL Server
do web site iMasters (http://www.imasters.com.
br) e pode ser contatado atravs do e-mail.
[ Banco de dados ]
A
monitoria de base de dados
uma das principais responsa-
bilidades do DBA, no apenas
por envolver diversas observaes, mas
tambm por englobar todo o gerencia-
mento, administrao, manuteno e
melhorias nas bases de dados. Apesar
de no ser uma tarefa muito complexa,
preciso contar com vrios recursos
ara eslabelecer uma moniloria conh-
vel, segura e que pode representar a
diferena entre um ambiente controlado
e um ambiente catico.
Ficar de olho nas bases de dados e seus
respectivos servidores so uma tarefa que
envolve tanto a parte de software como
de hardware. Devido a novas tecnologias,
cada vez mais empresas vm se empe-
nhando em montar diversos ambientes,
sejam eles de produo ou no, que devem
ser monitorados constantemente. Alm
destes ambientes, cada sistema adotado
pela empresa pode interagir com uma base
de dados, o que eleva a responsabilidade
de monitoria por parte do DBA.
Neste artigo, veremos na prtica como
criar uma monitoria de base de dados a
partir de um cenrio que pode ser encon-
trado em uma empresa que utiliza bancos
de dados. Sero apresentadas tcnicas,
ferramentas, melhores prticas e algu-
mas dicas de como criar uma monitoria
conslanle, r-aliva e conhvel. Ahnal de
contas, monitorar corretamente as bases
de dados como vigiar o que acontece no
quintal da nossa casa: devemos sempre
estar alerta para no sermos pegos des-
prevenidos em caso de problemas.
O cenrio
Antes de comear a falar sobre a moni-
toria, preciso entender bem o ambiente
na qual ela ser aplicada. No cenrio
adotado neste artigo, uma empresa
possui 50 servidores com o SQL Server
inslalado em diversas hliais esalhadas
pelos estados do Brasil. Cada servidor
possui, em mdia, quatro bases de dados
que so utilizadas diariamente por di-
versos sislemas imlanlados nas hliais.
SQL54.indb 52 22.05.08 03:17:10
Ldiao 54 - SQL Magazine 53
DI A A DI A
Alm dos sislemas, cada hlial ossui
um link de acesso que a conecta com a
Internet. Apesar de estarem conectadas
com a malriz, cada hlial indeendenle
e no possui nenhum tipo de replicao
ou transferncia de dados entre si. Alm
disso, colaboradores externos utilizam
uma VPN (Virtual Private Network)
para se conectar remotamente rede
da empresa.
O nico DBA responsvel por este
arque de servidores hca localizado na
matriz da empresa no Rio de Janeiro.
A partir da matriz, o DBA consegue
se conectar diretamente em cada uma
das hliais como se eslivesse lrabalhan-
do localmente. Neste cenrio, o DBA
deve procurar montar uma monitoria
das bases de dados da melhor maneira
possvel para garantir que nenhuma das
hliais aresenle roblemas, uma vez que
os sislemas ulilizados nas hliais so de
misso crtica.
As hliais ossuem diversos lios de
sistemas, desde aqueles que controlam
a marcao de ponto e o acesso a catra-
cas at sistemas de telemarketing, ERP
(Enterprise Resource Planning) e a intra-
net da empresa. Obviamente, nenhum
destes sistemas funciona caso seus
respectivos bancos de dados apresentem
algum problema. Deste modo, preciso
manter os bancos de dados em pleno
funcionamento para evitar problemas
no uso dos sislemas nas hliais.
Cada servidor possui o Windows 2003
Enterprise e o SQL Server 2005 Standard
instalado. possvel realizar a conexo
remota aos servidores tanto pelo Ma-
nagement Studio como pelo Terminal
Services a partir da matriz da empresa
no Rio de Janeiro. O tamanho das bases
de dados varivel, mas na mdia o
lamanho hca em cerca de 5OO M de
dados. A conhgurao dos servidores
e a qualidade do link so diferentes
ara cada hlial. Cada servidor ossui
o hardware adequado para o que est
sendo utilizado.
Com base neste cenrio, vamos espe-
cihcar o que deve ser monilorado, as
ferramentas, tcnicas, procedimentos,
responsabilidades e aes necessrias
para manter cada um dos servidores e
suas bases de dados sob controle.
Quem monitora o que?
Antes de comear a elaborar a moni-
loria reciso dehnir alguns delalhes
no lcnicos. Mais esecihcamenle,
preciso definir as responsabilidades,
os itens a serem monitorados, at que
ponto certas tarefas devem ser encaradas
como monitoria ou no e quais aes
podem ser tomadas aps a deteco de
um problema.
O primeiro ponto a ser tratado pela mo-
nitoria a questo da responsabilidade.
natural que a atribuio de responsa-
bilidade sobre a base de dados seja do
DA, orm reciso dehnir um limile
neste ponto. Por exemplo, o DBA deve ser
responsabilizado se acabar o espao em
disco de um dos servidores? E se o link
enlre uma hlial e a malriz aresenlar
problemas, de quem a responsabilida-
de sobre esta ocorrncia?
Lnhm, o imorlanle aqui deixar claro
para todos os envolvidos na rea at que
ponto o DBA responsvel e exatamente
em que ponto outras equipes devem
assumir responsabilidades que lhes
comelem. Dehnir correlamenle quem
responsvel pelo qu, um passo na
direo certa para evitar a famosa ttica
de esquiva que muitos profissionais
tendem a adotar. Alm de definir as
resonsabilidades recomenda-se ohcia-
lizar esla dehnio ara evilar dores de
cabea futuras.
segundo onlo a ser dehnido o que
esecihcamenle deve ser monilorado. L
uma prtica comum dividir esta tarefa
em diversos nveis para facilitar tanto o
tratamento das ocorrncias como a di-
viso de equipes de suporte que tratam
esecihcamenle de um delerminado n-
vel. A Tabela 1 apresenta uma sugesto
Nvel de monitoria Descrio Itens a serem monitorados Equipe
Primeiro nvel
Primeiroatendimentoaousurio.
feitoumatriagempor problemae
encaminhadoparaos demais nveis
Apenas atendimento a problemas de
sistemas, hardware, link, software, etc
Suporte de primeiro nvel
Segundo nvel
Monitoria de hardware, sistema
operacional e link
Hardware em geral e status dos links
Equipe de infra-estrutura,
helpdesk e Redes
Terceiro nvel Monitoria de sistemas
Arquivos, servios, diretrios,
mapeamentos e itens de sistema
Equipe de desenvolvimento ou
suporte especfico de sistemas
Quarto nvel Monitoria de bancos de dados
Todos os itens relacionados a banco
de dados
Equipe de DBA
Tabela 1. Sugesto de nveis de monitoria
de nveis e equipes responsveis pelo
ambiente descrito no comeo do artigo.
A partir da sugesto de diviso dos
itens e das equipes apresentada na
Tabela 1, pode-se contar com uma es-
truturao das equipes em relao s res-
ponsabilidades e suas tarefas. A diviso
de equipes apresentadas na Tabela 1
aenas sugesliva e deve ser modihcada
de acordo com o funcionamento e proce-
dimentos internos de cada empresa.
Aqui cabe uma observao: quando
possvel, deve-se procurar separar os
responsveis pela monitoria daqueles
rohssionais que resolvem roblemas
no dia a dia ou que desenvolvem siste-
mas (programadores, analistas, etc). O
motivo desta separao alcanar uma
monitoria dedicada que possa detectar
problemas antes que eles surjam ou no
exato momento que eles apaream, ao in-
vs de sobrecarregar oulros rohssionais
atribuindo-lhes outras tarefas.
Para se obter um controle melhor no
atendimento ao usurio, recomenda-
se a adoo de um procedimento para
o controle de solicitaes de servio
(ou chamadas) ao DBA e s equipes
relacionadas. Este tipo de controle evita
problemas de comunicao entre quem
solicitou e quem realiza uma tarefa. Dei-
xar este controle apenas a cargo do envio
de e-mails um primeiro passo, mas
investir em um sistema para controlar
o acesso s pessoas algo fundamental,
uma vez que este procedimento est
diretamente relacionado com as regras
dehnidas no SLA (Service Level Agree-
ment). Obviamente, este tipo de controle
deve ser utilizado de forma sensata,
pois existem diversos tipos de solici-
taes que podem exigir tratamentos
SQL54.indb 53 22.05.08 03:17:12
54 SQL Magazine - Monitoramento de base de dados
diferentes, como apenas uma olhada no
estado de um servidor. Mais uma vez, a
idia aqui estabelecer um mecanismo
de controle tanto para quem solicita a
tarefa como para quem a executa.
Recursos para a monitoria
Uma vez que os itens e as responsabili-
dades de quem realiza a monitoria foram
dehnidos, odemos comear a falar da
parte tcnica. No nosso exemplo o DBA
est em um mundo Windows, ou seja,
todo o parque utiliza um ambiente ni-
co, o que nem semre reele a realidade
das empresas. A partir deste cenrio
podemos comear a avaliar algumas
ferramentas teis para auxiliar a tarefa
de monitoria.
Neste ponto, importante lembrar
que mesmo com diversas ferramentas
nunca devemos nos esquecer de dehnir
corretamente procedimentos, processos,
e responsabilidades de acordo com a
poltica interna da empresa. Em geral
fcil atribuir problemas ferramenta
quando algo no d certo, enquanto a
verdadeira causa no tcnica e sim
falhas no processo ou na execuo dos
procedimentos adotados.
Em termos de mercado j existem algu-
mas solues prontas para a monitoria.
Dentre as mais utilizadas podemos citar
o SCOM (System Center Operations
Manager) da Microsoft, o projeto open
source Nagios e o SpotLight da empresa
Quest Software. Aqui apresentaremos
apenas uma breve descrio de cada
uma destas ferramentas. O leitor que
quiser mais informaes pode consultar
os links na seo hnal desle arligo.
System Center Operations Manager
O SCOM, antigamente conhecido
como MOM - Microsoft Operations
Manager - um produto da Microsoft
utilizado para monitorar computadores
conectados rede. Muitos produtos da
Microsoft, como o AD (Active Direcotry),
o SQL Server e o Exchange podem ser
monitorados com o SCOM. A idia bsica
Figura 1. Console de administrao do SCOM
instalar um pequeno agente em cada
um dos computadores de modo que este
agenle verihque eriodicamenle os logs,
arquivos, conhguraes e oulros ilens
no computador e envie estas informa-
es para o servidor SCOM central, que
contm um painel administrativo pronto
para mostrar todas estas informaes.
Alm disso, pode-se estabelecer regras,
alertas, notificaes, filtros e outras
funcionalidades automticas. A Figura
1 apresenta um exemplo do console de
administrao do SCOM.
Nagios
O projeto open source Nagios utili-
zado principalmente para a monitoria
de servios de rede e do hardware de
servidores. Com uma interface voltada
para a Web, o Nagios exclusivo do mun-
do Unix e suas variaes, como o Linux.
Iara realizar monilorias esechcas ele
conta com uma grande comunidade de
desenvolvedores de plug-ins, que per-
mite a extenso deste projeto de modo
SQL54.indb 54 22.05.08 03:17:14
Ldiao 54 - SQL Magazine 55
DI A A DI A
a estender suas funcionalidades para as-
eclos esechcos de diversos bancos de
dados. Alm de permitir diversos tipos
de relatrio, este projeto destaca-se pela
sua alla exibilidade de conhgurao e
visualizao de informaes tticas e es-
tratgicas. A Figura 2 apresenta a pgina
de visualizao de servio do Nagios
sendo executada dentro do navegador
Netscape Nagivator.
SpotLight
A ferramenta SpotLight se destacou no
mercado de ferramentas de monitoria
devido sua inlerface grhca singular
e ao seu grande conjunto de recursos.
Diferentemente do SCOM ou do Nagios,
existem verses do SpotLight espec-
hcas ara o SQL Server, racle, Db2,
etc. Devido a estas verses o SpotLight
Figura 2. Pgina de visualizao de servios do Nagios
apresenta recursos para a observao de
delalhes esechcos ara cada banco de
dados. A grande vantagem de se utilizar
o SpotLight a tima integrao que
ele possui com o banco, permitindo a
observao de delerminadas conhgu-
raes que nenhuma outra ferramenta
permite. A Figura 3 apresenta uma tela
do SpotLight que traz a visualizao em
tempo real dos recursos de hardware de
um servidor.
Apesar de contarmos com algumas
solues prontas, muitas vezes pre-
ciso desenvolver uma tcnica ou solu-
o prpria de monitoria que mais se
encaixa nas necessidades da empresa.
Por exemplo: no nosso cenrio o DBA
possui uma necessidade grande de
enviar um determinando comando ou
instruo para todos os servidores SQL
Server do seu parque de uma vez s,
ois desla maneira hca mais fcil no
apenas monitorar, mas tambm replicar
conhguraes, usurios e oulros ob|elos
para todos os servidores.
A soluo encontrada para esta ne-
cessidade foi criar em um servidor da
matriz uma stored procedure que recebe
como parmetro a instruo que deve
ser executada. Este stored procedure se
conecta em cada um dos servidores, de-
vidamente cadastrados em uma tabela, e
envia a instruo. O script da Listagem
1 aresenla a dehnio da labela que
armazena os servidores e o cdigo fonte
da stored procedure chamada
A partir desta stored procedure o DBA
pode automatizar algumas tarefas, como
verihcar raidamenle se uma base de
dados est com o status Suspect ou se
SQL54.indb 55 22.05.08 03:17:16
56 SQL Magazine - Monitoramento de base de dados
Listagem 1. Tabela T8_SLPv|DOPLS e procedure PPOC_SLPv|DOPLS
PROC_SERVIDORES.
/* PRIMEIRO CRIANDO A TABELA COM OS SERVIDORES */
CREATE TABLE TB_SERVIDORES
(
LOCAL VARCHAR(200),
IP VARCHAR(100),
HOSTNAME VARCHAR(100),
LOGIN varchar(10) DEFAULT ,
SENHA VARCHAR(50) DEFAULT
)
/* INSERINDO UMA LINHA PARA CADA SERVIOR. PODE-SE CRIPOTOGRAFAR A SENHA POR
QUESTES DE SEGURANA */
INSERT TB_SERVIDORES(LOCAL,IP,HOSTNAME,LOGIN,SENHA)
VALUES(So Paulo Filial 1,10.10.1.1,SQL-FIL01, usr_fil01,kkkyyy777)
INSERT TB_SERVIDORES(LOCAL,IP,HOSTNAME,LOGIN,SENHA)
VALUES(Rio de Janeiro Matrix,10.10.1.2,SQL-MATRIX, usr_dba,abc123)
INSERT TB_SERVIDORES(LOCAL,IP,HOSTNAME,LOGIN,SENHA)
VALUES(Espirio Santo Filial 2,10.10.1.3,SQL-FIL02\SQL02,usr_fil,qwe123@)
/* INSERIR MAIS FILIAIS CONFORME NECESSIDADE */
/* A STORED PROCEDURE PROC_SERVIDORES PERCORRE A TABELA E EXECUTA A INSTRUO EM CADA
SERVIDOR CADASTRADO*/
CREATE PROCEDURE PROC_SERVIDORES @CMD VARCHAR(8000)
AS
BEGIN
/* CRIANDO AS VARIVEIS QUE ARMAZENARO OS DADOS DA TABELA */
DECLARE @HOST VARCHAR(100)
DECLARE @LOCAL VARCHAR(100)
DECLARE @LOGIN VARCHAR(2)
DECLARE @SENHA VARCHAR(50)
/* ABRINDO UM CURSOR PARA VARRER A TABELA.
DECLARE C_CMD CURSOR FOR
SELECT LOCAL, HOSTNAME, LOGIN,SENHA
FROM TB_SERVIDORES
OPEN C_CMD
FETCH NEXT FROM C_CMD
INTO @LOCAL, @HOST, @LOGIN, @SENHA
DECLARE @CMD_EXEC VARCHAR(8000)
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT LOCAL: + @LOCAL + - SERVIDOR: + @HOST
/* MONTANDO A INSTRUO QUE CHAMA O OSQL.EXE E SE CONECTA NO SERVIDOR REMOTO*/
set @CMD_EXEC = osql -S + @HOST + -U + @LOGIN + -P + @SENHA
set @CMD_EXEC = @CMD_EXEC + -q + @CMD +
/* EXECUTANDO A INSTRUO. O RESULTADO APARECER NA TELA */
exec master.dbo.xp_cmdshell @CMD_EXEC
FETCH NEXT FROM C_CMD
INTO @LOCAL, @HOST, @LOGIN, @SENHA
END
/* FECHANDO E DESALOCANDO O CURSOR */
CLOSE C_CMD
DEALLOCATE C_CMD
END
algum tamanho de transaction log est
perigosamente alto.
Antes de chamar a procedure PROC_
SERVIDORES preciso cadastrar cada
um dos servidores corretamente na
tabela TB_SERVIDORES. Uma vez que
os servidores estejam cadastrados, basta
chamar a stored procedure passando o
comando que se deseja executar como
parmetro. Por exemplo: o DBA deseja
saber se todos os servidores SQL Server
foram ajustados corretamente para o
horrio de vero. Basta ele executar a
seguinle chamada ara verihcar raida-
mente o horrio de cada servidor:
EXEC PROC_SERVIDORES SELECT GETDATE()
Para facilitar ainda mais a monitoria o
DBA pode agendar um job no servidor
da matriz de modo que periodicamente
esta stored procedure seja executada para
monitorar objetos que sofrem muitas
mudanas, como o tamanho do transac-
tion log. Deste modo, pode-se guardar
o resultado do job em um arquivo para
verihcar osleriormenle qual foi o resul-
tado da execuo. Alm disso, pode-se
fazer uso de instrues SELECT que
ermilam verihcar diversos slalus do
servidor, como o resultado de execuo
de jobs, data hora e tamanhos de backups
realizados, etc. Basta escrever a instruo
SELECT que consulta tabelas de sistema
e envi-la como parmetro para a proce-
dure PROC_SERVIDORES.
Alm de executar comandos SQL em di-
versos servidores, o DBA tambm deve co-
nhecer novas tecnologias de monitorao.
Uma das principais tecnologias voltadas
para esta rea atende pela siga de WMI
(Windows Management Instrumentation).
Esta tecnologia permite consultar diversos
aspectos do hardware e do sistema ope-
racional por meio da programao e j
instalada junto com as edies Windows
para servidores. Vejamos um exemplo do
uso da tecnologia WMI.
O DBA deseja obter informaes a res-
peito do uso dos processadores de um
determinado servidor remoto. Para isso
ele no pode contar apenas com o seu
conhecimento de SQL, uma vez que a
linguagem limitada neste aspecto. Para
conseguir obter as informaes a respeito
dos processadores o DBA vai ter que
SQL54.indb 56 22.05.08 03:17:31
Ldiao 54 - SQL Magazine 57
DI A A DI A
Figura 3. Visualizao em tempo real dos recursos de hardware fornecida pela SpotLight
Listagem 2. Script que coleta informaes sobre o uso dos processadores em um servidor
Colocar o nome do servidor na varivel Computer
Computer = ltrim(SQL-FIL01)
Informaes para conectar remotamente
Set WshNtwk = WScript.CreateObject(WScript.Network)
Set procset = GetObject(winmgmts:{impersonationLevel=impersonate}!\\ & Computer & _ \
root\cimv2).InstancesOf (Win32_Processor)
checkedCPU = WshNtwk.ComputerName
Para cada processador trazer as informaes
for each System in ProcSet
Wscript.echo Computer Name = & Computer
Wscript.echo Architecture = & system.Architecture
Wscript.echo Caption= & system.Caption
Wscript.echo Manufacturer= & system.Manufacturer
Wscript.echo CPU Status= & system.CpuStatus
Wscript.echo Current Clock Speed= & system.CurrentClockSpeed
Wscript.echo Maximum Clock Speed= & system.MaxClockSpeed
Wscript.echo Load % = & system.LoadPercentage
next
criar um cdigo em VbScript (ou outra
linguagem) que utilize o servio WMI
instalado no servidor. Neste script deve
ser programada uma chamada ao servio
WMI que retorne informaes a respeito
de cada um dos processadores, inclusive
o uso em percentual que fornecido pelo
gerenciador de tarefas (Task Manager)
do Windows. A Listagem 2 apresenta
um script que coleta estas informaes a
partir do uso das classes do WMI.
Basta salvar o script da Listagem 2
no arquivo MONITORIA_CPU.VBS e
executar o seguinte comando para obter
as informaes a respeito do uso dos
processadores do servidor SQL-FIL01:
C:\CSCRIPT.EXE MONITORIA_CPU.VBS
SQL54.indb 57 22.05.08 03:17:32
58 SQL Magazine - Monitoramento de base de dados
Obviamente que para este script fun-
cionar preciso que o Windows 2003 do
servidor SQL-FIL01 permita o acesso aos
servios WMI e que o usurio e a senha
do Windows utilizada na estao que
executou o script sejam vlidos neste
servidor. Alm disso, a estao que exe-
cuta o script deve ser capaz de executar
arquivos VbScript sem problemas.
Apesar de ser um exemplo simples
podemos montar uma monitoria pode-
rosa a partir do uso do WMI. Em geral,
basta conhecer as classes do WMI e seus
parmetros para consultar quase todas
as conhguraes e aseclos do sislema
operacional e do hardware.
Alm da monitoria constante, existem
tarefas que o DBA deve ser capaz de re-
alizar sob demanda, pois elas permitem
a observao de um roblema esechco
que requer ateno especial. Um exemplo
disso a questo do desempenho: em
alguns ambientes este tipo de trabalho
no precisa ser constante, pois uma vez
que o sistema e o banco de dados j foram
olimizados no vale a ena hcar gaslando
recursos de monitoria constantemente.
Porm, conveniente saber como realizar
esta monitoria sob demanda.
No nosso ambiente o DBA vem rece-
bendo muitas reclamaes de lentido
em uma delerminada hlial. Iara idenlih-
car qual o problema ele resolve aplicar
uma monitoria durante dois dias em
Figura 4. Profiler mostrando as instrues SQL enviadas ao servidor
relao s instrues SQL enviadas para
o servidor. Nesta situao o mais reco-
mendado ulilizar a ferramenla Irohler
do SQL Server, pois ela j possui opes
prprias para este tipo tarefa.
O que o DBA faz criar um novo trace
no Irohler de modo que as inslrues
que so enviadas para o servidor sejam
ordenadas pela durao, como mostra
a Figura 4. Deste modo, o DBA pode
identificar rapidamente quais so as
instrues que esto causando lentido
apenas observando as colunas Duration
e TextData. De posse das consultas que
mais demoram, obtidas pelo trace do
Irohler, o DA ode enlrar em conlalo
com os desenvolvedores e tomar uma
atitude a respeito desta lentido.
Em resumo, existem vrias ferramen-
tas, tcnicas e aplicaes que podem ser
utilizadas para facilitar o trabalho de
moniloria. Cabe ao DA idenlihcar qual
destes recursos o mais recomendado
para o seu ambiente.
Ao a partir da monitoria
To importante quanto uma boa moni-
toria a ao que executada por meio
dela. Em muitas situaes a monitoria
deve ser a rimeira que idenlihca o ro-
blema e, em casos emergenciais, deve-se
tomar uma atitude o mais rpido possvel.
Cabe aos rohssionais envolvidos nesla
tarefa agirem de forma correta e rpida
para evitar maiores danos ao ambiente
quando um problema urgente aparece.
Este tipo de ao levanta a questo da
pr-atividade versus a reao. Com cer-
teza este um tpico muito importante
que deve ser tratado com muito cuidado.
Em outras palavras, o que quero dizer
que trabalhar de forma pr-ativa
muito importante, pois caso contrrio
melhor se acostumar a ser chamado de
madrugada para apagar incndios.
Em algumas ocasies, saber agir de
forma pr-ativa requer ultrapassar uma
grande barreira cultural. Aqui devemos
combater a mxima: em time que est
ganhando no se mexe. Ser pr-ativo
signihca agir anles do roblema. Agindo
desta maneira, efetivamente estamos
fazendo as mquinas trabalharem para
ns e no o contrrio.
Voltando para o nosso exemplo, o
DBA pode tomar vrias atitudes pr-
ativas para no ser pego de surpresa
com problemas no seu ambiente.
Um exemplo pode ser a utilizao de
alertas que observam o tamanho do
transaction log das bases de dados. Se
o transaction log de um banco de dados
no SQL Server estiver 100% preenchido
e no houver como crescer o tamanho
desle arquivo, o banco de dados hca
inutilizvel. Para evitar este problema,
o DBA pode criar um alerta que dispara
toda vez que o transaction log estiver
SQL54.indb 58 22.05.08 03:17:33
Ldiao 54 - SQL Magazine 59
DI A A DI A
com 75% preenchido. Este alerta, por
sua vez, dispara um job que faz uma
limeza do lransaclion log e nolihca o
DBA. Desta maneira, tem-se uma mo-
nitoria pr-ativa que est sempre um
passo a frente dos problemas.
Outro ponto importante diz respeito
s aes corretivas. Isto quer dizer que
a monitoria no deve ser esttica, ou
seja, ela deve ser dinmica ao ponto de
se adaptar a mudanas no ambiente. Isto
signihca imlemenlar aes correlivas
ara evilar roblemas que inlerhram
no correto funcionamento do banco de
dados e seus sistemas.
Mais um exemplo: o DBA pode ter que
apagar manualmente algum objeto que
o desenvolvedor criou dentro do banco
de dados Master por engano. Ao invs
de ficar removendo todos os objetos
manualmente todas as vezes que isso
ocorrer, ou hcar observando lodos os
objetos criados no Master, mais fcil
tomar uma ao corretiva e retirar a
permisso de criao de objetos no banco
de dados Master dos usurios.
Melhores prticas
Alm de todas as dicas apresentadas
neste artigo, no podemos esquecer
das melhores prticas que devem ser
adotadas em uma monitoria. Estas
melhores prticas envolvem a criao
de procedimentos, processos, tarefas e
responsabilidades.
Uma tima maneira de reforar o uso
das melhores prticas a documenta-
o. Indicar claramente em um nico
documenlo quais so as conhguraes,
acesso, permisses, ambientes e outras
informaes facilitam tanto o treinamen-
lo de novos rohssionais como reforam
as regras j existentes.
Um exemplo claro disso o gerencia-
mento de downtime dos servidores. No
cenrio utilizado neste artigo, o DBA
recisa hcar sabendo quando, como
e por que cada um 50 dos servidores
das hliais e da malriz foram reinicia-
lizados. Foi um problema de queda de
fora? Ou talvez tenha sido aplicado
um patch de segurana no Windows
que exigiu um boot no servidor? Esta
reinicializao foi devido a uma manu-
teno programada ou no?
Para controlar estas informaes o ideal
centralizar tudo em um ponto nico, como
uma planilha ou um sistema. Alm das
informaes sobre o tempo que o servidor
hcou ligado (uptime) e o tempo que o ser-
vidor hcou desligado (downtime), impor-
tante relacionar uma lista de ocorrncias
contendo o histrico de problemas junto
com as atitudes tomadas para resolv-los.
Isto pode parecer burocracia, mas uma
das melhores prticas que uma monitoria
pode adotar, uma vez que isso permite ra-
pidamente entender o estado atual de um
servidor ou de um banco de dados.
Alm destas prticas vale a pena citar
tambm o uso do bom senso e da boa
vontade. Estas duas qualidades so im-
prescindveis para quem trabalha com
Pgina com informaes sobre o SCOM: http://www.
microsoft.com/systemcenter/opsmgr/default.mspx
Pgina com informaes sobre o Nagios: http://www.
nagios.org/
Pgina com informaes sobre o SpotLight: http://www.
quest.com/spotlight-on-sql-server-enterprise/
Informaes sobre WMI: http://en.wikipedia.org/wiki/
Windows_Management_Instrumentation
Artigos Profiler Parte I & II, publicados nas edies 11 e 12
da SQL Magazine, respectivamente.
Referncias
Nota do DevMan
ERP: (do ingls Enterprise Resource Planning) so os
sistemas de informaes que integram todos os dados
e processos de uma organizao em um nico sistema.
A integrao pode ser vista sob a perspectiva funcional
(sistemas de finanas, contabilidade, recursos humanos,
fabricao, marketing, etc) e sob a perspectiva sistmica
(sistema de processamento de transaes, sistemas de
informaes gerenciais, sistemas de apoio a deciso,
etc). Estes sistemas envolvem a parte administrativa
da empresa e geralmente so de misso crtica, pois
envolvem processos fundamentais para o funcionamento
da empresa.
SLA: Um Acordo de Nvel de Servio (ANS ou SLA, do
ingls Service Level Agreement) a parte do contrato de
servios entre duas ou mais entidades no qual o nvel da
prestao de servio definido formalmente. Este contrato
deve deixar claro quais servios esto sendo oferecidos
(servios especficos) e o nvel de cada servio (horas
de funcionamento, downtime, horrio do suporte etc).
Geralmente o SLA colocado na forma de um contrato que
deve ser assinado no momento da assinatura do contrato
do servio. Para banco de dados, em particular, pode-
se utilizar um SLA interno, onde o DBA se compromete
a dar algum tipo de retorno (feedback) ao solicitante.
Notem que este retorno no quer dizer, necessariamente,
a resoluo do problema ou o conserto, mas sim que o DBA
est ciente da solicitao. Na prtica, o termo usado no
contexto de tempo de entregas de um servio ou de um
desempenho especfico.
VPN: Uma Rede Privada Virtual (Virtual Private Network -
VPN) uma rede de comunicaes privada normalmente
utilizada por uma empresa ou um conjunto de empresas
e/ou instituies, construda em cima de uma rede de
comunicaes pblica (por exemplo, a Internet). O trfego
de dados levado pela rede pblica utilizando protocolos
padro, geralmente seguros por criptografia. Atualmente
muitas empresas vm utilizando VPNs para permitir que
seus colaboradores possam acessar a rede interna da
empresa onde quer que eles estejam, pois basta possuir
um acesso internet para se conectar VPN e acessar
qualquer servio remotamente como se o colaborador
estivesse dentro da empresa.
D seu feedback sobre esta edio!
A SQL Magazine tem que ser feita ao seu
gosto. Para isso, precisamos saber o que
voc, leitor, acha da revista!
D seu voto sobre este artigo, atravs do link:
www.devmedia.com.br/sqlmagazine/feedback
D

s
e
u
Feedbac
k
s
o
b
r
e
e
s
t
a
e
d i o
monitoria, pois caso contrrio esta tarefa
se torna maante, passiva e no traz o
resultado esperado. E o pior: as pessoas
odem erder a conhana na moniloria
a ponto de duvidar se ela est ou no tra-
zendo algum benefcio para a empresa.
Concluso
Este artigo apresentou os principais
fatores que devem ser considerados
quando se deseja criar uma monitoria
de banco de dados. Foram apresentadas
tcnicas, ferramentas, melhores prticas
e algumas dicas de como criar uma mo-
niloria conslanle, r-aliva e conhvel.
Alm disso, o artigo tambm apresentou
algumas sugestes a respeito da organi-
zao de pessoal, sempre evidenciando
que existem diversas maneiras de
proceder de acordo com o que mais
adequado para o ambiente.
Apesar de todas as aes que foram
aresenladas nesle lrabalho, reciso hcar
ciente que problemas sempre vo aconte-
cer e que devemos estar preparados para
resolv-los da melhor maneira possvel de
acordo com os recursos disponveis.
SQL54.indb 59 22.05.08 03:17:38
60 SQL Magazine - Trabalhando na pratica com partioes no MySQL 5.l
Trabalhando na Prtica com
Parties no MySQL 5.1
Giuseppe Maxia
um desenvolvedor de Garantia de Qualidade na
equipe da comunidade MySQL. Ele analista de
sistema com 20 anos de experincia em TI, e tem
trabalhado como consultor e projetista em banco
de dados por vrios anos.
[ Banco de dados ]
E
ste artigo explica como avaliar
o desempenho de um banco de
dados com muitos registros no
MySQL 5.1, apresentando as vantagens
do uso de parties.
O banco de dados de teste a ser utiliza-
do neste artigo utiliza dados publicados
pela Secretaria de Estatsticas de Trans-
porte dos Estados Unidos (http://www.
bts.gov/). At 2007, os dados consistiam
em aproximadamente cerca de 113 mi-
lhes de registros (7.5 GB de dados + 5.2
GB de ndice).
Obtendo e carregando os dados
Os dados para este artigo foram
obtidos da Secretaria de Estatsticas
de Transporte (http://www.transtats.
bts.gov/Tables.asp?DB_ID=120&DB_
Name=Airline%20On-Time%20Perfor-
mance%20Data&DB_Short_Name=On-
Time). Os dados esto disponveis
como um arquivo CSV para download.
Os detal hes de sua obteno, con-
figurao da estrutura dos dados e
carregamento dos dados so explica-
dos na Nota DevMan 1.
Definio do problema
Estaremos a partir de agora trabalhan-
do em um cenrio onde os testes afetam
o banco de dados que por sua vez bem
maior que a quantidade de memria
RAM no servidor. Alm disso, os ndices
so maiores que a quantidade de RAM.
O servidor usado para este exerccio
tinha 4 GB de RAM, e o tamanho dos
ndices acima de 5 GB.
raciocnio or lrs desla esecihca-
o que este data warehouse possui
colees de dados que esto comple-
tamente alm de qualquer quantidade
de memria RAM que possamos even-
tualmente instalar, ocupando muitos
terabytes de armazenamento.
No armazenamento de bancos de da-
dos normais, especialmente para OLTP
(Online Transaction Processing), os ndices
so postos em cache na memria RAM
para permitir recuperaes de registros
SQL54.indb 60 22.05.08 03:17:42
Ldiao 54 - SQL Magazine 61
PRI MEI ROS PASSOS EM BANCO DE DADOS
Nota do DevMan
Nota DevMan 1. Criando o banco de dados
Objetivo
Testes de desempenho ou de novas funcionalidades normalmente
requerem uma grande coleo de dados. Criar tais dados nem
sempre uma opo. Voc pode facilmente gerar registros de
dados atravs de repetio, mas isso no o mesmo que utilizar
dados vindos do mundo real. Nessa nota ser explicado como
obter dados de uma grande coleo de dados a partir de uma
fonte confivel.
Requisitos do sistema
As instrues nesta nota so compatveis para um SO Unix. Elas
tm sido testadas em diferentes opes de Linux e no Mac OS
X 10.4.
Construir o banco de dados de teste requer alguma capacidade
de armazenamento.Dependendo da mquina que voc escolher,
os requisitos de armazenamento variam entre 2 e 17 GB.
O exemplo apresentado a seguir utiliza um buffer de memria
dedicada de 2 GB.
Fonte
Os arquivos usados para este artigo so providos pela Secretaria
de Estatstica de Transportes.Os dados esto empacotados como
arquivos CSV. Para obter estes dados, voc pode utilizar o script:
#!/bin/sh
mkdir flightstats
cd flightstats
BASE_NAME=On_Time_On_Time_Performance
BASE_URL=http://transtats.bts.gov/Download/$BASE_NAME
Y=1987
for M in `seq 7 12`
do
echo $M
wget ${BASE_URL}_${Y}_${M}.zip
done
for Y in `seq 1988 2006`
do
echo $Y
for M in `seq 1 12`
do
echo $M
wget ${BASE_URL}_${Y}_${M}.zip
done
done
Y=2007
for M in `seq 1 7`
do
echo $M
wget ${BASE_URL}_${Y}_${M}.zip
done
Criando a estrutura de dados
A descrio da tabela para os arquivos baixados inclui 57 campos.
Desses, apenas 14 foram usados para a tabela de teste.
create table flightstats (
AirlineID int not null,
UniqueCarrier char(3) not null,
Carrier char(3) not null,
FlightDate date not null,
FlightNum char(5) not null,
TailNum char(8) not null,
ArrDelay double not null,
ArrTime datetime not null,
DepDelay double not null,
DepTime datetime not null,
Origin char(3) not null,
Dest char(3) not null,
Distance int not null,
Cancelled char(1) default n,
)
Quando dada, a chave primria uma chave simples composta.
primary key (FlightDate, AirlineID, Carrier, UniqueCarrier,
FlightNum, Origin, DepTime, Dest)
Carregando os dados na tabela
Uma vez que os dados foram salvos no servidor, voc precisa
carreg-los na tabela.Como nem todos os campos foram usados,
e algumas colunas precisam de alguma manipulao para
serem carregadas, voc precisa usar algumas funcionalidades
estendidas a partir do comando LOAD DATA INFILE:
# load.sql
load data local infile _FILENAME_ into table flightstats
fields terminated by , optionally enclosed by
ignore 1 lines
(
@Year, @Quarter, @Month, AirlineID, UniqueCarrier, Carrier,
FlightDate, @DayofMonth, @DayOfWeek, @Flights, FlightNum,
TailNum, @ActualElapsedTime, @CRSElapsedTime, @AirTime, @
ArrDel15, @ArrDel30, @ArrDelSys15, @ArrDelSys30, @ArrDelay,
@ArrTime,@ArrTimeBlk,@CRSArrTime,@DepDel15,@DepDel30,
@DepDelSys15, @DepDelSys30, @DepDelay, @DepTime, @
DepTimeBlk, @CRSDepTime, Origin, @OriginCityName, @
OriginState, @OriginStateFips, @OriginStateName, @
OriginWac, Dest, @DestCityName, @DestState, @DestStateFips,
@DestStateName, @DestWac, Distance, @DistanceGroup, @
TaxiIn, @TaxiOut, @WheelsOff, @WheelsOn, @Cancelled, @
CancellationCode, @Diverted, @CarrierDelay, @WeatherDelay, @
NASDelay, @SecurityDelay, @LateAircraftDelay)
SET ArrTime = concat(FlightDate, , left(@ArrTime,2),:, right(@
ArrTime,2), :00), DepTime = concat(FlightDate, , left(@
DepTime,2), :, right(@DepTime,2), :00), Cancelled=if(@
Cancelled != n and @Cancelled != y, n, @Cancelled), ArrDelay
= if(@ArrDelay is null or @ArrDelay =, 0, @ArrDelay), DepDelay
= if(@DepDelay is null or @DepDelay =, 0, @DepDelay)
;
show warnings;
--------------------------------------------------
# load.sh
if [ $1== ]
then
echo missing file name
exit
fi
F=$1
FN=`basename $1 .zip`
FN=$FN.csv
echo $FN
unzip $F $FN
FN=$FN perl -pe $BEGIN{$fn = $ENV{FN}}; s/_FILENAME_/
$fn/ load.sql | mysql -v -v -v -t flightstats
rm $FN
de forma mais rpida. Quando os dados
atingem tamanhos que no podem ser
contidos na memria RAM disponvel,
preciso usar uma abordagem diferente.
Uma das principais funcionalidades
do MySQL 5.1 o particionamento, uma
tcnica que divide a tabela em pores
lgicas para possibilitar recuperaes
mais rpidas.
Usar parties no MySQL 5.1 pa-
rece simples no incio, mas existem
algumas armadilhas que precisamos
estar atentos quando estamos confi-
gurando os dados para maximizar o
desempenho de um banco de dados.
Este artigo ir examinar os riscos e ofe-
recer alguns conselhos prticos para se
atingir os melhores desempenhos.
Viso geral sobre particionamento
A implementao do particionamento
no MySQL 5.1 bastante simples. Os
dados podem ser particionados por
intervalo, lista, hash e chave.
Neste artigo, iremos nos concentrar
no particionamento por intervalo, que
provavelmente o tipo mais interessante e
comum de uso para data warehousing.
Particionamento em MySQL possui
algumas restries que precisamos estar
atentos:
O valor do campo usado para parti-
cionamenlo deve ser um inleiro,
Se a tabela possui uma chave nica/
primria, a coluna de particionamento
deve ser parte desta chave.
A primeira limitao aquela que pos-
sui o maior impacto em nossa deciso
de projeto. Se a coluna que desejamos
usar para particionamento no do tipo
inteiro, precisamos usar uma funo
SQL54.indb 61 22.05.08 03:17:43
62 SQL Magazine - Trabalhando na pratica com partioes no MySQL 5.l
Listagem 1. Utilizando a funao LAP() para particonamento de colunas de data
CREATE TABLE by_year (
d DATE
)
PARTITION BY RANGE (YEAR(d))
(
PARTITION P1 VALUES LESS THAN (2001),
PARTITION P2 VALUES LESS THAN (2002),
PARTITION P3 VALUES LESS THAN (2003),
PARTITION P4 VALUES LESS THAN (MAXVALUE)
)
Listagem 2. Utilizando a funo TO_DAYS () para particonamento de colunas de data
CREATE TABLE by_month (
d DATE
)
PARTITION BY RANGE (TO_DAYS(d))
(
PARTITION P1 VALUES LESS THAN (to_days(2001-02-01)), -- January
PARTITION P2 VALUES LESS THAN (to_days(2001-03-01)), -- February
PARTITION P3 VALUES LESS THAN (to_days(2001-04-01)), -- March
PARTITION P4 VALUES LESS THAN (MAXVALUE)
)
Listagem 3. Pesultado da consulta tabela criada na Listagem 2.
show create table by_month\G
************************ 1. row ************************
Table: by_month
Create Table: CREATE TABLE `by_month`
`d` date DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 /*!50100
PARTITION BY RANGE (TO_DAYS(d))
(
PARTITION P1 VALUES LESS THAN (730882) ENGINE = MyISAM,
PARTITION P2 VALUES LESS THAN (730910) ENGINE = MyISAM,
PARTITION P3 VALUES LESS THAN (730941) ENGINE = MyISAM,
de transformao nela. Algumas res-
tries adicionais so aplicadas ao uso
de parties, como descrito no manual
no endereo http://dev.mysql.com/doc/
refman/5.1/en/partitioning-limitations.
html, porm no fazem parte do escopo
deste artigo e no sero tratadas.
A seguir iremos apresentar a constru-
o de particionamentos em diferentes
cenrios.
Usando colunas do tipo data
A criao de particionamento a partir
da utilizao de colunas de datas intro-
duz alguns desahos que so baslanle
relevantes de serem abordados. Como
o tipo de dados no suportado para
a criao de parties, a data deve ser
convertida em um valor inteiro. Alm
da lista de funes permitidas (http://dev.
mysql.com/doc/refman/5.1/en/partitioning-
limitations-functions.html), devemos levar
em considerao o fato de que apenas
duas funes do tipo data podem lidar
com a podagem de parties (ver Nota
DevMan 2) (http://dev.mysql.com/doc/
refman/5.1/en/partitioning-pruning.html).
Assim, se temos que lidar com colunas
de data, precisamos usar uma dessas
funes: YEAR ou TO_DAYS.
Quando usamos a funo YEAR(), o
particionamento facilmente interpre-
tvel e direto (ver Listagem 1).
O particionamento pelo ms uma
armadilha. No podemos usar a funo
MONTH() por duas razes:
Seriamos limitados a 12 parties, pois
a funo MNTH no inclui o ano,
A funo MONTH no otimizada
para podagem de parties, e dessa for-
ma o desempenho seria prejudicado.
Nota do DevMan
Nota DevMan 2. Podagem de parties
Definio
Esta nota discute podagem de parties, uma otimizao
que foi implementada para tabelas particionadas no MySQL
5.1.6. O conceito chave por trs de podagem de parties
relativamente simples, e pode ser descrito como No leia
parties onde no podem ser encontrados valores. Por
exemplo, suponha que voc tenha uma tabela particionada t1
definida por esta declarao:
CREATE TABLE t1 (
fname VARCHAR(50) NOT NULL,
lname VARCHAR(50) NOT NULL,
region_code TINYINT UNSIGNED NOT NULL,
dob DATE NOT NULL
)
PARTITION BY RANGE( region_code ) (
PARTITION p0 VALUES LESS THAN (64),
PARTITION p1 VALUES LESS THAN (128),
PARTITION p2 VALUES LESS THAN (192)
PARTITION p3 VALUES LESS THAN MAXVALUE
);
Considere o caso onde voc deseje obter resultados a partir de
uma consulta tal como:
SELECT fname, lname, postcode, dob
FROM t1
WHERE region_code > 125 AND region_code < 130;
fcil ver que nenhuma das linhas que sero retornadas no
estar nas parties p0 ou p3, ou seja, ns precisamos buscar
apenas nas parties p1 e p2. Se no atentarmos pra isso,
possvel gastar muito mais tempo e esforo para encontrar
linhas fazendo uma busca completa em todas as parties
da tabela. Esta forma de corte de parties desnecessrias
conhecida como podagem.Quando o otimizador pode fazer uso
da podagem de parties, que analisada automaticamente,
na execuo de uma consulta, a resposta pode ser bem mais
rpida que a mesma consulta em uma tabela no-particionada
contendo as mesmas definies de coluna e dados.
O conceito de podagem tambm pode ser aplicado a intervalos
curtos, os quais o otimizador pode converter em listas de valores
equivalentes. Por exemplo, no exemplo anterior, a clusula
WHERE pode ser convertida para WHERE region_code IN (125,
126,127,128,129,130).Ento o otimizador pode determinar que
os trs primeiros valores na lista so encontrados na partio p1 e
os prximos trs valores na partio p2, e que as outras parties
no contm valores relevantes e no precisam ser buscadas.
Importante
Este otimizador usado apenas se o tamanho do intervalo
menor que o nmero de parties. Considere esta consulta:
SELECT * FROM t4 WHERE region_code BETWEEN 4 AND 8;
O intervalo na clusula WHERE cobre 5 valores (4, 5, 6, 7, 8), mas
t4 tem apenas 4 parties. Isto significa que a consulta anterior
no pode ser podada.
Podagem pode ser usada apenas em colunas do tipo inteiro de
tabelas particionadas. Por exemplo, esta consulta na tabela t4
no pode usar podagem porque dob uma coluna do tipo DATE:
SELECT * FROM t4 WHERE dob >=- 2001-04-14
AND dob <= 2005-10-15;
No entanto, se a tabela armazena valores de ano em uma
coluna INT, ento a consulta tendo WHERE year_col >= 2001
AND year_col <= 2005 pode ser podada.
SQL54.indb 62 22.05.08 03:17:48
Ldiao 54 - SQL Magazine 63
PRI MEI ROS PASSOS EM BANCO DE DADOS
Assim, devemos usar outra funo que
otimizada para a podagem de parti-
es: TO_DAYS (ver Listagem 2).
O uso dessa funo mais difcil de ser
lido do que quando particionado pelo ano.
AListagem 3 apresenta o que seria gerado
para a tabela criada na Listagem 2.
Particionamento por funo,
busca por colunas
Um erro comum cometido ao usar ta-
belas particionadas com colunas do tipo
data consultar os dados pela mesma
funo usada para particionamento.
Por exemplo, se a tabela foi criada com
a clusula:
partition by range( YEAR(d) )
E sabendo que as funes YEAR e
TO_DAYS so otimizadas para podagem
de parties, parece ser mais lgico usar
uma query como:
SELECT count(*) FROM by_year
WHERE YEAR(d) = 2000; # <-- ERROR !!
Porm, dessa forma a podagem de
parties no atua, como podemos per-
ceber a partir do comando EXPLAIN
apresentado na Listagem 4.
A consulta est fazendo um full table scan
(vasculhando loda a labela). signihcado
de podagem de partio otimizada que
a busca usar parties quando tal coluna
usada na clusula WHERE. Assim, a
forma correta de consulta seria:
SELECT count(*) FROM by_year
WHERE d BETWEEN 2001-01-01 and
2001-12-31;
Agora podemos observar na Lista-
gem 5 que a podagem de partio est
sendo usada.
Isso mostra que a consulta no causa
um full table scan, pois ela usar apenas
uma partio.
Usando chaves primrias e ndices
Um dos problemas recorrentes ao
testarmos tabelas particionadas com
um grande conjunto de dados que
podemos no atingir a melhora de de-
sempenho que estamos esperando.
No endereo http://dev.mysql.com/
tech-resources/articles/performance-
partitioning.html, Robin Schumacher
apresenta seu primeiro artigo sobre
particionamento comparando tabe-
las sem chaves primrias. As tabelas
particionadas vencem a disputa em
busca de melhoria de desempenho sem
dihculdades. Lm nossos lesles, hzemos
uso de uma tabela com chave primria,
pois esse cenrio o mais provvel de
acontecer no dia-a-dia. Ento, quando
inicialmente comparamos dados com 113
milhes de linhas, foi usada uma tabela
com chaves primrias.
Isso foi um grande equvoco!
Uma chave primria em uma tabela to
grande cujos ndices no podem caber na
memria no ehcienle. bler regislros
de lais labelas signihca acessar o disco
frequentemente. Seu desempenho de-
pende completamente da velocidade de
disco e processador do servidor.
lhando o que os oulros rohssionais
fazem em projetos de data warehousing,
observamos que uma prtica comum
projetar grandes conjuntos de DW sem
qualquer ndice.
Desta forma, neste artigo iremos ver
tambm uma comparao de desempe-
nho entre tabelas particionadas com e
sem chaves primrias.
Mtodo de teste
Neste teste, queremos comparar o
desempenho de um grande conjunto de
dados usando mquinas de armazena-
mento MyISAM, InnoDB, e Archive. Para
cada mquina, foi criada uma tabela no-
particionada com chave primria (exceto
para archive) e duas tabelas particionadas,
uma por ms e outra por ano.
Cada topologia testada em uma
instncia dedicada do servidor MySQL,
ID armazenamento particionado registros tamanho observaes
Tempo de carregamento
(dual-Xeon server)
1 MyISAM nenhum 113 Milhes 13 GB com PK 37 min
2 MyISAM por ms 113 Milhes 8 GB sem PK 19 min
3 MyISAM por ano 113 Milhes 8 GB sem PK 18 min
4 InnoDB Nenhum 113 Milhes 16 GB com PK 63 min
5 InnoDB por ms 113 Milhes 10 GB sem PK 59 min
6 InnoDB por ano 113 Milhes 10 GB sem PK 57 min
7 Archive nenhum 113 Milhes 1.8 GB sem chaves 20 min
8 Archive por ms 113 Milhes 1.8 GB sem chaves 21 min
9 Archive por ano 113 Milhes 1.8 GB sem chaves 20 min
Tabela 1. Pesultado da execuao dos testes.
contendo apenas o banco de dados com
uma tabela. Para cada mquina, o servi-
dor foi iniciado, as consultas foram exe-
cutadas, os resultados foram registrados
e ento o servidor foi desligado nova-
mente para que outro teste pudesse ser
realizado (nessa ordem). As instncias
dos servidores foram criadas usando
MySQL Sandbox (ver Tabela 1).
Para comparar os efeitos das parti-
es em grandes e pequenos conjuntos
de dados, foram criadas mais nove
instncias, cada uma contendo menos
que 2 G de dados ara verihcar se os
resultados foram diferentes.
Os resultados foram registrados em
outra instncia de banco de dados para
possibilitar uma melhor comparao.
Assim, a qualquer momento durante
os testes, existiam duas instncias exe-
cutando: uma contendo os resultados e
outra sendo testada. As consultas usadas
para este teste foram de dois tipos:
Consultas agregadas:
SELECT COUNT(*)
FROM table_name
WHERE date_column BETWEEN start_date and
end_date
usca or um regislro esechco
SELECT column_list
FROM table_name
WHERE column1 = x and column2 = y and
column3 = z
Para cada tipo de consulta, foram geradas
queries para diferentes intervalos de dados.
Para cada intervalo, foi gerado um conjunto
de queries adicionais em datas adjacentes.
A primeira consulta para cada intervalo
fria, signihcando que lal inlervalo esl
sendo aenas conhgurado ara a rimeira
SQL54.indb 63 22.05.08 03:17:50
64 SQL Magazine - Trabalhando na pratica com partioes no MySQL 5.l
consulta efetiva. Consultas subseqentes no
mesmo intervalo so quentes, signihcando
que o intervalo j estava ao menos parcial-
mente carregado na cache. A lista de con-
sultas usadas para este teste est disponvel
para download em http://forge.mysql.com/
wiki/Queries_For_Partitioning_Test.
A seguir, sero apresentados os resul-
tados dos diferentes testes citados ao
longo deste artigo.
Tabelas particionadas com chaves
primrias
Vamos comear primeiramente com a
abordagem errada. O primeiro lote de
teste usou tabelas particionadas com uma
chave primria, a mesma usada na tabela
original. O tamanho total da PK era 5.5 GB.
Ao invs de melhorar o desempenho, PK
tornou as operaes mais demoradas.
Consultas com tabelas particionadas,
sobrecarregadas com a busca de ndice
atravs de um PK que no podem caber
em RAM (4 GB) tiveram desempenhos
pobres. Esta uma lio a ser lembrada.
Parties so teis, mas elas devem ser
usadas da forma correta. A Listagem
6 apresenta o resultado (em segundos)
para os testes usando a mquina de
armazenamento MyISAM.
A soluo estava visvel, mas ainda assim
demoramos a nos convencer. Veja os resul-
tados para o mesmo conjunto de queries
usando a mquina de armazenamento
ARCHIVE na Listagem 7.
Os resultados para a tabela particionada
por ms so melhores que aqueles obtidos
na tabela correspondente em MyISAM.
Mais comentrios sobre este fato sero
apresentados na continuidade do artigo.
Tabelas particionadas sem
chave primria
Visto que o desempenho em tabelas
particionadas usando chaves primrias
foi to ruim, decidimos no utilizar
chaves primrias. O fator decisivo
que a chave primria para esta tabela
maior que qualquer buffer de cha-
ve disponvel (e maior que qualquer
memria RAM disponvel). Portanto,
qualquer busca atravs de chave ir
usar o disco.
A nova abordagem foi um sucesso.
Usando apenas parties, sem chaves
Listagem 4. Usando explain para verificar a no otimizao da consulta.
explain partitions select count(*) from by_year where year(d) = 2001\G
************************ 1. row ************************
id: 1
select_type: SIMPLE
table: by_year
partitions: P1,P2,P3,P4
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 30123
Extra: Using where
Listagem 5. Usando explain para verificar a otimizao da consulta.
explain partitions select count(*)
from by_year
where d between 2001-01-01 and 2001-12-31\G
************************ 1. row ************************
id: 1
select_type: SIMPLE
table: by_year
partitions: P2
type: system
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 30123
Extra:
Listagem 6. Pesultados dos Testes com PK usando My|SAM.
+--------+-----------------+-----------------+-----------------+
| status | myisam sem part | myisam mes | myisam ano |
+--------+-----------------+-----------------+-----------------+
| frio | 2.6574570285714 | 2.9169642 | 3.0373419714286 |
| quente | 2.5720722571429 | 3.1249698285714 | 3.1294000571429 |
+--------+-----------------+-----------------+-----------------+
Listagem 7. Pesultados dos Testes com PK usando APCH|vL.
+--------+----------------+-----------------+-----------------+
| status |archive sem part| archive mes | archive anos |
+--------+----------------+-----------------+-----------------+
| frio | 249.849563 | 1.2436211111111 | 12.632532527778 |
| quente | 235.814442 | 1.0889786388889 | 12.600520777778 |
+--------+----------------+-----------------+-----------------+
Listagem 8. Pesultados dos Testes sem PK usando My|SAM.
+--------+------------------+------------------+------------------+
| status | myisam sem part | myisam mes | myisam ano |
+--------+------------------+------------------+------------------+
| cold | 2.6864490285714 | 0.64206445714286 | 2.6343286285714 |
| warm | 2.8157905714286 | 0.18774977142857 | 2.2084743714286 |
+--------+------------------+------------------+------------------+
Listagem 9. Consultas usadas para teste.
# query 1 -- aggregate by year
SELECT year(FlightDate) as y, count(*)
FROM flightstats
WHERE FlightDate BETWEEN 2001-01-01 and 2003-12-31
GROUP BY y
# query 2 -- aggregate by month
SELECT date_format(FlightDate,%Y-%m) as m, count(*)
FROM flightstats
WHERE FlightDate BETWEEN 2001-01-01 and 2003-12-31
GROUP BY m
SQL54.indb 64 22.05.08 03:17:52
Ldiao 54 - SQL Magazine 65
PRI MEI ROS PASSOS EM BANCO DE DADOS
primrias, conseguimos o que procur-
vamos: uma melhoria signihcanle no de-
sempenho. Tabelas particionadas por ms
obtiveram um ganho de desempenho de
70 a 90% (ver Listagem 8).
Para tornar a diferena mais visvel,
testamos com duas queries que deviam
tomar vantagem do mecanismo de poda-
gem de parties (ver Listagem 9).
Os resultados mostram um ganho de
desempenho de 30 a 60% para a tabela
particionada por ms e um ganho de 15
a 30% para a tabela particionada por ano
(ver Listagem 10), em relao tabela
no particionada.
O fator processador
Tivemos algumas surpresas quando
movemos os testes para um servidor
diferente. Os testes descritos acima fo-
ram levados a um servidor que usa uma
CPU Intel Dual Core 2.3 MHz. O novo
servidor bem mais rpido. Repetindo
os testes acima (Listagem 8), tivemos
uma surpresa (ver Listagem 11):
A tabela original, com chave primria,
mais rpida que as tabelas particiona-
das. Os tempos para tabelas particiona-
das so os mesmos obtidos no servidor
mais lento, porm o desempenho da
tabela original melhorou, tornando as
parties desnecessrias.
O que fazer? Visto que este servidor
toma vantagem dos ndices to bem,
optamos por adicionar um ndice na
coluna de particionamento nas tabelas
particionadas (ver Listagem 12).
Os resultados foram muito mais satis-
fatrios, com ganho de desempenho de
35% (ver Listagem 13).
Lies aprendidas
Teste de parties so uma experincia
cansativa. Melhorias no ganho de desem-
penho no uma operao trivial e deter-
minstica. necessrio passar s vezes por
um processo de tentativa e erro. Vamos
agora a algumas lies aprendidas:
No existe bala de prata
Aplicar uma mudana de partio para
uma tabela no garantia de melhoria
de desempenho. O ganho depende de
muitos fatores, tais como:
o A coluna usada ara arlicionamenlo,
o A funo usada para particionamen-
to, quando o tipo da coluna nativa no
um inleiro,
o A velocidade do servidor,
o A quantidade de memria RAM.
Realize diferentes testes e analise
bem os resultados antes de aplicar as mu-
danas para um sistema em produo
Dependendo da utilizao de um banco
de dados, podemos atingir um ganho de
desempenho enorme ou nada fazer efeito.
Podemos tambm ter uma reduo no
desempenho se no tivermos cuidado.
SQL54.indb 65 22.05.08 03:17:58
66 SQL Magazine - Trabalhando na pratica com partioes no MySQL 5.l
Listagem 10. Consultas usadas para teste.
+----------+-----------+-----------+-----------+
| query_id | sem part | part mes | part ano |
+----------+-----------+-----------+-----------+
| 1 | 97.779958 | 36.296519 | 82.327554 |
| 2 | 69.61055 | 47.644986 | 47.60223 |
+----------+-----------+-----------+-----------+
Listagem 11. Pesultados dos Testes da Listagem 8 no novo servidor.
+--------+-------------------+-------------+-----------------+
| status | myisam unpart |myisam month | myisam year |
+--------+-------------------+-------------+-----------------+
| frio | 0.051063428571429 | 0.6577062 | 1.6663527428571 |
| quente | 0.063645485714286 | 0.1093724 | 1.2369152285714 |
+--------+-------------------+-------------+-----------------+
Listagem 12. Script de criao das tabelas usadas no novo exemplo.
# original table
create table flightstats (
AirlineID int not null,
UniqueCarrier char(3) not null,
Carrier char(3) not null,
FlightDate date not null,
FlightNum char(5) not null,
TailNum char(8) not null,
ArrDelay double not null,
ArrTime datetime not null,
DepDelay double not null,
DepTime datetime not null,
Origin char(3) not null,
Dest char(3) not null,
Distance int not null,
Cancelled char(1) default n,
primary key (FlightDate, AirlineID, Carrier, UniqueCarrier, FlightNum, Origin, DepTime,
Dest)
)
# partitioned tables
create table flightstats (
AirlineID int not null,
UniqueCarrier char(3) not null,
Carrier char(3) not null,
FlightDate date not null,
FlightNum char(5) not null,
TailNum char(8) not null,
ArrDelay double not null,
ArrTime datetime not null,
DepDelay double not null,
DepTime datetime not null,
Origin char(3) not null,
Dest char(3) not null,
Distance int not null,
Cancelled char(1) default n,
KEY (FlightDate)
)
PARTITION BY RANGE ...
Listagem 13. Pesultados dos testes com lndice nas tabelas particionadas.
+--------+-------------------+-------------------+-------------------+
| status | myisam sem part | myisam ms | myisam ano |
+--------+-------------------+-------------------+-------------------+
| frio | 0.075289714285714 | 0.025491685714286 | 0.072398542857143 |
| quente | 0.064401257142857 | 0.031563085714286 | 0.056638085714286 |
+--------+-------------------+-------------------+-------------------+
Considere a seguinte situao: uma tabela
particionada pela data com intervalos de me-
ses pode atingir seu ganho de desempenho
dos sonhos se a consulta sempre inclui um
intervalo de datas. Em contrapartida, esta
consulta pode resultar em um full table scan se
ela no inclui um intervalo de datas.
Tabelas Archlte podem ser uma
soluo excelente
Tabelas do tipo Archive atingem um
ganho de desempenho enorme quando
particionadas. Novamente, isso depende
de sua utilizao. Sem particionamento,
qualquer consulta para uma tabela Archi-
ve um full table scan. Se tivermos dados
histricos que no mudam e precisamos
realizar consultas estatsticas por interva-
lo, a engine Archive uma escolha excelen-
te. Ela usa 10 a 20% do armazenamento
original. Alm disso, este tipo de tabela
possui um melhor desempenho para
consultas agregadas do que utilizando
as tabelas MyISAM ou InnoDB.
Novamente, tudo isso que estamos des-
crevendo algo que precisa de testes para
que se tenha uma noo exata do desem-
penho, pois diferentes cenrios resultam
em diferentes resultados. Por exemplo,
uma tabela MyISAM bem ajustada e
particionada funciona melhor que uma
tabela Archive correspondente, mas ela
precisa dez vezes mais armazenamento.
Concluso
Particionamento um item chave para
ganho de desempenho com bancos de
dados grandes. Neste caso, importante
alenlarmos ara o falo de que a dehnio
de grande depende do hardware que
tivermos disponvel.
Aplicar parties sem os devidos cuida-
dos no garantia de melhoria de desempe-
nho, mas com a devida ateno e realizando
testes e anlises dos resultados, ela pode se
tornar uma soluo perfeita.
D seu feedback sobre esta edio!
A SQL Magazine tem que ser feita ao seu
gosto. Para isso, precisamos saber o que
voc, leitor, acha da revista!
D seu voto sobre este artigo, atravs do link:
www.devmedia.com.br/sqlmagazine/feedback
D

s
e
u
Feedbac
k
s
o
b
r
e
e
s
t
a
e
d i o
SQL54.indb 66 22.05.08 03:18:27
SQL54.indb 2 22.05.08 03:12:30
08 - Giuseppe - MySQL.indd 68 29.05.08 02:13:28