Escolar Documentos
Profissional Documentos
Cultura Documentos
editor@sqlmagazine.com.br
Utilizando colunas
calculadas na
implementao de
regras e otimizao
de performance
Segundo as regras de normalizao, no devemos armazenar em uma coluna
valores que podem ser obtidos por operaes executadas sobre outras colunas.
Esse tipo de procedimento pode "custar caro" por vrios motivos:
Consome espao em disco;
Exige que todas as aplicaes que manipulam as colunas que fazem parte da
frmula estejam sincronizadas para atualizar tambm a coluna calculada;
Recuperar o resultado de uma frmula do disco um processo lento.
Pensando assim, no seria conveniente criar uma coluna col_C em uma tabela
teste para armazenar o produto de duas outras colunas (col_A * col_B). Cabe aqui
um questionamento: Como fazer para manter a mesma regra de clculo em todas
as aplicaes, evitando-se que sejam utilizados diferentes critrios para obter
col_C?
Existem trs possibilidades:
1. Armazenar a frmula em uma stored procedure. A aplicao que necessitar
de col_C ser obrigada a executar a procedure;
2. Armazenar a frmula em uma funo. A aplicao que necessitar de col_C
ser obrigada a executar a funo;
3. Armazenar a frmula em uma coluna calculada. A coluna col_C ser criada
na tabela teste; para obter o resultado de col_C, basta efetuar um select na
tabela;
Das trs opes, a criao da coluna calculada a que apresenta melhor custo-
benefcio e menor complexidade para implantao. Vamos proceder criao da
tabela teste, de modo que consigamos avaliar a implementao das trs solues
propostas (ver Listagem 1).
Utilizando uma stored procedure para obter o produto entre col_A e col_B
Imagine um select que precise listar as trs colunas: col_A, col_B e col_C. Se a
frmula de clculo estivesse embutida em uma stored procedure (SP), a nica
opo seria criar um cursor e efetuar chamadas pontuais para a SP, conforme a
Listagem 2.
Utilizando uma coluna calculada para obter o produto entre col_A e col_B
Em relao s opes anteriores, a coluna calculada mais fcil de implementar e
sua utilizao transparente para os usurios. Como a coluna calculada no
armazenada na tabela, no estaremos violando regras de normalizao mais
precisamente a terceira forma normal. A coluna calculada utilizar somente alguns
ciclos do processador para, no momento em que um comando SQL referenciar a
coluna - e somente nesse momento - efetuar o clculo desejado em memria, e
apresentar o resultado. A listagem 5 mostra a criao da coluna calculada e sua
utilizao em um select.
O leitor poderia questionar que a coluna calculada pode ser substituda pela
incluso da frmula de clculo na linha do select, como no exemplo abaixo:
Concluso
Vimos nesse artigo que o uso de colunas calculadas bastante interessante,
principalmente por quatro motivos:
1. Padroniza as regras do negcio na camada de banco, tornando-as
independentes da aplicao;
2. Simplifica a utilizao de frmulas complexas;
3. fcil de implementar;
4. Podemos turbinar uma query que possui ordenao e/ou comparaes
baseadas na frmula atravs da criao de um ndice sobre a coluna
calculada.
Nota 1
O PL/SQL Developer um aplicativo 32 bit para SO Windows (no mnimo
Windows 95 ou NT4) e necessita da verso 32 do SQL*Net, Net 8 ou Net 9. A
verso de avaliao (sem nenhuma restrio de funcionalidade mas funcional
durante 30 dias) do PL/SQL Developer pode ser baixada gratuitamente no site
do fabricante: http://www.allroundautomations.nl.
Administrando o BD Oracle
Criando usurios
Uma das primeiras tarefas de um DBA a criao de usurios e esquemas.
Atravs da interface do PL/SQL Developer, a tarefa bastante simplificada; no
sendo necessrio memorizar todas as definies do comando SQL para efetuar a
atividade (Figura 2).
Figura 2. A janela Create User. Facilidade na criao de usurios.
Uma das grandes vantagens do uso da ferramenta que podemos, por exemplo,
criar o usurio atribuindo-lhe os devidos privilgios e tambm definir cotas nas
tablespaces que ele poder acessar e criar objetos.
Na guia General, deve-se definir o nome e senha do usurio. possvel tambm
definir quais so as tablespaces padro e temporria (caso no seja informado,
ser utilizada a tablespace SYSTEM).
A guia Object Privileges permite a visualizao, concesso ou modificao de
privilgios a objetos (select, insert, update, delete, execute, alter, etc) ao usurio.
As opes so: deixar em branco, para que o usurio no tenha tal privilgio,
Yes, para que haja o privilgio ou Grantable, para que o usurio, alm de
possuir tal privilgio, possa conced-lo a outros usurios.
Pode-se ainda conceder privilgios a determinados papis (Roles) como connect,
dba, resource, exp_full_database, etc. definindo tambm como Grantable, se
necessrio.
Em System Privileges possvel conceder privilgios de sistema como create
any table, create session, etc. A opo Grantable tambm est presente.
Finalmente, podemos atribuir cotas (Quotas) (em bytes, Kb ou Mb) para o usurio
em cada tablespace (isso significa dizer qual o mximo que o usurio poder alocar
em uma tablespace) ou definir esta cota como ilimitada.
H ainda a opo de visualizar os comandos SQL gerados, clicando no boto View
SQL (Figura 3), e grav-los em um arquivo para posterior utilizao.
Figura 11. SQL Window com o retorno das dez primeiras linhas de um SELECT.
A janela de comandos
O PL/SQL Developer oferece ainda uma interface de linha de comando
extremamente parecida com o SQL*Plus, que possibilita a execuo de scripts SQL
alm das expresses SQL em geral. Para acessar a Command Window, selecione
File -> New -> Command Window (Figura 13).
Relatrios
Existe a opo de gerao de relatrios sobre os dados da aplicao que estiver
sendo desenvolvida ou at mesmo sobre as informaes do dicionrio de dados.
Esta segunda, bastante til para os DBAs. Esto disponveis vrios relatrios
padronizados de acordo com a caracterstica das informaes que se pretende
obter.
Para ter acesso aos relatrios, v em Reports e escolha a seo de relatrio
necessria. So quatro as opes de informaes para os relatrios: DBA, Objects,
PL SQL e User.
DBA: refere-se a relatrios que buscam informaes do dicionrio de dados.
Temos as seguintes opes:
o Initialization Parameters: indica as informaes dos parmetros de
inicializao do BD;
o NLS Database Parameters: informaes sobre os parmetros de suporte a
lngua nativa configurados no BD;
o Role Privileges: relatrio sobre os privilgios concedidos a um papel (role);
o Roles: relatrio de todos os papeis (roles) criadas no BD;
o Rollback Segments: traz as informaes de todos os segmentos de rollback
configurados no sistema;
o Server Components: mostra os componentes do SGBD tais como: verso do
BD, do PL/SQL, etc.;
o System Privileges: informa os privilgios de sistema concedidos a todos os
usurios ou a um usurio especfico;
o Tablespaces: relatrio de informaes da configurao das tablespaces;
o Users: mostra as informaes dos usurios do BD;
Objects: refere-se aos objetos criados no BD e esto subdivididos em:
o All Objects: prove informaes sobre todos os objetos do BD ou todos os
objetos de um determinado usurio;
o Indexes: informaes sobre os ndices de uma tabela ou de um esquema
completo;
o Sequences: exibe as configuraes das seqncias ou de uma determinada
seqncia no esquema;
o Synonyms: mostra as informaes dos sinnimos presentes no sistema;
o Tables: informaes sobre as tabelas do esquema;
o Triggers: exibe as informaes dos gatilhos, incluindo a descrio e o corpo
do gatilho;
o Types: informa todos os tipos criados no esquema;
o Views: exibe as vises criadas no esquema;
PL SQL: oferece somente a opo de Compilation errors para visualizar os
erros de compilao dos blocos de programa PL/SQL;
User: apresenta os relatrios referentes s informaes do usurio atravs das
seguintes opes:
o Granted Roles: exibe os papeis concedidas ao usurio;
o Granted System Privileges: mostra os privilgios de sistema concedidos ao
usurio;
o NLS Session Parameters: indica o valor dos parmetros de suporte lngua
nativa configurados para a sesso;
o Object Privileges Made: indica os privilgios de objeto que o usurio
concedeu a outros;
o Object Privileges Received: exibe os privilgios de objeto recebidos por
outros usurios.
Projetos
Para uma melhor organizao dos trabalhos, o PL/SQL Developer permite a
organizao dos arquivos manipulados atravs de projetos. Um projeto nada mais
do que uma coleo de cdigos fonte, objetos de BD, notas e opes. Desta forma,
pode-se trabalhar apenas com um escopo de itens especficos ao invs de trabalhar
com um BD ou esquema completos.
O nico cuidado que devemos ter o de garantir que a opo Use Projects esteja
selecionada nas preferncias do PL/SQL Developer. V em Tools -> Preferences ->
Options e selecione a opo Use Projects caso ainda no esteja selecionada.
Atravs do menu Project -> New, preencha as opes de criao do novo projeto
(Figura 14).
Salve o projeto (por padro, a extenso ser .prj) e a partir deste instante, todas
as vezes em que este projeto for aberto, as definies, objetos, cdigos, etc. a ele
associados, estaro disponveis organizadamente.
Agora o momento de adicionar as unidades de programa, objetos, etc. ao seu
projeto. Para adicionar uma unidade de programa previamente salva, basta abri-la
e selecionar Project -> Add to Project para que esta unidade de programa seja
includa na lista de itens do projeto. Uma outra maneira de adicionar unidades de
programa ou objetos atravs do navegador esquerda da rea de trabalho do
PL/SQL Developer. Neste navegador estaro disponveis apenas as unidades de
programa ou objetos que j tenham sido criadas no BD. Abra a janela Project Items
(Project -> Project Items...) e depois selecione a unidade de programa ou objeto
no navegador e, pressionando o boto direito do mouse, selecione a opo Add to
project (Figura 15).
Finalmente, basta compilar o projeto. Para isso, selecione a opo Build ou Make
no menu Project. A funo Build ir simplesmente compilar todos os componentes
do projeto que estiverem habilitados para compilao. Os itens sero compilados na
ordem em que aparecem na lista de itens do projeto (Figura 15). A funo Make
somente compilar os objetos que sofreram alguma alterao desde a ltima
compilao.
Concluses
Desenvolver aplicaes ou executar administrao em um BD Oracle no uma
tarefa simples, requer um alto grau de conhecimento do BD e tambm da
linguagem procedural PL/SQL alm, claro, da estrutura de expresses SQL.
Considerando estas tarefas, ferramentas grficas que podem nos trazer facilidades
e agilidade no processo de desenvolvimento e administrao do BD so muito bem-
vindas.
O PL/SQL Developer uma destas ferramentas que nos permite um alto grau de
produtividade e confiabilidade nas informaes e resultados.
Por fim, um conselho que me permito dar o de no se viciar nas ferramentas
grficas e sim us-las apenas como um apoio s tarefas. No se esquea nunca das
expresses SQL para chegar nesta ou naquela informao, pois no nem um
pouco improvvel que em uma consultoria voc possa ter acesso apenas a um
terminal de fsforo verde piscando em sua frente ou mesmo, sem chegar a
extremos, um BD instalado sobre um sistema operacional Linux, por exemplo, sem
interface grfica instalada para poupar recursos de memria. Lembre-se, sempre
teremos o velho e bom SQL*Plus em qualquer ambiente.
Espero que tenha sido uma leitura agradvel. At a prxima.
Implementando um
data mart em um
banco de dados
multidimensional
Leitura obrigatria: SQL Magazine 13 e 14, Modelagem de data warehouses e
data marts (partes 1 e 2).
Leitura obrigatria: SQL Magazine 9, Arquiteturas de Ferramentas Olap.
Cada uma das dimenses definida diretamente com seus valores e a hierarquia
entre estes valores. As Figuras 4, 5 e 6 mostram como ficam armazenadas as
dimenses Loja, Tempo e Produto no TM1, respectivamente. Perceba que as
hierarquias so definidas no prprio banco de dados, indicando como sero
realizados os agrupamentos das informaes.
Na Figura 4 podemos observar os detalhes da dimenso Loja onde os nomes das
lojas (coluna Loja) aparecem no nvel de granularidade mais baixo, com o smbolo
ao lado. Os outros atributos, como Cidade, Estado e Regio aparecem
agrupando os nveis abaixo de cada um deles. Por serem agrupamentos, aparecem
com o smbolo ao lado. Para facilitar as consultas e anlises que os usurios iro
realizar, inclumos o nvel Total Loja, que agrupa as lojas de todas as regies.
Daqui a pouco iremos analisar o contedo da tabela fato e vamos ver que os
valores so armazenados apenas para o nvel mais baixo de granularidade (Loja,
Data e Produto). atravs da estrutura das dimenses que o banco de dados pode,
automaticamente, agrupar os valores de vendas para os nveis superiores. Baseado
nesta descrio o leitor tambm entender as dimenses apresentadas nas Figuras
5 e 6.
Figura 4. Contedo da dimenso Loja, mostrando todos os nveis.
Figura 5. Contedo da dimenso Tempo, mostrando todos os nveis (alguns meses
esto fechados para favorecer a visualizao).
Figura 6. Contedo da dimenso Produto, mostrando todos os nveis (algumas
linhas de produtos esto fechadas para favorecer a visualizao).
Vamos ver agora, passo a passo, como criar uma dimenso no TM1. Para criar
uma nova dimenso, preciso clicar com o boto direito sobre Dimensions, como
mostra a Figura 7, e comear a inserir o contedo da nova dimenso. Vamos
simular a criao da dimenso Produto, conforme o exemplo que estamos utilizando
neste artigo. Pode-se inserir os elementos em qualquer ordem, ou seja, pode-se
partir do nvel mais alto da hierarquia e, aps isto, incluindo os elementos filho
ou, pode-se iniciar pelo nvel mais baixo de granularidade e depois incluir os pais.
A qualquer momento possvel tambm incluir elementos de qualquer nvel
hierrquico, bastando apenas indicar o local da hierarquia onde voc quer que o
elemento seja includo. Se a dimenso for muito grande, normalmente criado um
processo de carga que carrega os elementos da dimenso partindo de um arquivo
(texto, planilha MS-Excel ou outros). Neste caso, apesar da dimenso conter muitos
elementos, vamos criar manualmente o contedo da dimenso. Assim, vamos
iniciar com a incluso dos valores do nvel mais alto da hierarquia de produtos
(categoria) e depois iremos incluindo os filhos (linha e produto) at completar a
dimenso. A Figura 8 mostra a insero do primeiro valor na dimenso Escolar /
Escritrio que est no nvel mais alto da hierarquia (categoria). Uma vez que os
valores para categoria dos produtos forem inseridos na dimenso, podemos iniciar
a insero dos filhos das categorias, que so as linhas dos produtos. Na Figura 9
podemos ver como esta insero feita (clicar com o boto da direita sobre o valor
da categoria e solicitar a insero de filhos). A partir deste ponto vamos inserindo
valor por valor at completar o contedo da dimenso produto, salvar, escolhendo
um nome para a dimenso, que ficar exatamente como representado na Figura 6.
Mesmo depois de estar em produo, possvel incluir novos valores sem afetar as
aplicaes analticas j existentes, pois novos produtos podem ser comercializados
pela rede de papelarias. Caso um produto deixe de ser comercializado, no
comum exclu-lo da base de dados. A razo mais importante que existem vendas
anteriores para este produto e se ele for excludo da base, o histrico das vendas
ser perdido.
Uma vez que as dimenses foram carregadas e a tabela fato foi definida, temos
que criar o cubo que conter as informaes das vendas. Para criar a estrutura do
cubo no TM1, basta solicitar a criao de um novo cubo (clicar com boto direito
sobre Cubes, como mostra a Figura 12). Com isto, o TM1 apresentar a
possibilidade de se escolher as dimenses que iro compor o cubo (como mostra a
Figura 13) e, ao clicar no boto Properties, informar, entre as dimenses do cubo,
qual a tabela fato (no TM1: Measures dimension, como mostra a Figura 14).
Aps a execuo destas etapas j temos o cubo de Vendas pronto, porm vazio,
isto , as dimenses foram escolhidas e esto carregadas, mas os valores das
mtricas ainda no <<alterei esta frase, acho que ficou melhor>>. Assim, iremos
efetuar o processo de carga dos dados do fato. Para isto, usaremos um arquivo tipo
texto com os dados a serem carregados (o TM1 permite carga a partir de diversos
tipos de arquivos diferentes como planilhas MS Excel, tabelas em bancos de dados
relacionais, dados armazenados no BW (data warehouse do SAP), entre outros).
Figura 15. Detalhe de fragmento do arquivo texto usado na carga da tabela fato.
As mtricas calculadas
Considerando que as informaes foram carregadas, com exceo dos valores de
Margem e Margem %, vamos continuar com o processo de preparao dos dados
para as anlises e consultas. O prximo passo informar ao banco de dados qual a
frmula de clculo para as mtricas que faltam. Esta etapa no requer que os
dados j estejam carregados, poderamos ter criado as frmulas de clculo com o
cubo vazio. No TM1, assim como em outros bancos de dados multidimensionais,
existe um editor que permite a criao de campos calculados.
A Figura 16 apresenta o clculo das mtricas Margem e Margem %. Veja que o
clculo simples e vlido para todos os nveis de agregao das informaes.
Assim, para um determinado item de produto, a margem ser calculada sobre o
valor da venda do produto menos o custo total. O mesmo vale para uma linha de
produto, isto , a margem ser calculada sobre o valor de venda de todos os
produtos que compem uma determinada linha subtraindo-se o custo total dos
produtos daquela linha. Esta uma grande vantagem de se usar um banco
multidimensional, os clculos so automaticamente executados nos diferentes
nveis de agrupamento. A mtrica Margem % est definida no banco de dados
como sendo do tipo percentual, assim o clculo tambm fica simplificado, bastando
apenas dividir o valor da Margem pelo Valor Venda.
Feito isto, os dados armazenados esto prontos para as anlises dos usurios.
Explorando as informaes
Uma forma bem simples de se visualizar informaes no TM1 atravs do MS
Excel. Isto feito atravs de um plug-in do TM1 instalada no MS Excel tornando
possvel que os dados armazenados no banco de dados multidimensional TM1
sejam visualizados diretamente atravs das planilhas. Note que os dados no esto
sendo transferidos para as planilhas, mas esto armazenados na base de dados
multidimensional. Esta interface permite ao usurio explorar a base de dados da
forma que lhe interesse, possibilitando operaes da anlise multidimensional como
drill down (descer nveis de detalhe), drill up/roll up (subir nveis de detalhe),
pivoteamento (fixar dimenses) entre outras. A anlise multidimensional ser
descrita em outro artigo. O importante aqui percebermos que o usurio tem total
liberdade de explorao das informaes armazenadas no banco de dados. Um
exemplo de explorao mostrado na Figura 18, onde esto representadas as
categorias de produtos vendidas por ms em todas as lojas, visualizando-se apenas
as mtricas Quantidade, Margem e Valor Venda. Mais dois exemplos so: (1) a
visualizao apresentada na Figura 19 mostra os produtos que apresentaram
maiores margens (em percentual) no ano de 2003, e; (2) a variao das
quantidades vendidas de um determinado produto nas diferentes lojas mostrado na
Figura 20. As vises no so estticas, ou seja, o usurio pode explorar diferentes
itens, datas, lojas e mtricas. Como exemplo, na anlise da Figura 20, caso o
usurio quisesse analisar outro produto, bastaria clicar na dimenso produto e
escolher um novo item para ser analisado.
O MS Excel no a nica interface disponvel no TM1. possvel tambm
executar anlises atravs da web, utilizando apenas um browser na estao cliente.
Na verdade, os recursos de explorao das informaes atravs das ferramentas
OLAP so inmeros.
Figura 18. Viso de explorao de dados: categorias de produtos vendidas ao
longo do tempo.
Figura 19. Viso de explorao de dados: itens de produtos com maior margem
percentual no ano de 2003.
Concluso
Este artigo mostrou como definir, carregar e explorar as informaes
armazenadas no banco de dados multidimensional TM1. interessante notar as
diferenas da estrutura deste banco multidimensional se comparado aos bancos de
dados relacionais. Estas diferenas visam facilitar o processo de anlise
multidimensional, atravs das ferramentas OLAP, onde operaes especiais como
drill down, drill up e outras esto disponveis. Em suma, bancos multidimensionais
so geis e bastante flexveis.
Existem outros bancos multidimensionais no mercado e sua estrutura interna
pode variar, mantendo, porm, os mesmos conceitos bsicos de armazenamento e
funcionamento.
Por fim, vale ressaltar que os aspectos mais importantes no projeto de um data
warehouse (ou de um data mart) esto na definio e criao de bases de dados
com informaes precisas e na escolha de ferramentas de fcil uso que possibilitem
ao usurio explorar os dados de acordo com as suas necessidades de negcio,
otimizando seu trabalho.
Entendendo plan
table e planos de
consulta
O ajuste fino de comandos SQL no nem um bicho de sete cabeas e nem
mgica. Todos os SGBDs relacionais geram um plano de execuo para um
comando submetido. Este plano informa ao SGBD qual a estratgia de acesso aos
dados ou como realizar as tarefas atreladas aos dados. Quanto melhor a
compreenso de como interpretar estes planos, mais fcil ser a resoluo de
possveis problemas de desempenho com comandos SQL.
A plan table
O Oracle popula uma plan table sempre que solicitado. Esta plan table contm o
plano de execuo para um comando SQL particular. Se um determinado esquema
no possui uma plan table, pode-se rodar o script utlxplan.sql utilizando o Oracle
userid, ou solicitar ao administrador do BD para execut-lo. Eu sempre uso a plan
table que foi instalada com a instncia do Oracle. Existem vrios modos de popular
uma plan table, entretanto, nos concentraremos em dois deles.
Utilizando o SQL*Plus, insira o comando set autotrace on explain statistics (ver
Figura 1). Isto popular a plan table e fornecer um plano de consulta gerado
automaticamente com suas estatsticas de runtime.
Figura 1. SQL*Plus utilizando o autotrace.
Ao Descrio da notao
Cada uma das condies de juno NESTED LOOPS, MERGE JOIN e HASH JOINS
produzem um conjunto de resultados intermedirios que repassado ao parent
ID. Assim, o comando NESTED LOOP no statement ID 3 na Figura 2, obtm a
sada do NESTED LOOP no statement ID 4 e a seguir itera na tabela restante da
clusula FROM no statement ID 9. Perceba que o parent ID do statement ID 9 o
3, ou seja, o primeiro comando NESTED LOOP neste explain plan.
Outro aspecto interessante : como dizer quais partes do comando SQL
correspondem a que parte do plano de consulta? aqui que fica difcil para o
ajustador principiante. Pode-se ler nas entrelinhas e verificar quais ndices so
acessados e qual a coluna ndice. Voltando clusula WHERE, veem-se quais so
as colunas correspondentes e ento possvel fazer chutes educados.
Concluso
Entender planos de consulta o elemento-chave para o ajuste de comandos SQL.
Quanto mais informao disponvel, melhores decises podem ser feitas sobre
quais alteraes so necessrias para um determinado comando SQL.
Informao adicional sobre o contedo de planos de consulta e detalhes de ajuste
do SQL em geral podem ser encontrados consultando-se o Oracle SQL Tuning
Pocket Reference de autoria de Mark Gurry, editora OReilly.
Dan Hotka consultor Oracle tendo mais de 20 anos em experincia com produtos
Oracle.
Influenciando o
otimizador de
consultas Oracle
baseado em custos
Parte 1
Muitos desenvolvedores Oracle e DBAs esto familiarizados com a teoria bsica
por trs da otimizao de consultas baseadas-em-custo: o otimizador usa
estatsticas descrevendo o contedo de tabelas, colunas e ndices para estimar o
custo de vrios planos de consulta possveis para uma dada query e escolhe aquela
com o menor custo. Na prtica, o plano de consulta selecionado nem sempre o
mais rpido e pode, at mesmo, nem ser prximo do mais rpido. Tipicamente,
quando isto acontece, podemos considerar o uso de dicas para forar o otimizador
a utilizar um plano de consulta melhor. Porm, isto requer a modificao do
programa que solicitou a consulta, o que nem sempre possvel. Por esta e outras
razes, muitos especialistas no recomendam o uso de dicas para passar por
cima do otimizador, exceto como um meio de experimentar vrios planos de
consulta com o intuito de comparar os tempos de execuo.
Perfis armazenados (stored outlines) tambm podem ser problemticos, pois eles
devem casar com as consultas s quais se aplicam. Mesmo pequenas mudanas
no texto de uma consulta podem conduzir a um perfil no utilizvel, e muitos stios
operacionais no tm disciplina suficiente nos seus processos de gerncia de
configurao para assegurar que o perfil ir migrar para a produo junto com a
consulta. Finalmente, para criarmos um perfil, preciso fazer com que o otimizador
escolha o plano de consulta correto sem modificar a consulta - se isso fosse
possvel, voc no estaria lendo este artigo!
Aps o ajuste fino dos parmetros optimizer_index_caching e
optimizer_index_cost_adj, e a coleta de estatsticas nas tabelas do banco de dados,
o que faremos se ainda existirem alguns casos em que o otimizador escolha um
plano de acesso sub-otimizado? Este artigo o primeiro de uma srie que descreve
algumas dessas situaes, e algumas aes que podemos tomar para contorn-las
antes de recorrer a dicas.
Cardinalidade estimada
A estimativa do otimizador em relao ao custo de um plano de consulta
derivada principalmente pelo nmero estimado de linhas que sero processadas a
cada passo, o que chamado de cardinalidade. Se for utilizado o comando EXPLAIN
PLAN com o otimizador baseado em custo (CBO cost based optimizer), ele ir
fornecer na coluna PLAN_TABLE.CARDINALITY, a cardinalidade estimada a cada
passo do plano de consulta. Este valor baseado no fato de que melhorando a
preciso da cardinalidade estimada, ser incrementada a preciso do custo
estimado e, portanto, ser aumentada a probabilidade de que o otimizador
baseado-em-custo escolher realmente o mais rpido plano de consulta. E agora,
como fazer para que as cardinalidades sejam as mais precisas possveis?
Para estimar as cardinalidades de uma fonte de linhas especfica, o otimizador
deve estimar a seletividade dos predicados que usam essa fonte de linhas.
Seletividade a probabilidade que o predicado seja verdadeiro para qualquer linha
dada (um nmero entre 0 e 1). Assim, se a fonte de linhas prov N linhas, e a
seletividade dos predicados dessa fonte S, ento a cardinalidade estimada aps a
aplicao dos predicados ser N*S. Para predicados que combinam duas fontes A e
B, a cardinalidade estimada NA*NB*S.
Estimativas de seletividade de predicados so baseadas em muitos fatores:
As colunas que a consulta utiliza em seus predicados;
A estatstica de colunas, incluindo informaes como o nmero de valores
diferentes (NDV number of distinct values) e densidade (a densidade
1/NDV quando no h histograma e derivada de uma frmula complexa
quando h histograma);
O tipo de predicados na sua consulta, tais como comparaes de igualdade,
desigualdades, operaes LIKE, subconsultas, etc;
Pressupostos embutidos no projeto do otimizador sobre os quais no h
controle.
_unnest_subquery false
optimizer_dynamic_sampling 1
optimizer_features_enable 9.2.0
optimizer_index_caching 90
optimizer_index_cost_adj 30
optimizer_max_permutations 79999
optimizer_mode CHOOSE
Tabela 1.
select *
from address a
join customer c on (a.cust_id = c.cust_id)
join ord o on (o.cust_id = c.cust_id)
join line_item li on (li.order_num = o.order_num)
join item i on (i.item_id = li.item_id)
where i.type = 4
and a.eff_dt =
(select max(eff_dt)
from address a2
where a2.cust_id = a.cust_id
)
;
Listagem 1. Consulta utilizada no exemplo.
O plano de consulta escolhido para a consulta est apresentado na Figura 1. O
n destacado de interesse posterior.
Porm, quando este plano de consulta foi executado, a consulta levou mais de 20
minutos, executou mais de 2,4 milhes de leituras lgicas (consistent gets) e, por
fim, retornou somente 2.706 linhas (ver Figura 2).
Figura 3.
begin
dbms_stats.set_column_stats (
ownname => user,
tabname => 'ADDRESS',
colname => 'EFF_DT',
distcnt => 1.0,
density => 1.0
);
end;
/
Listagem 3.
Perceba que a ordem de juno foi totalmente revertida. Desta maneira, o tempo
de execuo e de E/S lgica foram reduzidos drasticamente (ver Figura 5).
Concluso
Pelo fato do otimizador basear suas escolhas na cardinalidade estimada, os planos
resultantes podem ser ineficientes quando essas estimativas no so precisas.
Neste artigo, vimos um exemplo onde a seletividade de um predicado foi muito
menor que a assumida pelo otimizador. Mesmo estatsticas precisas e histogramas
no levam em conta o efeito das presunes do otimizador sobre predicados na
forma COLUMN=(subconsulta). Contornamos as presunes incorretas modificando
a estatstica de coluna de forma que a seletividade do predicado passou a ser
precisa, e o otimizador nos forneceu um plano de consulta melhorado.
Tenha em mente que a tcnica descrita aqui no uma panacia universal. O
nico meio de saber ao certo se uma dada modificao ser eficiente ou no
testando num BD de teste contendo tabelas que reflitam as que sero utilizadas em
produo.
Heap Tables
Livre-se delas para ganhar
performance
Leitura obrigatria: SQL Magazine 10, artigo Entendendo e utilizando
ndices na otimizao de queries no SQL Server.
Dedicarei esse artigo a um assunto especial e pouco explorado: Heap tables, ou
se preferir, tabelas que no possuem ndice cluster.
Os processos de desfragmentao existentes no SQL Server 2000 foram criados
para desfragmentar ndices. Como as pginas de dados de uma heap no so
regidas por um ndice, no possvel desfragmentar uma heap utilizando os
comandos convencionais DBCC dbReindex e IndexDefrag. Heaps fragmentadas so
indicadoras de m performance, e a simples criao de um ndice cluster poderia
resolver o problema, como veremos a seguir.
Uma PFS controla 8.000 pginas; cada byte da pgina PFS pode assumir quatro estados: totalmente vazia, at 50% de
utilizao, de 51 a 80% de 81 a 95% e de 96 a 100%. O controle de pginas PFS utilizado por heaps ou por tabelas que
Antonio Carlos . . . . . . . . .
1 2
Danilo
Ademir Lucimara
. . . . . . . . .
Aldo Paulo
Arisvaldo
. . . . . . . . .
Beatriz
Figura 4. Pginas de dados de tabela de nomes sem ndice cluster (=heap) aps
reindexao.
dbcc showcontig('temp_orders')
dbcc
showcontig('temp_orders','ix_noncluster_O
rders')
dbcc dbreindex('temp_Orders')
---------------------------------------------------------------------------------------------
-------
DBCC execution completed. If DBCC printed error messages, contact your system
administrator.
Nota 2. Page-splits
Os ndices armazenam os dados de forma ordenada. Quando temos um ndice
com chave numrica e realizamos inseres com valores aleatrios (ex:
1,44,10,9,8), o ndice se encarregar de reagrupar a seqncia ordenadamente
(ex: 1,8,9,10,44). Mas o que aconteceria ao tentarmos inserir uma nova
seqncia (exemplo: 2, 3), e a pgina do ndice estivesse cheia, sem espao
para acomodar novas inseres? Nesse caso, aproximadamente metade da
pgina no exemplo os valores 10 e 44 seriam movidos para uma nova
pgina, para acomodar as novas inseres. O que antes cabia em uma nica
pgina, agora est distribudo em duas pginas: (no exemplo: 1,2,3,8,9 e
10,44). Page-Split o termo utilizado para explicar uma diviso de pgina de
ndice (cluster ou no cluster) para acomodar uma insero pontual.
Concluso
Vimos que tabelas com grande nmero de linhas esto mais sujeitas a problemas
de performance. Se a tabela for uma heap, o problema pode estar relacionado
fragmentao. A soluo, nesse caso, escolher uma chave adequada e criar um
ndice cluster para a tabela. Caso no exista uma chave adequada, uma identity
poder ser criada para esse fim.
Um grande abrao e at a prxima!
Variveis Bind
Uma viso prtica
O uso de instrues SQL pela maioria das linguagens de programao e sistemas
gerenciadores de banco de dados pode ser parametrizado de forma eficiente e
segura, atravs das bind variables, ou variveis de ligao, podendo ser utilizadas
nos comandos SELECT, UPDATE, DELETE e INSERT. Variveis de ligao funcionam
como parmetros em instrues SQL possibilitando a atribuio de valores
dinmicos. Na execuo de instrues SQL comum usar parmetros para
selecionar ou atualizar dados atravs das clusulas where, values ou set.
H uma semelhana muito grande de uma mesma instruo SQL elaborada com
variveis de ligao ou valores fixos ambos usados como parmetros. Mas a
semelhana s na escrita dos comandos ou instrues SQL. Na verdade, a
diferena existe na execuo destes comandos no servidor de banco de dados.
Quando uma instruo SQL elaborada com varivel de ligao ocorre apenas a
leitura e substituio do valor atribudo varivel de ligao, e caso a instruo
SQL j esteja na memria do servidor de banco de dados ocorre o retorno ou
atualizao dos dados, sem ter que passar pelas etapas de preparao e execuo
da instruo, ou seja, com o uso de variveis de ligao permitido o reuso de
instrues SQL j armazenadas em memria. Se uma instruo SQL for executada
atravs de parmetros com valores fixos ou strings concatenadas atravs de
alguma linguagem de programao, o servidor de banco de dados ir sempre
refazer e executar sempre uma nova instruo SQL.
bom lembrar que parmetros usados em instrues SQL podem ser valores
fixos, variveis concatenadas atravs de alguma linguagem de programao e
tambm variveis de ligao.
possvel definir varivel de ligao de diversas maneiras. Serve de ponte para a
execuo de uma instruo SQL j preparada na memria do servidor, onde so
enviados apenas os valores nela contidos.
O uso dessas variveis no desenvolvimento de sistemas de informao permite
maior segurana e eficincia na manipulao de dados, sendo suportadas pela
maioria das linguagens de programao, entre elas o Visual Basic, C++ Builder e
Java. Alguns sistemas gerenciadores de banco de dados tambm permitem o uso
de variveis de ligao na construo de funes e procedimentos armazenados
(stores procedures), como por exemplo, o Oracle.
O foco deste artigo conceituar e exemplificar o uso de variveis de ligao
utilizando o SGBD Oracle atravs de sua linguagem PL/SQL, e tambm atravs da
linguagem Java.
Para os exemplos apresentados nesse artigo, utilizaremos o modelo de dados
apresentado na figura 1.
Prepare
Durante a fase PREPARE, a instruo SQL enviada pelo usurio para o servidor de
em:
Execute
Fetch
retornoRes.next();
Figura 2. Formulrio de exemplo usado para simular digitao de aspas simples
usando o cdigo da listagem 5.
+"EMP.DTHRALUGFITA AS DATA_ALUGUEL,
EMP.DTDEVLFITA AS +"DATA_DEVOLUCAO
FROM EMPRESTIMOS AS EMP, "
stmt.clearParameters();
stmt.setString(1, getCodClie());
stmt.setString(2, getCodFita());
consRetorno.next();
v_Retorno_Cursor tp_CURSOR;
v_STRING_SQL VARCHAR2(500);
BEGIN
END RETORNACLIENTE;
END PAB_LOCADORA;
Concluso
O uso de variveis de ligao fornece ganho e eficincia junto s aplicaes de
banco de dados, dispensando a fase de preparao de instrues SQL que so
executadas vrias vezes. Alm disso, o uso de variveis de ligao permite maior
segurana na execuo de SQL pelos sistemas de informao. possvel concluir
que sempre que possvel, vantagem utilizar variveis de ligao.
Bibliografia
Disponvel on-line em
http://www.linhadecodigo.com.br/artigos.asp?id_ac=99&sub=0
10 passos para a
criao de um
modelo de banco de
dados - Parte II
Na primeira parte deste artigo apresentamos a execuo dos dez passos para
elaborar um modelo conceitual bsico de banco de dados. No entanto, a
modelagem tradicional nem sempre adequada para representar determinados
esquemas de banco de dados. Como exemplo, podemos citar a modelagem
orientada a objetos, onde necessrio explicitar: herana; hierarquia de
relacionamento; agregao e outros conceitos tpicos. Utilizaremos um dos
exemplos j apresentados no primeiro artigo para demonstrar a aplicao do
roteiro dos 10 passos na modelagem orientada a objetos. Acreditamos que desta
forma ser mais fcil ao leitor comparar os diferentes tipos de modelagem.
Utilizaremos o diagrama de classes da UML, normalmente utilizado no projeto de
softwares, e que tem sido largamente utilizado para representar esquemas
orientados a objetos. Essa escolha tambm tem motivao no fato desta linguagem
de modelagem j ter sido bastante tratada em outras edies da SQL Magazine.
Podemos citar a edio 14 da SQL Magazine que contm um excelente artigo
Aprenda UML na prtica. O artigo Desenvolvimento de aplicaes orientadas a
objeto apoiado por tecnologias Java, publicado na edio de nmero 14, tambm
trata os conceitos relacionados orientao a objetos.
Inicialmente vamos relembrar o estudo de caso apresentado no primeiro artigo
desta srie.
Estudo de caso
Uma escola deseja disponibilizar em uma intranet as notas de seus alunos por
matria e por bimestre, sendo que um semestre sempre ter duas notas bimestrais
e a mdia final do semestre ser calculada pelo sistema. Na pgina, o aluno poder
visualizar o cdigo da matria, a descrio da matria, bimestre, nota e no final do
semestre a respectiva mdia final. Tambm poder consultar quais matrias cursa
no semestre, e respectivos professores. J o professor pode visualizar quais
matrias leciona em cada curso e lanar as notas de cada aluno. A escola tambm
deseja extrair relatrios ou pesquisas sobre as matrias que o aluno cursa e vice-
versa e ainda, quais professores lecionam que matria e vice-versa. Para que no
haja confuso entre matrias com mesmo nome, mas em cursos e contedos
diferentes, e ainda considerando que podem existir vrias turmas do mesmo curso
no mesmo semestre, todas as matrias possuiro um cdigo prprio que a
distinguir por curso e por turma. Assim matemtica I da turma A do curso de
administrao ter um cdigo de matria diferente de matemtica I do mesmo
curso de administrao da turma B. Ser diferente tambm da matemtica I de
qualquer outro curso. Desta forma cada cdigo de matria ter somente um
professor responsvel.
Turma e Matria fazem parte de Curso e por isso esto agregadas a ela.
Resultado:
Resultado:
Aluno = registro_aluno
Professor = registro_professor
Concluso
A aplicao do roteiro dos dez passos no primeiro artigo desta srie, onde
utilizamos o diagrama Modelo Entidade-Relacionamento (MER), e nesta segunda
parte, na qual utilizamos o diagrama de classes, apresenta basicamente duas
importantes diferenas:
A criao da classe PESSOA que generaliza os atributos comuns entre
PROFESSOR E ALUNO. Desta forma PROFESSOR E ALUNO especializam seus
atributos exclusivos e herdam os atributos que lhe so comuns de PESSOA;
A utilizao do conceito de agregao para demonstrar que neste exemplo,
MATRIA e TURMA so partes de CURSO.
Bibliografia
Elmasri, Ramez, e Navathe S.B., Sistema Gerenciador de Banco de Dados,
Editora LTC, 3 edio, 2000, Rio de Janeiro.
Korth, H.F. e Silberschatz, A.; Sistemas de Bancos de Dados, Makron Books, So
Paulo, 1994.
Date, C.J.; Int. a Sistemas de Bancos de Dados, Editora Campus, 1999, Rio de
Janeiro.
Furlan, Jos Davi, Modelagem de Objetos atravs da UML, Makron Books, So
Paulo, 1998.
Jos Ferreira Prata (jose@infortex.com.br) formado em Administrao de
Empresas, mestre em Engenharia Eltrica com nfase em Computao pela
Universidade Mackenzie, professor das disciplinas de banco de dados, linguagem de
programao, engenharia de software e anlise orientada a objetos no Centro
Universitrio Uninove, Universidade Bandeirantes, Universidade Santo Amaro e
Faculdade So Luis.
Dados de natureza
espacial e o Oracle
Spatial
Com esta matria iniciamos uma srie de artigos sobre dados de natureza
espacial e sua manipulao em sistemas de informaes geogrficas (SIG ou GIS).
Neste primeiro artigo apresentaremos os conceitos bsicos do geoprocessamento e
mostraremos que os dados de natureza espacial j so suportados pelo Oracle. Nos
artigos que seguiro esta srie, mostraremos as tcnicas de modelagem desses
dados e terminaremos com um artigo que mostrar ao leitor algumas utilidades e
aplicaes para os SIGs.
Ao citarmos o termo dados espaciais muitas pessoas imaginam que so dados
oriundos do espao sideral, e no que so dados de natureza espacial. O espao
ento aqui referido o espao fsico que nos cerca, a superfcie da Terra, dos
continentes, dos pases, dos estados, das cidades, dos bairros ou das regies
poltico-administrativas de um pas, por exemplo.
O mundo do geoprocessamento
Segundo Rodrigues, geoprocessamento pode ser definido como o conjunto de
tecnologias de coleta e tratamento de informaes espaciais, e o desenvolvimento,
e uso, de sistemas que as utilizam. Para tratamento de dados geogrficos e de
localizao, necessitamos geocodificar tais dados. Rodrigues definiu geocodificar
como prover referncias espaciais passveis de tratamento automatizado. Para tal
tratamento automatizado, podemos classificar os dados que sero armazenados
nos sistemas computacionais como alfanumricos e espaciais, sendo que uma
entidade do mundo real pode possuir ambos tipos de dados associados a seus
atributos.
Dados alfanumricos so os associados a caractersticas descritivas dos seres ou
das coisas do mundo real, como nome, endereo, cdigo, salrio e etc; a grosso
modo so dados cujos valores esto no domnio dos caracteres e nmeros.
J os dados espaciais so aqueles que possuem uma referncia espacial. A
referncia espacial aqui referida a localizao do dado e sua representao. A
localizao est relacionada a um sistema de referncia, ou seja, de coordenadas.
O leitor pode fazer por exemplo uma simples aluso ao plano XY to famoso
durante o perodo escolar. A Figura 1 exemplifica a localizao de um ponto sobre
um plano XY.
O Oracle Spatial
O Spatial um cartucho, como a prpria Oracle o define, que pode ser agregado
ao banco (na verso enterprise) para estend-lo disponibilizando tipos e funes
para o tratamento dos dados espaciais. Em outras palavras, o Spatial disponibiliza
um conjunto de formas geomtricas para definio das colunas das tabelas para
representao espacial assim como funes que realizam consultas espaciais sobre
essas representaes.
Note que cada figura possui pontos em destaque, ou seja, para formar cada
geometria necessita-se apenas de um conjunto mnimo de pontos. Veja que para se
formar um retngulo, somente precisamos dos pares de coordenadas dos pontos do
canto inferior esquerdo e do canto superior direito do mesmo.
Veja que no foi feita ainda nenhuma referncia forma geomtrica que
representar o mercado em questo. Vamos agora analisar brevemente o tipo
SDO_GEOMETRY, que composto pelos seguintes atributos:
SDO_GTYPE: um nmero e indica o tipo de geometria. Esse nmero de
quatro dgitos composto pela estrutura dltt, onde:
o d indica a dimenso;
o l identifica o sistema de referncia linear. Um sistema de referncia
linear basicamente uma medida sobre uma linha, ou segmentos que
formam uma linha. Seria como pegar uma rgua, sobre uma linha reta
e marcar a localizao do ponto atravs de uma medida, por exemplo n
cm, e no a partir de um par de coordenadas (x,y). Para geometrias
que no usam referncia linear atribui-se 0 ao valor de l. Por exemplo,
podemos representar uma rodovia como uma linha, e para localizar um
ponto sobre a rodovia ao invs de informarmos latitude e a longitude
do ponto, podemos informar a posio do ponto em termos de
quilometragem, ou seja, se informamos o valor 22,5 queremos
localizar o ponto sobre o quilmetro 22,5. Lembre-se que a
representao de uma rodovia nem sempre uma reta.
o J o componente tt, que varia de 00 a 07, indica o tipo geomtrico. A
Tabela 1 mostra os tipos geomtricos atribudos aos cdigos tt.
SELECT A.GID
FROM POLYGONS A
WHERE
Vale ressaltar que aps popularmos uma tabela com dados espaciais
importante a criao de ndices espaciais sobre esses dados, e sempre que novos
O leitor deve estar imaginando como visualizar esses dados. A Oracle oferece o
Oracle Application Server MapViewer, uma API Java usada para visualizao.
insero grfica de dados numa base Oracle com Spatial. A Oracle fornece uma
http://www.oracle.com/technology/products/spatial/spatial_partners.htm
Concluso
Bibliografia
RODRIGUES, M. Introduo ao Geoprocessamento. In: SIMPSIO BRASILEIRO DE
GEOPROCESSAMENTO, 1., So Paulo, 1990. Curso Introdutrio. So Paulo: EPUSP,
1990. p1-26.
FREEMAN, J. The modelling of spatial relations. Computer Graphics and Image
Processing, n.4, p.156-171, 1975.
Configuraes iniciais
muito comum instalar o PostgreSQL atravs de pacotes RPM. Aps a instalao,
geralmente enfrentamos alguns problemas que podem ser resolvidos atravs de
uma boa leitura na documentao. Um dos primeiros problemas enfrentados a
tentativa de conexo de um cliente com o servidor. Uma das perguntas mais
frequentes dos iniciantes : Porque consigo conectar o PostgreSQL atravs do
console no servidor Linux, mas no de um terminal de rede? . O fato aqui que o
servidor de banco de dados vem totalmente protegido, e para liberar conexes
devemos editar alguns arquivos de configurao, so eles: pg_hba.conf e
postgresql.conf, ambos localizados na pasta data, dentro do diretrio onde foi
instalado o PostgreSQL.
Listagem 2. postgresql.conf
tcpip_socket = true
max_connections = 32
port = 5432
shared_buffers = 64
Organizao
Muitos programadores/DBAs costumam dividir seus sistemas em vrios
databases, principalmente quando o ambiente tem muitos departamentos. Como o
PostgreSQL no permite a criao de integridade referencial entre mltiplos
databases, aconselho criar apenas um database universal, ou teramos que
implementar a integridade no lado cliente, o que extremamente trabalhoso. A
partir da verso 7.3, foi introduzido o conceito de Schemas (ver abaixo),
possibilitando organizar nossos departamentos atravs de esquemas dentro de um
banco de dados. Por padro, todo database possui o esquema public, mas
recomendo a organizao dos objetos atravs de novos esquemas, com nomes
mais intuitivos.
Schemas
So organizaes lgicas dentro do database que permitem agruparmos as
tabelas por um namespace comum. Devemos tomar cuidado pois atravs desta
prtica podemos ter tabelas com o mesmo nome em Schemas diferentes, o que
pode gerar uma certa confuso nos selects. Em um caso como esse, o PostgreSQL
utiliza o conceito de search path para decidir qual tabela utilizar. Imagine a
seguinte situao:
Database: db_empresa.
Dividido nos schemas: public / sc_adm / sc_web / sc_cadastro /
sc_documentacao.
Se possuirmos duas tabelas chamadas tabcategoria, uma em sc_adm e outra em
sc_web, qual seria utilizada pela clausula SELECT * FROM tabcategoria ? A
resposta : a tabela utilizada ser a primeira a ser encontrada, seguindo-se a
ordem de pesquisa definida pelo search_path atravs do comando set search_path
= ....
Desde que comecei a trabalhar com Schemas, evito este tipo de conflito atravs
de uma anlise bem elaborada. No costumo utilizar o comando set para adicionar
Schemas no search_path, pois isso faz com que o PostgreSQL tenha que pesquisar
em Schemas aos quais j sabemos que a tabela no se encontra. Ao invs disso, na
construo do comando SQL, especifico explicitamente qual o esquema a ser
utilizado, por exemplo: SELECT * FROM sc_adm.tabcategoria.
Sequences
So os campos tipo auto incremento, tambm conhecidos como identity no
MSSQL. Eles so implementados no PostgreSQL da seguinte forma: primeiro
criamos um objeto do tipo sequence, e no valor default do campo utilizamos a
funo nextval com a seguinte sintaxe: nextval ('schema."sequence name"'::text).
No comeo, critiquei muito essa abordagem, mas depois percebi que um conceito
excelente, principalmente quando estamos migrando de um SGBD para outro. Isto
por que permite re-iniciar a sequncia, mudar a razo de incremento e configurar
os valores mnimos e mximos com extrema facilidade.
String de conexo
Podemos perceber (ver Listagem 3) que a string de conexo algo imenso e
assustador, mas tem seu lado bom. Podemos configurar vrios aspectos
relacionamos interao entre nossos componentes e o SGBD. Chamo a ateno
para o parmetro BoolsAsChar: geralmente ele vem configurado de uma maneira
no muito agradvel para os programadores Delphi, trazendo os campos Boolean
como se fossem Strings. Para corrigir isso, mude o valor do parmetro de 1 para 0.
Strings SQL
Existem algumas diferenas bsicas entre o SQL praticado no PostgreSQL em
relao a outros bancos de dados. A Tabela 2 mostra algumas variaes na
construo dos comandos select.
Descrio PostgreSQL
Limitando o retorno SELECT * FROM tabcliente LIMIT 100;
do resultado.
Lista de SubSelect SELECT * FROM tabcliente
1 WHERE id_clt IN (SELECT id_clt FROM tabpedido);
Lista de SubSelect SELECT * FROM tabcliente, tabpedido
2 WHERE tabcliente.id_clt = tabpedido.id_clt;
Final de Instruo Com ADO, o ; pode causar uma diferena de desempenho
SQL no retorno do conjunto de dados. Sempre utilize ; no final
dos seus comandos SQL.
Case/Accent- Crie seu banco com Latin1 e utilize as funes
insentive upper(to_ascii({name})) tanto no campo a ser pesquisado
quanto no valor do critrio.
Tabela 2: Diferenas em comandos select.
Componente ADOQuery
D preferncia ao componente ADOQuery ao invs do ADOTable em seus
projetos. Descobri, na prtica, que podem ocorrer erros de sintaxe em tabelas com
campos do tipo memo quando estes no esto posicionados no final da ADOQuery.
O problema tambm ocorre com o Visual Basic, e resolvido da mesma maneira,
ou seja, deixando os campos memo por ltimo.
Backup
Atravs do script CRON no servidor Linux, podemos agendar vrios tipos de
tarefas, inclusive programar a execuo de backups dos bancos de dados. No
PostgreSQL, um backup feito atravs das ferramentas pg_dump (realiza o backup
de um nico database) e pg_dumpall (realiza o backup de todos os databases do
SGDB) (ver Listagem 4). Ambos so utilitrios de linha de comando que geram
arquivos de backup que podem ser restaurados atravs dos utilitrios pg_restore
(restaura todas definies contidas no arquivo gerado pelo pg_dump ou
pg_dumpall) e psql (console SQL que serve para executar qualquer tipo de Query
no servidor).
Tunning
recomendado executar diariamente a rotina de limpeza de registros que no
so mais utilizados pelo banco. Essa rotina chamada de VACUUM, e visa evitar
perda de peformance no BD. Para esta tarefa, tambm recorremos ao CRON do
Linux, agendando a execuo da rotina preferencialmente noite, ou em um
horrio onde o SGBD no tenha muitos acessos. A Listagem 5 apresenta um
exemplo do comando a ser agendado.
Experincia do autor
com muita satisfao e segurana que recomendo a utilizao do PostgreSQL no
Linux, e por experincia, digo que um sistema robusto, confivel e gratuito. Ele
tambm engloba alguns conceitos de orientao a objeto, como a criao de
tabelas por herana, e permite criarmos novas funes alm das pr-definidas,
podendo estender os recursos do SGBD.
Hoje tenho seis sistemas migrados de dBase/MsSQL para PostgreSQL. A migrao
geralmente rpida, e depende basicamente do nvel de utilizao de recursos
como as stored procedures e triggers.
Tambm utilizo DataSnap, criando um servidor de aplicao e evitando assim a
necessidade da instalao do driver ODBC nos clientes. O mesmo servidor
DataSnap gerencia conexes para web atravs do Intraweb.
Outro ponto bastante interessante est no nosso site (www.socioambiental.org)
desenvolvido em Zope (ferramenta open source para gerenciamento de contedo
web) acessando PostgreSQL. Ele gerencia todo nosso sistema de e-commerce, alm
de fornecer notcias, manchetes, filiaes, entre outros recursos. Por isso, quando
digo que o PostgreSQL bom, estou opinando baseado em testes reais com
considervel carga de utilizao e dados. Atualmente estamos trabalhando com a
verso 7.3.4, mas j existem outras verses mais recentes.
Concluso
Apesar de alguns percalos tcnicos no inicio da utilizao do PostgreSQL, ele
oferece um custo beneficio satisfatrio em comparao a outros bancos como
MsSQL e Oracle. Acredito que com o surgimento de literatura esclarecendo as
principais dvidas dos programadores e DBAs, esse SGBD vai conquistar cada vez
mais adeptos.
Vale lembrar que periodicamente o PostgreSQL ganha novas verses que incluem
novas funcionalidades. Isto nos d uma segurana extra em relao ao suporte e
evoluo do projeto. J existem diversos grupos de discusso sobre a ferramenta
no Brasil e no exterior, ficando muito fcil encontrar ajuda para resolver grande
parte das dvidas. Tambm grande o nmero de componentes que oferecem
conexo com PostgreSQL em vrios ambientes de desenvolvimento e plataformas.
Espero que esse artigo lhe poupe de algumas dores de cabea. Se por acaso sua
dvida no estava englobada neste artigo, entre em contato comigo atravs para
que possamos resolv-la.
Referncias
Site oficial do PostgreSQL.
http://www.postgresql.org
Site oficial dos Desenvolvedores do PostgreSQL.
http://developer.postgresql.org
Site oficial do PGAdmin III
http://www.pgadmin.org/pgadmin3
Site oficial do driver ODBC
http://gborg.postgresql.org/project/psqlodbc
Grupo de discusso nacional do site Yahoo
http://br.groups.yahoo.com/group/postgresql-br
Centro de informao para usurios brasileiros
http://www.postgresql.org.br/
Comunidades PostgreSQL no Orkut
http://www.orkut.com/Community.aspx?cmm=1782
http://www.orkut.com/Community.aspx?cmm=29893&sid=13524124770919555
04