indb 1
25/02/2010 14:30:12
10/28/09
8:41 AM
Projeto/
Modelagem
0904HammerBRFullx1a.pdf
6Vkiii
i>`
iviVi`
`i >V`i>`
Vocestcansadodetaxasdedistribuio
emanutenomuitoelevadas?
Vocgostariadeflexibilidadeparaalinharo
modelodelicenciamentodobancode
dadosaoseumodelodenegcios?
Vocnecessitadesuporteadequadoa
diferentesplataformas?
CM
MY
Vocjprecisoudeumacorreoou
novasfuncionalidadesnoprodutoantes
daprximaverso?
CY
CMY
Vocjprecisoudeumnvel
desuportediferenciado?
Vocgostariademelhores
ganhos/margens?
>ii-}?Uv>VVUnn
2009FairComCorporation
SQL73.indb 2
25/02/2010 14:30:14
Projeto/
Modelagem
Modelo PrFabricado
Primeiros Passos
em Banco de Dados
[ Mauro Pichiliani ]
Sumrio
Easy
[ Clailson de Almeida ]
Dia a Dia
Primeiros Passos em
Banco de Dados
Dia a Dia
Dia a Dia
Desafio SQL
Ol, eu sou o DevMan! Desta pgina em diante, eu estarei lhe ajudando a compreender com ainda
mais facilidade o contedo desta
edio. Ser um prazer contar com
sua companhia! Confira abaixo o
que teremos nesta revista:
62 Desafio SQL
[ Wagner Crivelini ]
2) JSP e Apache Derby-Parte 2- Realizando a validao do usurio e da senha digitados na tela de login.
3) JSP e Apache Derby-Parte 3- Concluindo a incluso, alterao e excluso de registros.
Vdeos
D
s
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
Feedback
eu
sobre e
s
edio
ta
SQL73.indb 3
A .NET 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 : haloosdt
25/02/2010 14:30:14
Expediente
Editorial
EDITORIAL
O
Ano 7 - 73 Edio 2010 - ISSN 1677918-5 - Impresso no Brasil
Corpo Editorial
Editor Geral
Rodrigo Oliveira Spnola
rodrigo@sqlmagazine.com.br
Sub Editores
Arilo Cludio Dias Neto, Eduardo Oliveira Spnola
e Ricardo Rezende
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:
Cristiany Queiroz Atendimento ao Leitor
www.devmedia.com.br/mancad/
Capa e Diagramao
Romulo Araujo
romulo@devmedia.com.br
(21) 3382-5038
Reviso e Superviso
Thiago Vincenzo - thiago.v.ciancio@devmedia.com.br
Coordenao Geral
Daniella Costa - daniella@devmedia.com.br
Na Web
www.devmedia.com.br/sqlmagazine/pagina.asp
Distribuio
Fernando Chinaglia Dist. S/A
Rua Teodoro da Silva, 907
Graja - RJ - 206563-900
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
bservamos atualmente um cenrio em que as organizaes esto cada vez mais dependentes de
sistemas de informaes. Um dos efeitos desta
dependncia o aumento das exigncias sobre requisitos
de qualidade e desempenho. Este ltimo especialmente
crtico em sistemas que manipulam uma quantidade muito grande de informaes.
Melhorar o desempenho de aplicaes pode envolver
diversos fatores. Um deles justamente o ajuste fino dos
bancos de dados onde as informaes so mantidas. Neste contexto, a SQL Magazine destaca nesta edio uma
matria muito interessante intitulada: Oracle Performance Diagnostics & Tuning. O artigo, de autoria de Ricardo
Proni, trata do mtodo de diagnstico de problemas de
desempenho em banco de dados Oracle baseado em
tempo. Tudo isto de forma bastante prtica.
Alm desta matria, a SQL Magazine traz nesta edio
outras matrias muito interessantes envolvendo assuntos
como PostgreSQL, SQL Server, Desafio SQL e Projeto de
Banco de Dados.
Assinatura
SQL73.indb 4
25/02/2010 14:30:20
SQL73.indb 5
25/02/2010 14:30:22
Seo Projeto/Modelagem
O
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 banco de dados do web site
iMasters. (http://www.imasters.com.br).
6
SQL73.indb 6
s funcionrios e colaboradores
de uma empresa precisam de
diversos recursos para realizarem as suas atividades. Dentre os principais recursos destacam-se pequenas
despesas e gastos com fornecedores
diversos que so comuns em situaes
onde o profissional deve se deslocar para
poder realizar o seu trabalho.
Devido natureza destas despesas e
caractersticas como baixo custo, aleatoriedade e independncia de um fornecedor
Projeto
Assim como qualquer outro recurso da empresa que disponibilizado para seus funcionrios e colaboradores, gerenciar
o reembolso dos gastos requer um modelo adequado para
organizar e controlar o caixa, pois caso contrrio h margem
para abusos e uso indevido dos recursos. Alm disso, preciso
armazenar informaes relacionadas aprovao, estimativa,
saldo, histrico, notas fiscais e outras entidades que compem
um modelo de banco de dados utilizado por um sistema de
controle de reembolso.
A partir deste cenrio este artigo apresentar como montar
um modelo de banco de dados que pode ser utilizado por
qualquer empresa que tenha um acordo de reembolso com seus
funcionrios ou colaboradores. O modelo conta com diversas
entidades que abordam os principais aspectos relacionados
ao controle e gerenciamento de despesas em uma empresa
que possui um departamento de vendas cujos funcionrios
precisam viajar para atender aos seus clientes.
Apesar de contemplar diversas situaes, o modelo apresentado neste artigo simples e pode ser estendido para diferentes
tipos de controle de reembolso ou adaptado visando a integrao com o mdulo de contas a pagar e receber de um software
ERP j customizado e implantado na empresa.
Entendendo o cenrio
Para entender como funcionar o controle de reembolso em
uma empresa preciso primeiro delimitar o escopo e escolher um cenrio tpico onde h a utilizao desta forma de
pagamento. Neste artigo vamos considerar uma empresa de
tamanho mdio que possui um departamento de vendas com
50 funcionrios ou colaboradores e que cada funcionrio deste
departamento possui um superior imediato. Neste cenrio
comum encontrar diversas oportunidades de vendas em
locais distantes, ou seja, preciso enviar os vendedores at o
local para uma visita aos clientes, fornecedores ou parceiros.
Na maioria das vezes o transporte controlado e pago diretamente pela empresa, porm as despesas com alimentao,
hospedagem, translado e outros itens devem ser pagos pelo
funcionrio e, dependendo do tipo de acordo de reembolso, a
empresa deve efetuar o ressarcimento dos custos no incio do
prximo ms com prazo mximo de 60 dias.
Antes de comear a detalhar como funcionar o modelo responsvel pelos dados do reembolso preciso definir como ele
funciona no dia a dia e explicar alguns detalhes. O primeiro
ponto a ser entendido diz respeito utilizao do reembolso.
Na empresa de exemplo nem todos os funcionrios possuem
acesso ao programa de reembolso. Isso quer dizer que apenas
aqueles que realmente precisem utilizar esta forma pagamento
tero acesso a ela. Alm disso, preciso formalizar a adeso de
um funcionrio a este recurso atravs de um contrato escrito
e assinado por ambas as partes (empresa e funcionrio) para
evitar problemas legais e tambm para coibir abusos.
Aps a assinatura do contrato um documento com algumas
regras prticas para o reembolso entregue ao funcionrio.
Este documento assume o formato de uma cartilha cujas regras
dizem que o funcionrio deve sempre utilizar o bom senso nos
25/02/2010 14:30:24
8
SQL73.indb 8
Projeto
Nota do DevMan
Figura 4. Quatorze entidades iniciais do modelo de controle de reembolso
25/02/2010 14:30:25
10
SQL73.indb 10
Projeto
11
25/02/2010 14:30:26
Figura 8. Modelo final contendo todas as entidades do banco de dados para controle de reembolsos
Nota do DevMan
Nota do DevMan
12
SQL73.indb 12
Feedback
eu
sobre e
s
D
s
Concluso
edio
ta
Software ERP: 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.
Projeto
PS- GRADUAO
Engenharia de Software:
Desenvolvimento Java
Engenharia de Software:
Desenvolvimento .NET
GRADUAO
Engenharia de Computao
Anlise e Desenv. de Sistemas
F ORMAES
Desenvolvedor Java
Desenv. Java: Sist. Distribudos
Gestor de TI
Desenvolvedor Web .NET 2008
MCITP Server Administrator
SQL Server 2008
r/esti
Acesse nosso site e conhea todos os nossos programas: www.infnet.edu.br/esti
TURMAS
NO RIO DE
JANEIRO
www.infnet.edu.br - cursos@infnet.edu.br - Central de Atendimento: (21) 2122-8800
13
25/02/2010 14:30:27
Seo Projeto/Modelagem
14
SQL73.indb 14
postgresql
O arquivo postgresql.conf
Para entender melhor os novos recursos do PostgreSQL,
precisamos conhecer alguns novos elementos includos no
arquivo de configurao do PostgreSQL: o postgresql.conf.
lgico que o postgresql.conf continua basicamente o
mesmo, exceto que ele se tornou maior, ele esta agora 65
linhas a mais. Um dos principais motivos para isso a configurao de certificado SSL, nova feature do PostgreSQL
que permite a utilizao de um certificado de segurana,
deixando assim o sistema mais seguro. Existem tambm
novidades no gerenciamento de I/O, conforme apresentado
na Listagem 1.
Esta configurao permite ao PostgreSQL realizar um
nmero n de operaes de I/O no disco por sesso. A
documentao sugere que este valor seja o nmero de HDs
disponvel para o PostgreSQL em um RAID do tipo 0 ou 1.
Funcionalidades
Windowing Functions
As Funes de Janelas ou agregados de janelas so um conjunto de functions que permitem que voc faa operaes como count, sum, e rank sobre
(over) um subconjunto de seus dados, isso sem agrupamento. Com as windows functions, podemos gerar um relatrio que demandava vrias consultas
com uma nica consulta. Estas windows functions tambm ampliam o suporte do PostgreSQL para aplicaes do tipo B.I. (Business Intelligense). Veremos
mais sobre como isso funciona mais adiante.
Expresses de tabelas comuns e consultas Conhecidas como CTEs (Common Table Expressions and Recursive Queries). O Principal uso da CTEs possibilitar subconsultas complexas sem criar tabelas
recursivas
temporrias e principalmente permitir a criao de consultas recursivas. Isso foi uma importante implementao para o PostgreSQL, pois esta capacidade
j existia no SQL Server desde a verso 2005.
ALTER SEQUENCE, VIEW, DATABASE
Foi melhorada a lgica do comando ALTER para cada tipo de objeto. Por exemplo, agora possvel reiniciar um sequence para voltar ao valor inicial atravs
de um simples ALTER SEQUENCE RESTART.
possvel agora adicionar novas colunas em uma view diretamente pelo comando ALTER VIEW ADD COLUMN
O Alter tambm ganhou poderes no DATABASE. Agora podemos mover fisicamente os objetos de um Banco de Dados para um novo tablespace. Isso
significa que em caso de falta de espao, via ALTER podemos mover uma tabela para outra partio, unidade, enfim, um lugar com espao disponvel.
Parmetros DEFAULT e Variveis para Functions possvel agora criar um nmero varivel de argumentos para uma function. Alm disso, possvel definir um valor padro para argumento em funes.
Assim, quando a funo for invocada e no passar argumentos para ele, o valor padro assume como argumento. Estas mudanas facilitam a migrao do
SQL Server e Sysbase para PostgreSQL.
Restaurao paralela
A ferramenta pg_restore agora pode restaurar dados e criar objetos paralelamente, ou seja, enquanto esta criando a tabela2, ele est subindo os dados da
tabela1. Isso gerou um aproveitamento melhor do hardware.
Segurana por Coluna
possvel nesta verso atribuir no somente segurana na Tabela (GRANTs/REVOKE) mas tambm por coluna.
Configurao Regional (locale) por DB
Melhoria de desempenho com ndices hash
Semi-joins e Anti-joins
Editor de Function
A configurao locale pode ser configurada individualmente por DB, ou seja, podemos ter um PT_BR.UFT8 para um banco e ISO para outro. Nas verses
anteriores, o LOCALE era configurado por cluster; ou na criao do cluster atravs com comando initdb ou via postgresql.conf.
ndices hash do PostgreSQL agora localizam linhas simples mais rpido do que os ndices B-Tree, e tornaram-se teis para a indexao de campos
identificao em alguns bancos de dados.
O Sistema agora consegue escolher o melhor mtodo de execuo para subconsultas semanticamente semelhantes. Desta forma, o desenvolvedor no
precisa verificar o que seria mais rpido: t1.c1 = t2.c2 ou t2.c2 = t1.c1 ?
Exemplo de Semi-join:
SELECT D.deptno, D.dname FROM dept D
WHERE EXISTS
(
SELECT 1 FROM emp E
WHERE E.deptno = D.deptno
)
ORDER BY D.deptno
Fim da configurao de max_fsm_page. Nas verses anteriores, o PostgreSQL usava a Shared Memory para alocar um mapa com informaes de pginas
vazias, ou seja, lugares que podem ser ocupados com novos registros, por exemplo aps um delete. Este Mapa agora dinmico e fica no prprio HD. A
grande vantagem disso reduzir I/O, ou seja, aumenta o desempenho da aplicao.
Agora o psql possui o /ef nome_da_function que abre um editor com a function para ser editada.
15
25/02/2010 14:30:28
Na Figura 1, estamos dizendo que o vo o elemento principal do modelo, atravs da tabela voos, pois s podemos
vender uma passagem area se existir um vo cadastrado.
Isso tambm justifica a coluna voo_num na tabela bilhete.
Observe na tabela voos a ltima coluna, qtd_disponivel: esta
coluna contm a quantidade de passagens que podem ser
vendidas para cada vo cadastrado. Alm disso, um vo s
pode existir se existir um avio disponvel para aquele vo,
por isso relacionamos a tabela voos com a tabela aviao.
Na Figura 2, ns atribumos os funcionrios (tabela funcionario) ao seu respectivo departamento (tabela departamento).
um relacionamento N para 1.
Nota do DevMan 1
Detalhando as Windows Functions
As Windowing functions so uma implementao de suma importncia introduzida na linguagem SQL:2003 (reviso realizada em 2003 na SQL ANSI). Esta
reviso da SQL permite funes de agregao sobre os dados. Estas funcionalidades permitem no somente ao PostgreSQL agradar aos desenvolvedores do SQL
Server e Oracle, como tambm veio para facilitar ao desenvolvedores de muitos
anos PostgreSQL.
Figura 1. Tabela voos e as tabelas auxiliares
16
SQL73.indb 16
postgresql
e a mdia por departamento de uma nica vez de uma forma extremamente simples! Tal consulta est descrita na Listagem 8.
A consulta ir gerar a mdia salarial por departamento, mas
como funciona isso? Antes da Windowing Functions, para gerar
um resultado que iremos ver a seguir, precisaramos usar uma
consulta muito complexa agrupada com GROUP BY, talvez
at mesmo um subselect ou outras tcnicas, isso dependeria
de como o desenvolvedor enxergasse a soluo. Mas agora,
quando usamos funes de agrupamento (como AVG, por
exemplo) podemos definir o mecanismo deste agrupamento
com a sintaxe OVER (PARTITION BY tabela). Veremos na
Listagem 9 como seria a sintaxe em portugus do cdigo SQL
apresentado na Listagem 8, para ficar mais claro.
A Windowing Functions s surtiu efeito porque existe um relacionamento entre as tabelas funcionrio e departamento, mas
podemos perceber claramente o vnculo entre os comandos
AVG() e o OVER(Partition By) que gera o agrupamento em
funo da tabela especificada. A consulta da Listagem 8 gera
o resultado apresentado na Figura 3.
17
25/02/2010 14:30:28
18
SQL73.indb 18
Vamos dar uma observada de perto nos registros de nmero 6 e 7, vo_num BZ-2010002 e BZ-2010003 que possuem
ambos a coluna conexo = 1. Isso indica que estes dois vos
saram do Rio de Janeiro para So Paulo e de l seguiram
o destino final, Bauru e Goinia, respectivamente. Vejam
como foi fcil gerar este mapa, mas como funciona isso? A
resposta recursividade! Ns geramos as possibilidade de
vos com sada de So Paulo e Rio de Janeiro e o PostgreSQL
se encarregou de gerar o resultado.
Com isso, atendemos a mais um pedido requerido
para o sistema. Vamos agora atender ao ultimo pedido
solicitado.
postgresql
Nota do DevMan 2
Consultas Recursivas Common Table Expression
As consultas recursivas eliminam boa parte da programao PL/PGSQL e lgica centralizada na camada Server ou Client. A soluo do item 2 ir depender da utilizao
deste nova implementao, e para esclarecer o funcionamento primeiro vamos entender como montar uma consulta recursiva, no mesmo molde dos primeiros passos
de recursividade quando estamos aprendendo a programar, fazendo um exemplo de
somatria recursiva:
WITH RECURSIVE soma_recursiva(parametro)
AS
( VALUES (1) UNION ALL SELECT parametro +1 FROM coisa WHERE parametro < 2 )
Antes do UNION ALL temos o VALUE (): Esta funo realiza o mesmo servio quando
usado dentro do INSERT, ou seja, define valores para os campos. Sendo assim, atravs
do VALUE() iremos definir os valores iniciais dos parmetros criados na CTE, porm podemos definir estes valores iniciais atravs de um SELECT, ou seja, s se usa o VALUE()
quando sabemos de fato os valores de incio para que nossa consulta recursiva funcione.
Como no exemplo acima, o valor inicial da CTE soma_recursiva tem VALUE 1 para a
varivel parmetro, e usamos a funo SUM() para increment-lo.
19
25/02/2010 14:30:29
SELECT func_substrai_qtd(BZ-2010001);
Existem estudos que demonstram superioridade de desempenho entre o PostgreSQL e bancos comerciais como o DB2,
SQL Server e Oracle. Em uma migrao que realizamos de
20
SQL73.indb 20
Feedback
eu
sobre e
s
Concluso
Links
D
s
dados do Oracle para o PostgreSQL, uma arquivo EDI de importao demorava 30 minutos para ser importado no Oracle,
j no PostgreSQL apenas 20 segundos. Entretanto, o Oracle
possua tantos recursos que para um projeto mais complexo
o PostgreSQL no atenderia. Desta forma, nesta nova verso o
PostgreSQL, alm de 5% mais rpido que a verso 8.3.8, ganhou
muitos recursos que permite ir mais longe. Existe a promessa
para que na verso 8.5 o PostgreSQL venha com ferramentas
nativas para Clusterizao como por exemplo REPLICAO
SINCRONA. Isso possibilita uma concorrncia muito grande
com o Oracle RAC, lembrando ainda da questo financeira j
que o PostgreSQL FREE.
Para apoiar na anlise mais prtica desta nova verso do
PostgreSQL, realizamos a modelagem e projeto de um banco
de dados de uma companhia area fictcia. Neste contexto, consideramos algumas situaes comuns de serem encontradas
no dia-a-dia de um DBA onde os novos recursos podem ser
empregados, e onde apresentam resultados muito interessantes, tornando as tarefas bastante simples.
edio
ta
www.devmedia.com.br/sqlmagazine/feedback
postgresql
21
25/02/2010 14:30:39
Seo Projeto/Modelagem
22
SQL73.indb 22
Preparao esta que vai desde a instalao da JVM (a mquina virtual Java),
passando pela configurao do PostgreSQL, at a instalao propriamente dita
da linguagem.
postgresql
A verso do PL/Java aqui discutida a 1.4.0, com o PostgreSQL na verso 8.3.7, em ambiente Linux (CentOS 5.2).
set PATH=%PATH%;%JAVA_HOME%\bin;%JAVA_HOME%\bin\client
Assim como no Linux, para esta configurao ficar permanente necessrio editar a varivel PATH na seo Variveis de
Ambiente, que est na guia Avanado das Propriedades do Sistema (boto direito do mouse em Meu Computador>Propriedades
do Sistema>Avanado>Variveis de Ambiente) (Figura 1).
No sistema operacional Windows, basta configurar a varivel de ambiente PATH, como mostrado abaixo, na linha de
comando do prompt do DOS.
23
25/02/2010 14:30:40
Neste caso, h diferena de verses, mas em nosso ambiente de teste, executando o CentOS 5.2, no houve conflito. Mas
se ocorresse, o problema poderia ser resolvido de quatro
maneiras diferentes, dependendo apenas das necessidades do administrador e habilidades na recompilao do
PostgreSQL:
Se possvel, utilizar uma nova verso do JRE que tenha
a mesma verso da libz.so. Esta a soluo mais adequada.
Infelizmente, para saber se a verso compatvel necessrio instalar o JRE e executar o utilitrio strings, ou verificar
alguma nota de liberao da verso do Java (release notes);
Modificar a varivel de ambiente do Linux, chamada de
LD_PRELOAD (ler Nota DevMan 1), para apontar para
a biblioteca libzip.so, do JRE. Isto forar o uso da verso
da biblioteca que est no JRE. Essa soluo far com que o
postmaster use a libzip.so no lugar da libz.so;
Reconfigurar o cdigo fonte do PostgreSQL com a opo
--without-zlib, recompilar e reinstalar o mesmo. Isto ir desabilitar todo o suporte de compresso do servio postmaster.
Para ter de volta o suporte, preciso recompilar novamente
o PostgreSQL, voltando tambm o conflito entre as verses
das bibliotecas de compresso;
Obter uma verso da libz.so que corresponda verso da
libzip.so, utilizada pelo JRE, e fazer uma reconfigurao na
execuo do servio do PostgreSQL para apontar para esta
nova verso da libz.so.
Nota do DevMan 1
LD_PRELOAD
uma varivel de ambiente que aponta para bibliotecas compartilhadas criadas
pelo usurio. Estas bibliotecas podem conter nomes de funes com os mesmos
nomes das funes do sistema operacional que se deseja sobrescrever, ou at mesmo, novas funcionalidades. utilizada quando desejamos colocar uma biblioteca
criada entre a chamada de um programa e a sua prpria biblioteca, sem ter que
sobrescrever a biblioteca original. Por exemplo, pode-se usar a LD_PRELOAD para
sobrescrever uma funo da biblioteca dos mdulos de um leitor de carto smartcard para mostrar uma mensagem de erro traduzida, validaes de dados ou at
mesmo informaes teis para o usurio.
24
SQL73.indb 24
Download do PL/Java
Com os pr-requisitos verificados e o Java instalado no servidor
de banco de dados, podemos prosseguir com o download do PL/
Java. Os arquivos necessrios para a instalao da linguagem
procedural podem ser encontrados no pgFoundry, o site oficial
do grupo de desenvolvimento do projeto PL/Java, e de outros
projetos externos (add-ons) para o PostgreSQL (ver seo Links).
Acessando o site devemos clicar na seo Arquivos, onde
iremos encontrar os pacotes binrios de instalao da verso
1.4.0 do PL/Java (o arquivo pljava-i686-pc-linux-gnu-pg8.31.4.0.tar.gz). Esto disponveis instaladores para as verses
mais recentes do PostgreSQL (8.1, 8.2 e 8.3), para Linux 32 e 64
bits, e para Windows 32 bits. Todos os pacotes binrios para
download foram montados para utilizarem a configurao
padro de uma JVM.
Tambm disponibilizado o cdigo fonte do PL/Java para
compilao em outras plataformas.
O PL/Java pode ser compilado com o GNU GCJ (conforme
explicado na primeira parte deste artigo). Entretanto, no
existem pacotes binrios pr-compilados para GCJ, mas o
utilitrio make, no ambiente Linux, contm o necessrio para
a construo e compilao destes pacotes binrios.
postgresql
Configurao do PostgreSQL
Para que o mdulo PL/Java seja reconhecido e
funcione corretamente, necessrio configurar o
servidor PostgreSQL, modificando o arquivo postgresql.conf do diretrio /var/lib/pgsql/data.
Existem duas formas de fazer com que o PostgreSQL encontre os objetos e classes do PL/Java. A
primeira descompactar o pacote binrio dentro de
um diretrio de procura do servio postmaster (nome
do servio do PostgreSQL), como o diretrio data. A
outra forma dizer ao postmaster onde encontrar tais
objetos, atravs da varivel dynamic_library_path,
no arquivo postgresql.conf. A configurao default
desta varivel mostrada abaixo:
#dynamic_library_path = $libdir
25
25/02/2010 14:30:41
Parmetro
Descrio
classpath
Define o classpath que a JVM usa quando carrega a biblioteca inicial do PL/Java. Utilizado apenas quando no se usa o GCJ.
statement_cache_size
Define o tamanho do cache para Prepared Statements (ler Nota DevMan 2).
release_lingering_savepoints
Se true, savepoints em espera sero liberados na sada da funo, ou seja, se foi criado um savepoint em espera, dentro da funo, o mesmo poder ficar aguardando
o retorno do commit dos bancos de dados distribudos, mesmo depois da funo finalizar sua execuo. Se false, os savepoints sero desfeitos (rollback). Isto til
para transaes com servidores distribudos.
Define as opes de inicializao para a JVM, por exemplo:
pljava.vmoptions = -Xms64M Xmx128M -Xbatch
vmoptions
debug
Neste caso, estamos configurando a JVM para utilizar inicialmente 64 MB de memria, podendo atingir at 128 MB (opes Xms e Xmx, respectivamente). Estamos
dizendo tambm para a JVM desabilitar qualquer compilao em background (opo Xbatch).
Este parmetro segue o mesmo formato das opes de inicializao de uma JVM comum.
Se true, far com que o processo postgres fique em standby na primeira chamada linguagem Java, com o intuito de verificar, linha por linha, o cdigo interno do
PL/Java, na linguagem C. Portanto, esta varivel s til para debug do PL/Java se for necessrio verificar um bug no mdulo PL/Java ou no desenvolvimento de
novas funcionalidades.
Segue o mesmo princpio de debug de uma classe Java em uma IDE, como o Netbeans.
Nota do DevMan 2
Prepared Statements
um objeto da API Java que permite o desenvolvimento de templates de queries
SQL que podem ser reutilizadas para efetuar comandos iguais com diferentes valores
de parmetros. Essencialmente o que feito criar a query, que pode ser de qualquer
tipo (INSERT, UPDATE, etc.), deixando os valores das variveis indefinidos. Ento, podemos especificar valores para os elementos indefinidos antes de executar a query, alm
de podermos executar o mesmo comando vrias vezes, bastando trocar os valores das
variveis de entrada. Um exemplo de query que montada em um prepared statement SELECT * FROM CLIENTES WHERE CODIGO > ? AND CATEGORIA = ?.
A segunda forma de instalar a linguagem PL/Java utilizando um programa de deploy que nos permite instalar, reinstalar
e remover a linguagem da base de dados. Este programa j
disponibilizado pelo PL/Java e precisa que o usurio que o
est executando tenha privilgios de super usurio. Tambm
necessria a utilizao do driver JDBC do PostgreSQL no seu
classpath. Para verificar as opes do programa deploy, basta
executar o comando abaixo.
java -cp /var/lib/pgsql/pljava/deploy.jar:/var/lib/pgsql/pljava/
postgresql-8.3-605.jdbc4.jar org.postgresql.pljava.deploy.Deployer
26
SQL73.indb 26
postgresql
Opo
Descrio
Instala a linguagem procedural PL/Java na base de dados juntamente com as funes e tabelas que o PL/Java utiliza. A instalao
falhar se a linguagem j estiver criada.
Reinstala a linguagem procedural PL/Java na base de dados juntamente com as funes e tabelas que o PL/Java utiliza. Este comando
executar efetivamente um drop em todos os pacotes JAR que foram carregados na base de dados. Por isso ser necessrio carregar
novamente todos os JAR instalados.
Remove a linguagem procedural PL/Java da base de dados juntamente com as funes e tabelas que o PL/Java utiliza e todos os
JAR carregados.
-install
-reinstall
-uninstall
-user <user name>
Nome do usurio que ir se conectar a base de dados. O default o usurio do sistema operacional corrente.
-password <password>
-database <database>
O nome do banco de dados destino onde a linguagem PL/Java ser manipulada. O default a base com o mesmo nome do usurio
da conexo. Ou seja, se o comando for executado com o usurio carlos e sem especificao do banco, o PostgreSQL ir procurar uma
base de dados com o nome carlos.
Descrio
SCHEMA sqlj
LANGUAGE java
LANGUAGE javaU
SEQUENCE sqlj.jar_entry_entryid_seq
SEQUENCE sqlj.jar_repository_jarid_seq
SEQUENCE sqlj.typemap_entry_mapid_seq
TABLE sqlj.jar_repository
Tabela que armazena as informaes dos pacotes JAR das classes desenvolvidas pelo usurio.
TABLE sqlj.jar_entry
TABLE sqlj.classpath_entry
TABLE sqlj.typemap_entry
Tabela que armazena as informaes das classes que compem cada pacote JAR instalado. Possui uma
linha para cada classe, bem como uma coluna que guarda seu cdigo compilado (.class).
Tabela que armazena as informaes de configurao do classpath dos pacotes JAR dentro do servidor
de banco de dados.
Tabela que armazena as informaes de tipos complexos criados para utilizao com as funes em
PL/Java.
FUNCTION sqlj.java_call_handler
FUNCTION sqlj.javau_call_handler
FUNCTION sqlj.install_jar
FUNCTION sqlj.replace_jar
FUNCTION sqlj.remove_jar
FUNCTION sqlj.set_classpath
FUNCTION sqlj.get_classpath
FUNCTION sqlj.add_type_mapping
FUNCTION sqlj.drop_type_mapping
27
25/02/2010 14:30:41
Concluso
sobre e
s
A SQL Magazine tem que ser feita ao seu gosto. Para isso, precisamos
saber o que voc, leitor, acha da revista!
Objeto Sequence
Este objeto utilizado dentro do banco de dados para fazer uma espcie de
autoincremento, utilizando nmeros sequenciais positivos ou negativos para
uma coluna especfica, geralmente uma coluna de chave primria, ou quando uma
aplicao necessita utilizar valores numricos sequenciais em uma tabela. Esses
valores so gerados automaticamente pelo banco de dados.
Links
Site Oficial do PostgreSQL
http://www.postgresql.org/
Feedback
eu
edio
ta
D
s
Ao longo deste artigo podemos demonstrar como relativamente simples a configurao do servidor de banco de
dados PostgreSQL e a instalao da linguagem procedural
PL/Java.
Mais detalhes sobre as funes disponibilizadas pelo mdulo PL/Java sero apresentados no prximo artigo, onde
exemplificaremos algumas funes, bem como demonstraremos como so escritas as classes Java para utilizao com
o PL/Java. At a prxima.
Nota do DevMan 3
28
SQL73.indb 28
Seo Projeto/Modelagem
sql server
Seo Banco de Dados/Persistncia
I
Nilton Pinheiro
niltonpinheiro@msn.com
O artigo apresenta uma soluo para gerenciamento de bancos de dados do SQL Server a partir
de uma ferramenta que utiliza a Web como plataforma de execuo, chamada SQL Server Web Data
Administrator. O artigo descreve como instal-la,
configur-la e utiliz-la para o gerenciamento de
um banco de dados.
29
25/02/2010 14:30:48
No artigo de hoje ser apresentada esta ferramenta, descrevendo passo-a-passo como realizar sua instalao e configurao, alguns de seus principais recursos e como us-la para
executar algumas tarefas bsicas de administrao.
30
SQL73.indb 30
sql server
clique com o boto direito sobre a barra de tarefas do Windows e selecione a opo Propriedades (Properties) conforme
apresentado na Figura 5. Na janela de Propriedades da Barra de
tarefas e do menu Iniciar, selecione a guia Menu Iniciar, clique
sobre a opo Menu Iniciar clssico e depois sobre o boto
Personalizar... (Figura 6). Em Opes avanadas do menu Iniciar
(Figura 7) selecione a opo Exibir Ferramentas administrativas
e clique em OK para confirmar a configurao. A partir deste
momento o item Ferramentas Administrativas j dever estar
sendo apresentado no menu Iniciar Programas.
31
25/02/2010 14:30:48
6. Aps a ativao da extenso, expanda o n Web Sites e tambm Default Web Sites. Como apresentado na Figura 9, clique
com o boto direito sobre a pasta SqlWebAdmin e selecione a
opo Properties (Propriedades).
7. Na janela de Propriedades do site, selecione a guia ASP.
NET e no campo ASP.NET version selecione a verso
2.0.50727 e clique sobre o boto Ok (Figura 10). Caso esta
verso no aparea como uma opo para voc, certamente
32
SQL73.indb 32
sql server
Nota do DevMan 1
Figura 11. Janela de login do SQL Server Web Data Administrator com os
dados de logon
33
25/02/2010 14:30:49
34
SQL73.indb 34
Figura 16. Editando uma stored procedures no SQL Web Data Administrator
sql server
35
25/02/2010 14:30:51
Figura 23. Criando um login atravs do SQL Server Web Data Administrator
36
SQL73.indb 36
sql server
A SQL Magazine tem que ser feita ao seu gosto. Para isso, precisamos saber o
que voc, leitor, acha da revista!
Concluso
www.devmedia.com.br/sqlmagazine/feedback
sobre e
s
Figura 24. Criando um usurio com SQL Server Web Data Administrator
Feedback
eu
edio
ta
D
s
37
25/02/2010 14:30:53
Seo Projeto/Modelagem
Q
Vladimir Michel Magalhes
vladimir_magalhaes@yahoo.com.br
Bacharel em Cincia da Computao pela Universidade Federal do Rio Grande do Norte (UFRN),
trabalhou durante vrios anos como instrutor
de informtica do Senac/RN e atualmente
trabalha como Analista de Banco de Dados da
Universidade Potiguar (UnP), alm de ser consultor de empresas, com foco na rea de banco
de dados. DBA certificado Microsoft em SQL
Server 2005 e 2008, alm de outras certificaes.
http://vladimir-magalhaes.spaces.live.com/
38
SQL73.indb 38
sql server
a menor quantidade de I/O, j que a quantidade de Bytes armazenados ser menor, alm de um menor espao utilizado
para os backups.
O SQL Server dispe de uma srie de recursos, desde a
verso 2005, que permitem fazer melhor uso do espao em
disco, garantido uma razovel economia. Ao longo deste
artigo conheceremos um pouco sobre estes recursos de
compresso de dados.
39
25/02/2010 14:30:55
@CONTADOR = 1;
@QUANTIDADE = 30000;
@MENOR = 1
@MAIOR = 99
+
+
+
+
+
@MENOR),
@MENOR),
@MENOR),
@MENOR),
@MENOR),
0)
0)
0)
0)
0)
+
+
+
+
+
0.1,
0.1,
0.1,
0.1,
0.1
ET @CONTADOR += 1;
S
END
40
SQL73.indb 40
sql server
J a tcnica de dicionrio de pgina basicamente um dicionrio criado tambm na CI Structure, onde so armazenados
os valores com certa repetio dentro da coluna. O dicionrio
de pgina construdo em cima da estrutura de prefixos da
coluna, o que levar a uma situao onde provavelmente haver valores do dicionrio apontando para valores de prefixo
de coluna. Um exemplo deste funcionamento pode ser visto
na Figura 6.
41
25/02/2010 14:30:56
USE Compressao;
GO
CREATE TABLE Compressao(
C
ODIGO INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
N
OME CHAR(50)
);
GO
DECLARE @QUANTIDADE INT, @CONTADOR INT
DECLARE @NOME CHAR(50)
SET @CONTADOR = 1;
SET @QUANTIDADE = 30000;
WHILE @CONTADOR <= @QUANTIDADE
BEGIN
SET @NOME = (
MARI
+ CHAR(64+(@CONTADOR%26)) + CHAR(64+(@CONTADOR%26))
+ SANTOS
+ CHAR(64+(@CONTADOR%26)) + CHAR(64+(@CONTADOR%26))
);
I
NSERT INTO Compressao (NOME) VALUES (@NOME);
S
ET @CONTADOR += 1;
END;
42
SQL73.indb 42
sql server
Porcentagem de Compresso
Ingls
50%
Alemo
50%
Hindi
50%
Turco
48%
Vietnamita
39%
Japons
15%
43
25/02/2010 14:30:57
44
SQL73.indb 44
Notas
70%
40%
62%
38%, 21%
PAGE, ROW.
80%, 50%
PAGE, ROW.
52%
PAGE.
50%, 15%
PAGE, ROW.
81%
35%
PAGE.
sql server
40%-60%
2% - 3%
3%
1%
11%
Concluso
Links
Vardecimal
http://msdn.microsoft.com/en-us/library/bb508963(SQL.90).aspx
Blog do time do SQL Server Storage Engine
http://blogs.msdn.com/sqlserverstorageengine/archive/2009/08/16/update-on-datacompression-in-sql-server-2008-rtm.aspx
Criando tabelas e ndices com compresso
http://msdn.microsoft.com/en-us/library/cc280449.aspx
Estimando os ganhos com a compresso
http://msdn.microsoft.com/en-us/library/cc280574.aspx
SQL Server 2008 R2
http://www.microsoft.com/sqlserver/2008/en/us/r2.aspx
Feedback
eu
sobre e
s
D
s
Notas
PAGE. Aplicao Web OLTP. Grande nmero de transaes.
edio
ta
Impacto na performance
5%
45
25/02/2010 14:30:58
Seo Projeto/Modelagem
Os mtodos antigos
Com cerca de 20 anos de experincia profissional, Ricardo Portilho Proni Oracle ACE, e
j trabalhou em grande parte dos maiores
bancos de dados Oracle do Brasil.
atualmente o Team Leader do CES - Centro de Excelncia Solvo, unidade dedicada
s atividades de consultoria, arquitetura,
pr-venda e suporte 3o. Nvel da Solvo S/A,
empresa especializada na implementao
e suporte de ambientes de misso crtica e
atuao em toda a Amrica Latina.
Tambm Conselheiro do GPO, foi palestrante do V ENPO sobre Load Balance em RAC.
Possui as certificaes OCP 10g, OCE RAC,
OCE Linux, MCP, MCDBA, MCTS: SQL Server
2005, Certified MySQL DBA, e IBM DB2 Certified Database Associate.
46
SQL73.indb 46
Oracle
O mtodo correto
Antes de executar um ajuste no SGBD Oracle, em resposta a
um problema de desempenho, devemos ter um diagnstico correto. Sem um correto diagnstico, no faz sentido prosseguir.
O desempenho de processos computacionais medido por velocidade. Quanto mais rpido, melhor o desempenho. E quando
se trata de velocidade, o desempenho s pode ser medido pelo
TEMPO. O tempo a nica constante onde podemos nos basear
sobre o desempenho de um processo computacional.
Portanto, para um correto diagnstico de um problema de
desempenho, deve-se saber onde o tempo gasto.
Finalmente, para saber-se onde o tempo gasto no Oracle,
no h uma forma mais direta que observar os Wait Events
(Eventos de Espera).
Nota do DevMan 1
SGA
System Global Area (SGA) uma terminologia usada no SGBD Oracle que representa uma rea de memria compartilhada responsvel por armazenar todas as
informaes referentes aos processos do Oracle. Essa rea dividida em vrias outras reas de memria que cada instncia do banco de dados ocupa no SGA.
Os Wait Events so eventos de espera por recursos computacionais, fsicos (discos rgidos, memria, rede, etc.) ou lgicos
(latches, locks, etc.). Estes recursos so limitados, e so os nicos
limitadores do desempenho de um comando SQL. Se no houvesse espera por recursos computacionais, todos os comandos
SQLs seriam finalizados instantaneamente.
Os Wait Events do Oracle so implementados pela OWI, a
Oracle Wait Interface. Esta implementao mede as esperas
diretamente do kernel do Oracle, e no nova, foi introduzida
na verso 7.0.12. Desde ento, os Wait Events monitorados pela
OWI cresceram consideravelmente, de 104 Wait Events na 7.0.12,
para 220 no 8i, 400 no 9i, e mais de 800 no 10g. Este progresso
mostra como a prpria Oracle acredita e investe neste mtodo
de diagnstico de problemas de performance.
Sabem aquela telinha bonita de desempenho do Enterprise Manager, com um grfico legal? Pois , aqueles grficos nada mais so do
que os Wait Events do Banco de Dados. Mas, como eu prefiro o bom
e velho SQL*Plus, este artigo ir demonstrar como encontrar os
gargalos do banco de dados sem a ajuda do Enterprise Manager.
Traando um paralelo da OWI com a vida real, pense em
quanto tempo voc leva para ir de So Paulo ao Rio de Janeiro,
de avio. Embora o tempo de vo leve menos que 30 minutos,
no tempo total a viagem completa pode levar umas 6 horas:
necessrio ir at o aeroporto, comprar a passagem, fazer o Check
In, despachar a bagagem, etc.
Prosseguindo com a metfora, o avio o comando SQL, enquanto todas as outras tarefas necessrias para se completar a
viagem so os Waits Events.
Ento, se voc precisa otimizar este tempo de 6 horas, onde
mais fcil e produtivo otimizar? O processo pode ser otimizado em vrios pontos: comprando-se previamente a passagem,
levando apenas bagagem de mo, fazendo outro caminho para
chegar ao aeroporto, etc. Mas otimizar o tempo de vo o mais
difcil (e caro, pode ser necessrio trocar o avio), e o que surtir
menos efeito no tempo total da viagem. Mesmo se comprarmos
um Concorde, o tempo total da viagem diminuiria de 6 horas
para 5 horas e 45 minutos.
47
25/02/2010 14:30:59
48
SQL73.indb 48
era considerado lento pelo cliente, fica claro que o pior gargalo
do sistema causado pelo evento latch free (que ser melhor
explicado mais adiante), e em seguida o pior gargalo de I/O.
Para observar o SQL que est causando estas WAITs (troque
o 758 abaixo pelo SID que pegou no SELECT anterior), use
o SELECT demonstrado na Listagem 4.
Os Wait Events da Listagem 5 so relacionados a I/O (discos
rgidos) (Nota DevMan 2). Se estes Wait Events aparecerem
Listagem 2. Comando SELECT para verificar os Wait Events ociosos.
SQL> SELECT NAME
2 FROM V$EVENT_NAME
3 WHERE WAIT_CLASS = Idle
4 ORDER BY NAME;
NAME
---------------------------------------------------------------ASM background timer
auto-sqltune: wait graph update
class slave wait
cmon timer
DIAG idle wait
dispatcher timer
EMON slave idle wait
fbar timer
gcs remote message
ges remote message
HS message to agent
i/o slave wait
IORM Scheduler Slave Idle Wait
jobq slave wait
JOX Jit Process Sleep
JS external job
KSV master wait
LNS ASYNC archive log
LNS ASYNC dest activation
LNS ASYNC end of log
Logical Standby Apply Delay
LogMiner: builder idle
LogMiner: client waiting for transaction
LogMiner: generic process sleep
LogMiner: preparer idle
LogMiner: reader idle
LogMiner: reader waiting for more redo
LogMiner: slave waiting for activate message
LogMiner: waiting for processes to soft detach
MRP redo arrival
parallel recovery coordinator waits for slave cleanup
parallel recovery slave idle wait
parallel recovery slave next change
PING
pipe get
PL/SQL lock timer
pmon timer
pool server timer
PX Deq Credit: need buffer
PX Deq Credit: send blkd
PX Deq: Execute Reply
PX Deq: Execution Msg
PX Deq: Index Merge Close
PX Deq: Index Merge Execute
PX Deq: Index Merge Reply
PX Deq: Join ACK
PX Deq: kdcphc_ack
PX Deq: kdcph_mai
PX Deq: Msg Fragment
PX Deq: Parse Reply
PX Deq: Table Q Normal
PX Deq: Table Q Sample
PX Deq: Txn Recovery Reply
PX Deq: Txn Recovery Start
PX Deque wait
PX Idle Wait
rdbms ipc message
SGA: MMAN sleep for component shrink
shared server idle wait
simulated log write delay
single-task message
smon timer
Space Manager: slave idle wait
SQL*Net message from client
Streams AQ: deallocate messages from Streams Pool
Streams AQ: delete acknowledged messages
Streams AQ: emn coordinator idle wait
Streams AQ: qmn coordinator idle wait
Streams AQ: qmn slave idle wait
Streams AQ: RAC qmn coordinator idle wait
Streams AQ: waiting for messages in the queue
Streams AQ: waiting for time management or cleanup tasks
Streams capture: waiting for archive log
Streams fetch slave: waiting for txns
Oracle
Nota do DevMan 2
I/O
I/O uma sigla para Input/Output, em portugus E/S ou Entrada/Sada.
Este termo utilizado quase que exclusivamente no ramo da computao
(ou informtica), indicando entrada (insero) de dados por meio de algum cdigo ou programa, para algum outro programa ou hardware, bem
como a sua sada (obteno de dados) ou retorno de dados, como resultado
de alguma operao de algum programa, consequentemente resultado de
algum input.
83 linhas selecionadas.
Estes dois Wait Events tambm podem ser minimizados facilmente, aumentando-se o Cache (Nota DevMan 3) (parmetro DB_CACHE_SIZE), o que ir diminuir o acesso aos discos rgidos.
Agora, para termos uma viso mais completa das causas de
lentido do banco de dados, iremos fazer SELECTs nas outras
Listagem 3. Comando SELECT para verificar os Wait Events no ociosos das sesses atuais
SQL> SELECT SID, EVENT, SECONDS_IN_WAIT
2 FROM V$SESSION_WAIT W
3 WHERE EVENT NOT IN (SQL*Net message from client,
4
SQL*Net message to client,
5
pmon timer, smon timer,
6
rdbms ipc message, jobq slave wait,
7
rdbms ipc reply, i/o slave wait,
8
PX Deq: Execution Msg)
9 O
RDER BY SECONDS_IN_WAIT DESC;
SID
---------758
610
710
172
321
482
663
473
375
709
765
739
29
35
43
138
161
200
727
762
766
767
772
799
455
471
498
462
EVENT
SECONDS_IN_WAIT
--------------------------------------- --------------latch free
1
db file sequential read
1
latch free
0
buffer busy waits
0
buffer busy waits
0
buffer busy waits
0
buffer busy waits
0
buffer busy waits
0
buffer busy waits
0
buffer busy waits
0
buffer busy waits
0
buffer busy waits
0
db file sequential read
0
db file sequential read
0
db file sequential read
0
db file sequential read
0
db file sequential read
0
db file sequential read
0
db file sequential read
0
db file sequential read
0
db file sequential read
0
db file sequential read
0
db file sequential read
0
db file sequential read
0
db file sequential read
0
db file sequential read
0
db file sequential read
0
db file scattered read
0
548
604
655
669
677
722
152
48
266
213
223
400
405
458
352
366
374
387
408
447
668
715
504
516
580
607
221
333
322
262
257
241
232
228
175
167
658
db
db
db
db
db
db
db
db
db
db
db
db
db
db
db
db
db
db
db
db
db
db
db
db
db
db
db
db
db
db
db
db
db
db
db
db
db
file
file
file
file
file
file
file
file
file
file
file
file
file
file
file
file
file
file
file
file
file
file
file
file
file
file
file
file
file
file
file
file
file
file
file
file
file
scattered read
scattered read
scattered read
scattered read
scattered read
scattered read
scattered read
sequential read
scattered read
scattered read
scattered read
scattered read
scattered read
scattered read
sequential read
sequential read
sequential read
sequential read
sequential read
sequential read
sequential read
sequential read
sequential read
sequential read
sequential read
sequential read
sequential read
sequential read
sequential read
sequential read
sequential read
sequential read
sequential read
sequential read
sequential read
sequential read
sequential read
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
65 rows selected.
49
25/02/2010 14:31:00
Listagem 4. Comando SELECT para verificar SQL executado por uma sesso.
SQL> SELECT A.SQL_TEXT
2 FROM V$SQLTEXT A, V$SESSION B
3 WHERE A.ADDRESS = B.SQL_ADDRESS
4
AND A.HASH_VALUE = B.SQL_HASH_VALUE
5
AND B.SID = 754
6 ORDER BY PIECE;
Nota do DevMan 3
Cache
Na rea da computao, cache um dispositivo de acesso rpido, interno a um sistema, que serve de intermedirio entre um operador de um processo e o dispositivo de
armazenamento ao qual esse operador acede. A vantagem principal na utilizao de
uma cache consiste em evitar o acesso ao dispositivo de armazenamento - que pode
ser demorado -, armazenando os dados em meios de acesso mais rpidos.
Nota do DevMan 4
Perl
Perl uma linguagem de programao estvel e multiplataforma, usada em aplicaes
de misso crtica em todos os setores, sendo destacado o seu uso no desenvolvimento de
aplicaes web.Permite a criao de programas em ambientes UNIX, MSDOS,Windows, Macintosh, OS/2 e outros sistemas operacionais.Alm de ser muito utilizada para programao
de formulrios www e em tarefas administrativas de sistemas UNIX - onde a linguagem
nasceu e se desenvolveu - possui funes muito eficientes para manipulao de textos.
Perl uma das linguagens preferidas por administradores de sistema e especialmente
verstil no processamento de cadeias (strings),manipulao de texto e no pattern matching
implementado atravs de expresses regulares, alm de ser bastante adequada para o desenvolvimento de projetos utilizando uma metodologia gil.
A linguagem Perl j foi portada para mais de 100 diferentes plataformas e bastante
usada em desenvolvimento web, finanas e bioinformtica.
FROM V$EVENT_NAME
WHERE WAIT_CLASS = System I/O
ORDER BY 1;
NAME
---------------------------------------------------------------ARCH random i/o
ARCH sequential i/o
Archiver slave I/O
cell smart incremental backup
cell smart restore from backup
control file parallel write
control file sequential read
control file single write
db file parallel write
DBWR slave I/O
io done
kfk: async disk IO
ksfd: async disk IO
LGWR random i/o
LGWR sequential i/o
LGWR slave I/O
LNS ASYNC control file txn
Log archive I/O
log file parallel write
log file sequential read
log file single write
Network file transfer
recovery read
RFS random i/o
RFS sequential i/o
RFS write
RMAN backup & recovery I/O
RMAN Disk slave I/O
RMAN Tape slave I/O
Standby redo I/O
30 linhas selecionadas.
31 linhas selecionadas.
SQL> SELECT NAME
50
SQL73.indb 50
Oracle
Listagem 6. Comandos SELECT para verificar os maiores Wait Events das sesses atuais, e para verificar os Wait Events de toda a instncia
SQL> SELECT EVENT, SUM(TOTAL_TIMEOUTS)
2 FROM V$SESSION_EVENT
3 WHERE EVENT NOT IN (SQL*Net message from client,
4
SQL*Net message to client,
5
pmon timer, smon timer,
6
rdbms ipc message, jobq slave wait,
7
rdbms ipc reply, i/o slave wait,
8
PX Deq: Execution Msg)
9 GROUP BY EVENT
10 ORDER BY 2 DESC;
EVENT
SUM(TOTAL_TIMEOUTS)
---------------------------------------------- ------------------latch free
73351
io done
10958
undo segment extension
2509
enqueue
570
log file switch completion
232
log file sync
51
buffer deadlock
28
LGWR wait for redo copy
11
log buffer space
3
HS message to agent
0
SQL*Net break/reset to client
0
SQL*Net more data from client
0
control file sequential read
0
db file parallel write
0
db file sequential read
0
direct path read
0
process startup
0
log file single write
0
log file sequential read
0
log file parallel write
0
library cache load lock
0
imm op
0
direct path write (lob)
0
direct path write
0
direct path read (lob)
0
wait list latch free
0
row cache lock
0
refresh controlfile command
0
db file single write
0
db file scattered read
0
db file parallel read
0
control file parallel write
0
SQL*Net more data to client
0
async disk IO
0
buffer busy waits
0
35 rows selected.
SQL> SELECT EVENT, AVERAGE_WAIT, TOTAL_TIMEOUTS
2 F
ROM V$SYSTEM_EVENT
3 W
HERE EVENT NOT IN(SQL*Net message from client,
4
SQL*Net message to client,
5
pmon timer, smon timer,
6
rdbms ipc message, jobq slave wait,
7
rdbms ipc reply, i/o slave wait,
8
PX Deq: Execution Msg)
9 O
RDER BY TOTAL_TIMEOUTS DESC;
EVENT
AVERAGE_WAIT TOTAL_TIMEOUTS
-------------------------------------- ------------ -------------undo segment extension
0
8707775
latch free
2
1250783
enqueue
164
240635
PX Deq Credit: send blkd
86
138120
PX Idle Wait
194
30457
PL/SQL lock timer
202
15139
io done
1
10958
PX Deq: Table Q Normal
2
6152
virtual circuit status
2918
3887
9
5815
0
12
3
1
24
98
0
0
1
1
0
11
2
66
391
1
3
0
15
80
0
0
0
0
2
3
0
0
1
0
0
0
0
3
0
0
0
4
1
0
0
0
0
0
0
0
0
8
3
0
3
0
0
3
0
0
1
0
1181
0
24
0
6
3
0
2536
1943
1927
850
651
208
121
109
55
50
27
20
11
7
5
2
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
76 rows selected.
51
25/02/2010 14:31:00
Listagem 8. Script Perl para inserir nomes de um arquivo texto no banco de dados
Listagem 10. Comandos verificar os maiores Wait Events causados pelos Inserts
use strict;
use warnings;
use DBD::Oracle;
C:\Users\Ricardo>sqlplus / AS SYSDBA
system(time /T);
my $dbh = DBI->connect(dbi:Oracle:host=localhost;sid=TEST11GR1;p
ort=1523, SCOTT, TIGER, {RaiseError => 1, AutoCommit => 0});
my $sth;
open(PESSOAS, <person.tsv);
while ()
{
my $linha = $_;
chomp $linha;
my @pessoa = split(/\t/, $linha);
if ($pessoa[0] eq name) {next;};
$pessoa[1] =~ s/\/guid\///;
$pessoa[0] =~ s/\//g;
my $sql = INSERT INTO pessoas (nom_pessoa) VALUES
($pessoa[0]);
$sth = $dbh->prepare($sql);
$sth->execute();
}
$dbh->commit();
$sth->finish();
close PESSOAS;
system(time /T);
print INSERTs finalizados. Pressione ENTER.\n;
my $go = <>;
$dbh->disconnect();
exit;
52
SQL73.indb 52
Concluso
Neste artigo abordamos como diagnosticar e solucionar problemas de desempenho de forma precisa, utilizando a Oracle Wait
Interface. Embora a OWI seja o nico mtodo que voc precisa conhecer para executar um excelente diagnstico, de forma alguma
este artigo abordou todos os seus aspectos. Recomendo que voc
leia atentamente a documentao da prpria Oracle a respeito.
Algumas recomendaes importantes baseadas em minha
experincia que quero deixar aos leitores:
Observe os Wait Events de todo sistema ao qual tiver
acesso, mesmo que este sistema tenha um bom desempenho.
Sabendo como se comportam os Wait Events de um sistema
com boa escalabilidade, voc saber identificar um sistema
ruim quando se deparar com um, mesmo que o cliente no
esteja reclamando dele;
Aps o ajuste de desempenho, se o tempo do comando
SQL ficou satisfatrio, o processo de diagnstico deve ser
encerrado. No caia na tentao de eliminar todos os Wait
Events simplesmente porque voc pode elimin-los. Voc no
conseguir eliminar todos os Wait Events, aceite isso. Faa
o que for necessrio para que o tempo de execuo fique
satisfatrio para o cliente, e siga em frente.
Oracle
Nota do DevMan 5
Redo Logs
No ambiente do Oracle, Redo logs so arquivos em um formato proprietrio
que registram um histrico de todas mudanas feitas ao banco de dados. Cada
arquivo de Redo Log consiste de registros de Redo. Um registro de Redo, tambm chamado de entrada de Redo, possui um grupo de vetores de mudanas,
e cada um descreve ou representa uma mudana feita a um nico bloco no
banco de dados.
Por exemplo, se um usurio atualiza (UPDATE) um valor de salrio em uma
tabela contendo dados referentes a empregados, o SGBD gera um registro de
Redo contendo vetores de mudanas que descrevem as alteraes ao bloco
do segmento de dados da tabela. E se o usurio confirma ento a alterao
(COMMIT), o Oracle gera outro registro de Redo e lhe atribui um System Change Number (Nmero de Alterao de Sistema), ou SCN.
Listagem 14. Script Perl para inserir nomes de um arquivo texto no banco
de dados utilizando variveis Bind
use strict;
use warnings;
use DBD::Oracle;
system(time /T);
my $dbh = DBI->connect(dbi:Oracle:host=localhost;sid=TEST11GR1
;port=1523?, SCOTT, TIGER, {RaiseError => 1, AutoCommit =>
0});
my $sth;
open(PESSOAS, <person.tsv);
while ()
{
my $linha = $_;
chomp $linha;
my @pessoa = split(/\t/, $linha);
if ($pessoa[0] eq name) {next;};
$pessoa[1] =~ s/\/guid\///;
$pessoa[0] =~ s/\//g;
my $sql = INSERT INTO pessoas (nom_pessoa) VALUES (?);
$sth = $dbh->prepare($sql);
$sth->execute($pessoa[0]);
}
$dbh->commit();
$sth->finish();
close PESSOAS;
system(time /T);
print INSERTs finalizados. Pressione ENTER.\n;
my $go = <>;
$dbh->disconnect();
exit;
Listagem 16. Comandos verificar os maiores Wait Events causados pelos Inserts
SQL> SELECT EVENT, AVERAGE_WAIT, TOTAL_TIMEOUTS
2 FROM V$SESSION_EVENT
3 W
HERE SID = 142
4 O
RDER BY AVERAGE_WAIT;
EVENT
AVERAGE_WAIT TOTAL_TIMEOUTS
--------------------------- ------------ -------------latch: cache buffers chains
0
0
SQL*Net message to client
0
0
events in waitclass Other
,01
0
SQL*Net message from client
,02
0
log file sync
,64
0
Listagem 13. Comandos verificar os maiores Wait Events causados pelos Inserts
8 linhas selecionadas.
Wikipedia
http://www.wikipedia.org/
D
s
Feedback
eu
sobre e
s
EVENT
AVERAGE_WAIT TOTAL_TIMEOUTS
---------------------------- ------------ -------------latch: cache buffers chains
0
0
latch: row cache objects
0
0
SQL*Net message to client
0
0
events in waitclass Other
0
0
latch: shared pool
,02
0
SQL*Net message from client
,02
0
db file sequential read
,57
0
log file sync
,92
0
Referncias
edio
ta
53
25/02/2010 14:31:01
Seo Projeto/Modelagem
S
Tulio Rosa
tulio.rosa@hotmail.com
54
SQL73.indb 54
sql server
Cliente
tr_cliente_update
tr_cliente_delete
tr_cliente_insert
Cliente_Log
55
25/02/2010 14:31:04
56
SQL73.indb 56
sql server
-- Tabela
use TesteCDC
go
select
name,
i
s_tracked_by_cdc
from
sys.tables
where
is_tracked_by_cdc = 1
57
25/02/2010 14:31:05
Para realizar consultas nas tabelas de sistemas terminadas em _CT podemos tambm utilizar a funo (FN) cdc.
fn_get_net_changes_dbo_Fornecedor. Essa funo criada
no momento em que adicionamos a tabela Fornecedor no CDC.
A Listagem 10 demonstra a utilizao da FN.
Listagem 10. Usando a FN cdc.fn_get_net_changes_dbo_Fornecedor.
use TesteCDC
go
declare @from_lsn binary(10),
@to_lsn binary(10)
set @from_lsn = sys.fn_cdc_get_min_lsn(dbo_Fornecedor)
-- Menor data
set @to_lsn
= sys.fn_cdc_get_max_lsn() -- Maior data
select * from
cdc.fn_cdc_get_net_changes_dbo_Fornecedor(@from_lsn, @to_lsn, all);
58
SQL73.indb 58
Se observarmos a Figura 10, veremos que o primeiro resultado (tabela Fornecedor) retornou os registros que foram
inseridos. O segundo resultado retornou o mesmo contedo
da tabela Fornecedor mais algumas informaes adicionais.
Dentre estas informaes, as mais importantes so __$start_
lsn, que contm a data e a hora que a operao foi executada,
e __ $operation, que contm o tipo de operao.
sql server
Para visualizar a data que est no campo __ $start_lsn podemos fazer uso da funo sys.fn_cdc_map_lsn_to_time.
A Tabela 1 mostra o significado dos cdigos do campo
__$operation.
Cdigo
Descrio
Excluso
Insero
Antes da alterao
Aps a alterao
59
25/02/2010 14:31:06
from Fornecedor
from cdc.dbo_Fornecedor_CT
select
from
OBJECT_NAME(source_object_id) as Tabela,
O
BJECT_NAME(OBJECT_ID) as Tabela_CT,
d
dl_command as DDL,
d
dl_time as Data
cdc.ddl_history
use TesteCDC
go
-- Inserindo
Insert Fornecedor(Nome, Telefone,Estado) values
(Fabiola,5555,GO)
-- Alteracao
update dbo.Fornecedor set Estado = DF where ID_Fornecedor = 3
Para melhorar a visualizao do histrico (tabelas _CT), podemos criar uma stored procedure para formatar o resultado
destas tabelas. A Listagem 16 mostra o cdigo de criao da
SP. Ela recebe como parmetros o nome da tabela, a data inicial
60
SQL73.indb 60
sql server
Descrio
Inserido
Apagado
UA
UD
Demonstramos nesse artigo duas formas de armazenar informaes sobre as operaes (insert, update e delete) que ocorrem
nas tabelas, atravs de Triggers e CDC. Podemos utilizar essas
informaes para entender o que ocorreu na tabela e quando,
o que muito til em um processo de auditoria.
Imagine o seguinte cenrio: um funcionrio da empresa que
tenha acesso ao sistema de contas a pagar e receber altera de
forma fraudulenta o valor que a empresa tem a receber de um
determinado cliente. Atravs da utilizao dos recursos demonstrados nesse artigo possvel identificar quando foi feita
a alterao, por quem e ainda teremos condies de corrigir o
valor alterado, voltando ao valor inicial.
Para concluir, vale destacar que a utilizao dos recursos de
triggers ou do CDC aumentaro o consumo de recursos do
servidor onde est instalado a instncia do SQL Server. Por isso,
tenha cuidado ao utilizar estes recursos e evite que o desempenho do banco seja prejudicado.
Links
SQL Server Developer Center
http://msdn.microsoft.com/en-us/library/cc645937.aspx
http://msdn.microsoft.com/en-us/library/ms189799.aspx
Feedback
eu
sobre e
s
Concluso
D
s
edio
ta
61
25/02/2010 14:31:06
Seo Projeto/Modelagem
Desafio SQL
Wagner Crivelini
wcrivelini@gmail.com
Atua a mais de 15 anos na rea TI, particularmente com Business Intelligence. Engenheiro formado pela UNICAMP, trabalha
na IBM na unidade de IBM Global Account.
Profissional com certificao em DB2 (IBM
Certified Solution Designer DB2 Business
Intelligence). Colunista convidado do portal
internacional www.SQLServerCentral.com .
Atualmente ocupa a posio de DBA DB2.
62
SQL73.indb 62
D ESAFIO S QL
codPedidoStatus
Descrio do status
pedido aceito
pedido entregue
pedido finalizado
102
103
pedido recusado
63
25/02/2010 14:31:08
Resposta do desafio
Vamos agora fazer um estudo detalhado dos eventos e aes
a serem executadas para todo o fluxo de operaes de um
pedido.
Esta tarefa longa para cobrirmos num artigo, j que vamos criar vrios objetos diferentes e eu vou mostrar aqui os
conceitos que vamos usar em cada um deles. A sintaxe das
linguagens usadas em cada SGBD varia consideravelmente,
mas os conceitos que vou mostrar so aplicveis a todos os
SGBDs.
Por isso, para simplificar, vou me limitar a mostrar a criao
dos objetos usando apenas uma linguagem, T-SQL, que usada
pelo SQL Server. Fica a seu critrio transcrever esta lgica para
o seu SGBD.
A primeira tarefa que temos analisar as Figuras 1 e 2 e traduzir os eventos de mudana de status em aes no banco de
dados. De forma geral, todos os eventos exibidos na Figura 2
(do evento 1 ao 8, sem exceo) se traduzem numa nica ao
no banco de dados: a insero de um novo registro na tabela
dbo.tblPedidoHistorico, identificando um novo status para um
dado item do pedido.
A Figura 3 mostra em detalhes a estrutura da tabela de
histrico.
Column Name
Data Type
codPedido
int
codProduto
int
codPedidoStatus
int
DataEvento
datetime
Observacao
varchar(50)
Allow Nulls
Para simplificar, deixaremos o campo OBSERVACAO inalterado, aproveitando que ele aceita valores nulos. Ento, nossa ao ser sempre uma declarao de insero do tipo
INSERT INTO dbo.tblPedidoHistorico
VALUES(PedidoAtual, ProdutoAtual, StatusNovo, DataAtual,
NULL)
64
SQL73.indb 64
tblPedidoHistorico
Nota do DevMan 1
D ESAFIO S QL
Nota do DevMan 2
Para trabalhar com gatilhos, o SQL Server oferece duas tabelas virtuais: INSERTED
e DELETED. Estas tabelas s podem ser usadas dentro dos gatilhos e elas retornam
as informaes dos registros que so tratados nas declaraes DML. A tabela virtual
INSERTED contm o registro completo que acaba de ser inserido na tabela. A tabela
DELETED tem o registro completo que foi excludo da tabela. E nas declaraes de
UPDATE, por exemplo, teremos as duas tabelas virtuais populadas, DELETED com o
registro antigo e INSERTED com o novo registro.
Cada SGBD usa uma terminologia diferente, mas os conceitos so basicamente os
mesmos. No Oracle e no DB2, por exemplo, temos as tabelas NEW e OLD, que funcionam de maneira muito parecida com o SQL Server.
O mtodo mais simples de fazermos este monitoramento no SQL Server habilitando um job que ser executado
periodicamente.
Digamos que o job seja configurado para rodar a cada 15
minutos. Neste caso, a rotina ser executada, conferindo o
saldo em estoque de todos os itens de pedido que estejam com
status 3. Se houver saldo suficiente, o item do pedido mudar
para o status 4. Do contrrio, este item permanece com o mesmo status at que a rotina seja executada novamente.
Devemos ter um cuidado especial com esta rotina, porque
os pedidos devem ser analisados sequencialmente e em
ordem de cadastramento. Assim vamos garantir que os
pedidos mais antigos sero atendidos primeiro.
Por simplicidade, a rotina que vamos executar ser um
procedimento armazenado. E o sequenciamento dos itens
de pedido ser feito usando-se um cursor.
Dois detalhes importantes:
1. Ns devemos consultar apenas os pedidos que tem o
ltimo status igual a 3. Por isso preciso uma consulta
de sumarizao (GROUP BY) para identificar os pedidos
corretamente.
2. Neste modelo, pedidos so controlados por produto,
mas os saldos so controlados por lote de produto. Ento
ns s teremos o saldo em estoque correto aps fazermos a
sumarizao das quantidades de todos os lotes do mesmo
produto.
Isto nos leva ao script da Listagem 4.
Muito bem, temos a o procedimento a ser agendado.
Quanto ao mtodo de agendamento, existem vrios. No
SQL Server, a maneira mais fcil de fazer isso criando um
job no SQL Server Management Studio, que a ferramenta
grfica de administrao do SGBD.
Um job nada mais do que uma tarefa agendada
que ser controlada por um servio especial do SQL
Server (SQL Agent). Existe uma infinidade de artigos mostrando como criar estes jobs e no vou me
estender nesta questo. A t t ulo de exemplo, reco mendo o artigo da MSDN Como criar um trabalho
(http://msdn.microsoft.com/pt-br/library/ms190268.aspx).
65
25/02/2010 14:31:09
66
SQL73.indb 66
Aps o servio de faturamento (que no cabe aqui entrarmos em detalhes), as notas fiscais sero emitidas. E ento
ns deveremos passar estes pedidos para o status 5.
Este evento deve acontecer logo aps a insero das
notas na tabela correspondente (tblNotaFiscalDetalhe). Por
isso teremos mais uma vez um gatilho, agora na tabela de
detalhes da nota fiscal. A ao praticamente a mesma da
que mostramos na Listagem 2, com uma exceo.
Ns precisamos ter o pedido correspondente nota fiscal, mas isso registrado na tabela dbo.tblNotaFiscal , que
ser gravada antes da tabela de detalhes. Ento o cdigo
do Pedido no vai existir na tabela virtual INSERTED.
Cabe a ns fazermos uma consulta tabela de notas fiscais
para extrairmos esta informao.
Da mesma forma, a tabela INSERTED s ter o cdigo do
lote faturado e no o cdigo do produto. Mais uma vez,
deveremos fazer uma consulta. Veja a Listagem 5.
Feedback
eu
sobre e
s
D
s
edio
ta
D ESAFIO S QL
67
25/02/2010 14:31:13
68
SQL73.indb 68