Você está na página 1de 52

N esta edio

ndices..............................................................06
A escrita de consultas SQL sempre um bom desafio. Principalmente para aqueles
que buscam desenvolv-las de forma a exigir menos recursos dos SGBDs. No
h uma frmula, receita de bolo ou algo parecido. preciso conhecer profun-
damente a linguagem de consulta, caractersticas prprias do SGBD em questo e mais
alguns detalhes tcnicos. O somatrio disto tudo permite a escrita de consultas melhor
Entendendo e utilizando ndices na otimizao elaboradas. Entretanto, isto no uma tarefa trivial. Pensando nisto, a SQL Magazine des-
de queries no SQL Server taca nesta edio um conjunto de dicas para uma escrita mais aperfeioada das consultas
SQL. uma viso que certamente ser novidade para muito de vocs, divirtam-se.
Tambm destacamos a apresentao do novo Firebird que, em sua verso 1.5, traz
consigo um grande conjunto de novidades. Muitas delas lidando com solicitaes de
desenvolvedores ou demonstrando o caminho a ser trilhado na sua evoluo. Para
apresentar estas novidades, contamos com o maior especialista em Firebird no Brasil,
16......................................................TreeMiner Carlos Cant. Neste contexto, tambm foi realizada uma entrevista com um dos de-
senvolvedores do Firebird e apresentada a construo de um tradutor de triggers entre
Uma Ferramenta para Explorao Visual de Dados Oracle e Firebird.
Em outro artigo bastante interessante, apresentada a evoluo do tratamento dis-
ponibilizado pelo Oracle para a consulta de dados hierrquicos. Ele traa as alteraes
ocorridas desde a verso 8i at a 10g utilizando exemplos para explicao das novidades
adicionadas.
Contamos ainda com mais trs artigos:
Criao de traces para acompanhamento do desempenho de um servidor SQL
Server;
Simulado........................................................22 Monitoramento de SGBDs, e
Projeto de Banco de Dados Resposta e comentrios Utilizao de objetos OLE atravs do SQL Server.

Para finalizar, desejo a todos vocs uma excelente leitura e, mais uma vez, nos coloca-
mos sua disposio para opinies, crticas e sugestes. Participem conosco, ajudem-nos
a trazer para a revista as informaes que vocs precisam.
Abraos,
Rodrigo Spinola
editor@sqlmagazine.com.br
24.................................Minerao de Dados
Introduo e Aplicaes

Coordenador Editorial Gerente de Produo


Gladstone Matos Vinicius Andrade
vinicius.andrade@clubedelphi.com.br
gladstone@clubedelphi.com.br
Gerente Geral
Editor Geral
Rosngela Mattos
Gustavo Viegas
JBuilderX........................................................34 gustavo@sqlmagazine.com.br Publicidade
Julio Csar Lopes
Manipulando Bases de Dados Equipe Editorial
julio@neoficio.com.br
XXXXXXXXXXXXXXXXXXXXXXXXX
Sergio Murilo
Assessoria de Imprensa sergio@clubedelphi.com.br
Kaline Dolabella
Jornalista Responsvel
kaline@sqlmagazine.com.br
Srgio Moraes C. Brando
Consultoria Editorial Mtb: 15183-68-148
Rodrigo Oliveira Spnola
40..............................................................FMDB
Atendimento ao Leitor
rodrigospinola@yahoo.com.br
Cintia Ferreira
Articulistas desta edio
Explorando visualmente informaes em grandes Mrcio O. Almeida, Marcos Kalinowski,
info@sqlmagazine.com.br
(21) 2283-9012
bases de dados utilizando a ferramenta FMDB Caetano Traina Jr, Agma J. M. Traina,
Assinaturas
Humberto Razente e Maria C. N. Barioni
assinaturas@sqlmagazine.com.br
Traduo e Reviso
Publicao de artigos
Anna Beatriz
gustavo@sqlmagazine.com.br
abeatriz@visualnet.com.br
Na Web
Editor de Arte
www.sqlmagazine.com.br
Tarcsio Bannwart
Entrevista......................................................46 tarcisio@onda.com.br Distribuio
Fernando Chinaglia Dist. S/A
Alex Freitas Diagramao
Rua Teodoro da Silva, 907
Guilherme Bresser
Graja - RJ - 206563-900
guilhermebresser@hotmail.com
Reviso
Edison Costa Apoio
edison@sqlmagazine.com.br
Capa
Andr Pinto
andregpinto@terra.com.br ASSESPRO
MKT - Borland
Atualize-se com as
A Borland Conference oferece ao mercado brasileiro todas as novidades do setor de TI, apresentando o
caminho ideal para que as empresas tenham maior produtividade e competitividade no panorama atual e
futuro. Sucesso absoluto nas edies anteriores, com lotao mxima e alto ndice de aprovao, a Borland
Conference traz, mais uma vez, a unio de um contedo nico a grande estrutura montada em conjunto com
a COMDEX, para um pblico extremamente qualificado.

ltimas novidades Algumas apresentaes da Borland Conference


Melhores prticas em desenvolvimento de software O futuro do Delphi
O futuro da Plataforma Windows/.NET - Longhorn(Windows), Whidbey(.Net 2.0),Yukon(SQL Server)
Java Server Faces Novidades de UML 2.0 Solues Mobile Processos e Metodologias
Banco de Dados sem Administrao Automao e controle de testes Otimizando seu Cdigo Java
Ferramentas para Controle de Outsourcing CMMI Utilizando o ALM Borland Delphi - dicas e truques

do mercado de TI
Define/Design/Test Tecnologia RAD/.NET Tecnologia Java Outras Tecnologias
Together Delphi JBuilder Histrias de Sucesso
CaliberRM C++Builder J2EE InterBase
StarTeam Kylix J2ME JDataStore
Optimizeit Suite C#Builder Framework Integrao (J2EE-.NET)
Optimizeit.NET .NET Struts + JSF WebServices
Optimizeit Server Trace Bold BES Wireless
CMMI MDA

III Borla
nd Conference
Br

17 a 20 de Agosto de 2004 no Anhembi


asil

www.borland.com.br

Organizao Apoio
P
O
roler
Parte I Criando uma trace
para anlise de performance
de um servidor SQL Server
Paulo Ribeiro

s sistemas normalmente no nascem lentos, mas ten-


dem a ficar mais lentos com o tempo. O aumento do
nmero de usurios, a existncia de mais processos
concorrentes, o crescimento do volume de informao armaze-
nada, a falta (ou excesso) de ndices e, por fim, a m qualidade do
Na tela principal do Profiler, selecione File | New | Trace (ver
Figura 2).
O prximo passo ser fornecer uma conta com privilgios
de system administrator (=SysAdmin) para realizar a trace (ver
Figura 3). SysAdmin um papel especial, que configura autoridade
cdigo T-SQL so alguns fatores que ocasionam o aparecimento mxima ao proprietrio da conta. Um cuidado especial deve ser
de gargalos e, consequentemente, queda de performance. tomado com relao performance: um monitoramento pro-
Antes de pensar que o problema vem de fora e cogitar em longado em servidores j sobrecarregados pode comprometer
aumentar o poder de fogo do processador, discos ou memria, seu desempenho.
cabe uma anlise mais detalhada dos processos ativos no servidor Se voc no tem acesso conta sa e est em dvida com relao
de banco de dados. Muitas vezes todo o problema pode ser resol- aos privilgios de sua conta, abra uma sesso no Query Analyzer
vido com a adio de um ndice ou filtro num comando update. e execute o comando .. sp_HelpSrvRoleMember SysAdmin para
Mas como saber exatamente onde est o problema? verificao dos usurios que possuem privilgio SysAdmin. Voc
O SQL Server 2000 possui um utilitrio chamado Profiler, dever encontrar o usurio informado anteriormente (ou grupo
indicado para rastreamento dos eventos processados numa base do Windows NT, no caso de logon com segurana integrada)
SQL Server 2000. O Profiler uma ferramenta de diagnstico, na listagem do comando. A Figura 4 ilustra a execuo desse
ou seja, ela nos fornece material para anlise. Vale destacar que comando.
ela no se prope por si s a efetuar correes ou qualquer F1
espcie de tuning.

Nota: Considere um evento como qualquer ao gerada pelo engine do


banco. A abertura de uma conexo, a execuo de um comando select, a aber-
tura de um cursor e a execuo de uma procedure so alguns exemplos.

O Profiler uma ferramenta que consegue ser simples e ao


mesmo tempo complexa, devido ao universo de possibilidades Selecionando o Profiler no sub-menu do Microsoft SQL Server.
para monitoramento. Se quisermos monitorar queries, deve- F2
mos selecionar um tipo de evento. Para efetuar uma anlise de
deadlocks, existe outra classe de eventos que deve ser selecionada.
Nessa primeira etapa aprenderemos alguns aspectos bsicos do
funcionamento do Profiler, navegando por suas telas para criar
uma trace.

Criando uma trace passo-a-passo


O Profiler uma ferramenta utilizada para criar traces.
Como analogia, considere uma trace criada pelo Profiler
como uma fotografia dos comandos executados pelo SQL
Server 2000 em um determinado intervalo de tempo. Para criar
uma trace, selecione Profiler no sub-menu do SQL Server (ver
Figura 1). Criando um trace no Profiler.

6
SQL - Magazine

F3 F6
da. Corresponde ao servidor
autenticado no passo anterior
(\\SrvTeste) ;
Template Name: nome
do modelo da trace. Quando
criamos uma trace, selecio-
namos determinados tipos
de eventos que desejamos
analisar. Para que no preci-
semos informar sempre os
mesmos eventos ao criar uma
Tela de logon no servidor onde ser realizada nova trace, salvamos modelos
a trace. chamados templates. Existem
Caso tente criar uma trace e no tenha o alguns templates pr-defini-
privilgio devido, a mensagem da Figura 5 dos, o SQLProfilerStandard
ser apresentada. um deles. A Tabela 1 fornece
Considerando que voc tenha os uma descrio resumida dos
privilgios necessrios e tendo efetua- templates existentes.
do a autenticao com sucesso, a tela Template file name: cami-
para Configuraes Gerais da trace apre- nho do arquivo de template Configurao Geral da Trace.
sentada (ver Figura 6). utilizado, cuja extenso
As opes disponveis so: .TDF. Ao selecionar um template que voc Set maximum file size (MB): informa o
criou, Template Name automaticamente tamanho mximo do arquivo em disco
Trace Name: nome da trace (=Tra- alterado para Custom Template. gerado pela trace. Ao atingir esse limite
ce_Exemplo); Save to file: grava o resultado da trace a gravao em arquivo suspensa mas o
Trace SQL Server: identificao do num arquivo em disco com extenso monitoramento continua ativo na tela
servidor onde a trace est sendo executa- .TRC. do Profiler.
F4 Enable file rollover: se o rollover estiver
Exec sp_HelpSrvRoleMember SysAdmin
habilitado e o arquivo atingir o limite
ServerRole MemberName MemberSid
definido em Set maximum file size (MB),
Sysadmin BUILTIN\Administrators 0x01020000000000052000000020020000
o arquivo em disco ser reinicializado.
Sysadmin sa 0x01
Sysadmin PauloRibeiro 0x7CBDA5F0F790C842BA0A0E80D784
Neste caso, perde-se o que foi registrado
em arquivo at esse momento.
Comando sp_HelpSrvRoleMember
Server processes SQL Server trace
F5 data: se um dia voc se deparar com a li-
nha de texto em sua trace ... some events
may have been lost ...., isto quer dizer que
o servidor est muito ocupado e optou
por no enviar alguns comandos para
sua trace para ganhar algum flego de
processamento. Habilitando essa opo,
Usurio que no possui privilgio para execuo da trace. voc estar forando o servidor a enviar
T1
Nome do Template Para que serve todos os comandos processados para a
SQLProfilerStandard Trace genrica; rastreia comandos executados com sucesso no servidor. trace, mesmo causando perda de perfor-
SQLProfilerTSQL Utilize para visualizar os comandos T-SQL startados no servidor mance. Recomendo no utilizar.
Utilize para obter uma trace de comandos processados no servidor Save to table: grava o resultado da
SQLProfilerTSQL_Duration
ordenados por tempo de execuo. trace numa tabela. Com o resultado da
Lista os comandos startados com sucesso no servidor, ordenados por trace numa tabela, podemos estabelecer
SQLProfilerTSQL_Group
ApplicationName, NTUserName, LoginName e ClientProcessId
SQLProfilerTSQL_Replay Utilizada para gravao de traces para posterior replay(1).
novos filtros ou ordenaes que acharmos
Utilizado para visualizao dos comandos T-SQL executados internamente
interessantes no processo de depurao
SQLProfiler_SPs
nas sps. de comandos. Podemos selecionar, por
SQLProfilerTuning
Utilizado na gerao de eventos para posterior anlise pelo Index Tuning exemplo, todos os comandos emitidos
Wizard(2)
por determinado usurio, ou ordenar os
(1) Replay uma feature que permite simular a execuo dos comandos gravados previamente por comandos por tempo de execuo.
uma trace. O objetivo comparar duas execues antes e aps a implementao de correes.
(2) O Index Tuning Wizard uma ferramenta disponvel na opo Tools do Profiler e se prope a Set maximum rows (in thousands):
analisar traces, recomendando a criao de ndices e estatsticas para aumento de performance. limita o nmero de linhas na tabela ori-

7
P roler Parte I Criando uma trace para anlise de performance de um servidor SQL Server

F7 por exemplo, seleciona automaticamente F9


alguns eventos vistos na Tabela 2.
A prxima etapa ser definir que tipo de
informao queremos visualizar na trace.
O template SQLProfilerStandard j seleciona
uma srie de colunas, mas para deixar a tela
do Profiler mais enxuta, excluiremos as
colunas LoginName e, mais abaixo, Client-
ProcessesId. Clique na coluna e depois em
<< Remove (ver Figura 8).
Finalizamos a definio da trace na guia
Filters (ver Figura 9), utilizada para refino
da trace. A aplicao Profiler, para mostrar
Criando filtros para a trace
na tela os comandos processados pelo
servidor SQL Server, responsvel por uma EventClass: os eventos rastreados pelo
Configurando uma trace - Guia Events.
srie de comandos que so tambm pro- Profiler so agrupados em classes. Assim,
F8 cessados pelo engine do banco. Para evitar existem eventos que registram a execu-
que esses comandos apaream na trace, o batchs, outros que sinalizam o logon
ligamos o filtro ApplicationName Not Like de usurios, etc. Na figura 10, o evento
Profile. Filtros so utilizados para limitar ExistingConnection serve para informar que,
os eventos rastreados na trace, reduzindo no momento em que a trace foi iniciada,
o nmero de linhas afetadas, facilitando existia somente uma conexo TCP-IP ativa
nossa compreenso e melhorando o foco no servidor, representada pelo spid 60;
de nossa anlise. Poderamos, por exemplo, TextData: utilizada para visualizao
filtrar somente os comandos executados do dado coletado na trace. Essa coluna
por um determinado spid. Se desejssemos depende do tipo de evento capturado.
analisar a execuo de uma stored proce- Na Figura 10, a coluna TextData apre-
dure em particular, poderamos concentrar senta algumas informaes relativas
nossa anlise somente nas execues dessa conexo (protocolo utilizado, configura-
sp, utilizando tambm os recursos de filtros es atuais, etc);
(nesse caso, o filtro ObjectId armazenaria ApplicationName: nome da aplicao;
Seleo das colunas que sero visualizadas no o Id da trace que queremos analisar). LoginName: login do usurio respons-
Profiler. Concludo o processo de definio, cli- vel pela execuo do comando;
que em RUN (ver Figura 9) para iniciar CPU: tempo consumido de CPU para
ginada pela trace. Assim como acontece a trace (ver Figura 10). execuo do comando (em milissegun-
quando Set maximum file size est ativo, Um resumo do significado das colunas dos);
ao atingir a quantidade de linhas confi- apresentadas na Figura 10 apresentado Reads: nmero de pginas lidas em me-
guradas nesse parmetro a trace deixar a seguir: mria para executar o comando;
somente de gravar dados na tabela os T2
Classe Evento Para que serve
comandos continuaro sendo enviados Security Audit Audit Logon Auditar abertura de sesses no banco.
para a console onde o Profiler estiver Audit Logoff Auditar encerramento de sesses no banco.
sendo executado. Sessions Existing Connections
Lista todas as conexes ativas no banco no momento em que
Enable trace stop time: estabelece a trace iniciada.
Lista a execuo de sps originadas por conexes remotas
prazo limite para trmino da trace. Stored Procedures RPC: Completed
(ADO, ODBC, OLEDB, etc).
As Opes Gerais sero mantidas sem al- Lista as queries executadas fora do contexto de uma stored
TSQL SQL:Batch Completed
terao num primeiro momento. Seguimos procedure
agora para a guia Events (Ver Figura 7).
A guia Events apresenta uma relao de F10
todas as classes de eventos que podem ser
monitorados num servidor de banco de
dados SQL Server 2000. Nesse contexto,
classes so agrupamentos de eventos que
possuem uma caracterstica em comum:
temos uma classe para controlar execuo
de procedures, outra para gerenciamento de
locks, etc. O template SQLProfilerStandard, Tela para monitoramento do Profiler

8
SQL - Magazine

L1
Comandos que sero visualizados no Profiler Carregar uma trace gravada numa tabela
no banco. Para isto clique em .
use NorthWind
go Acessar a tela de configuraes gerais da
create procedure stp_Mostrar_Pedido (@OrderId int)
trace aquela da Figura 6. Para isto utilize
as o cone de propriedades .
select o.OrderId, o.CustomerId, o.EmployeeId, d.ProductId, d.UnitPrice,d.Quantity
from Orders o
Procurar por uma determinada string na
inner join trace que voc acabou de gerar. Para isto,
[Order Details] d
on o.OrderId = d.OrderId utilize o binculo .
where o.OrderId=@OrderId
RETURN
Efetuar uma limpeza na tela. Para isto
utilize a borracha .
go
Dirija-se agora ao Profiler e confirme o
exec stp_Mostrar_Pedido 10249 resultado (ver Figura 11).
go

Agora um teste prtico. Com o Profiler


Writes: nmero de pginas gravadas Iniciar a trace novamente. Para isto ativo, abra uma sesso no Query Analyzer
pelo comando; clique em . e execute a seqencia de comandos da
Duration: durao do comando (em Iniciar uma nova trace, efetuando toda Listagem 1.
milissegundos); a parametrizao novamente. Para isto Analisando os eventos gerados na tela do
SPID: identificao da sesso no SQL clique em . Profiler, verificamos que:
Server; Trocar o template SQLProfilerStandard Ao iniciar a trace, a nica conexo
Start Time: horrio de incio da execuo por outro. Para isto clique em . existente no banco era do usurio sa,
do comando. Carregar uma trace previamente na conexo de spid igual a 60. O evento
gravada em arquivo .TRC (opo Save ExistingConnection tem por finalidade
Atravs desta interface possvel: To File na tela de Configuraes Gerais da mostrar todas as conexes ativas no banco
Parar a trace. Para isto clique no boto Trace, na Figura 6). Para isto clique no no incio da trace. Vale uma nota aqui: o
. cone . filtro ApplicationName not like SQL Profiler

9
P roler Parte I Criando uma trace para anlise de performance de um servidor SQL Server

F11 xo local e no remota ; em c:\Templates, poderamos carreg-lo


A execuo da procedure para gerao de uma nova trace na guia
stp_Mostrar_Pedido consu- Properties, selecionando o arquivo .tdf em
miu 16 milissegundos de Template File Name, sob a configurao Use
CPU, efetuou 100 leituras the following trace template (ver Figura 6)
lgicas, no gravou nenhu- . Note que essa opo NO grava o resul-
ma informao (Writes=0) e tado da trace, apenas sua configurao.
levou 16 milissegundos para Trace File: salva um arquivo em disco
ser executada. com a extenso .trc com o resultado da tra-
ce. Nesse arquivo estaro gravados todos
Gravando a Trace os comandos capturados pela trace, que
Porque gravaramos uma podero ser analisados na prpria tela do
trace? Traces normalmente Profiler, na opo File|Open|Trace File.
so extensas; No difcil Trace Table: armazena o resultado da
passarmos mais de um dia trace numa tabela. Gravar o resultado da
Resultado da execuo de comandos na console do Profile
analisando suas queries. trace numa tabela uma prtica bastante
F12
S esse fator j justificaria til pois viabiliza a utilizao de comandos
sua gravao. Outras vezes select para filtrar ainda mais a trace que
gostaramos de refinar um estamos analisando. Como exemplo, se
pouco mais o resultado do gravssemos uma trace na tabela de nome
Profiler. Gravando a trace trace_sqlmag, poderamos facilmente le-
numa tabela, conseguimos vantar os trs batchs com maior tempo
facilmente ordenar, excluir de execuo com o comando apresentado
ou mesmo estabelecer fil- na Listagem 2.
tros adicionais e, depois SQL Script : gera um arquivo-texto
ento, recarregar a trace (extenso .sql) com o lote de comandos
enxuta para a console. T-SQL necessrios para criar e executar a
Por ltimo, o Index Tuning trace. Atravs desse arquivo, poderamos
Salvando a trace
Wizard, utilitrio para efetu- iniciar a trace fora dos limites do Profiler
suprimiu a conexo do Profiler. ar tuning de uma base SQL Server, requer por exemplo partir do Query Analyser.
O Evento ExistingConnection no popula que o workload esteja previamente gravado A gerao de scripts utilizada quando
as colunas CPU, Reads, Writes e Dura- em arquivo ou tabela. existe a necessidade de executarmos uma
tion. Por isso, aparecem em branco na Para gravar a trace, siga at a opo File trace automaticamente, ou em horrios
console. Para saber as colunas populadas da barra de menu e escolha Save As (ver pouco convidativos. Na prxima edio,
por cada tipo de evento, procure por Figura12). entraremos em mais detalhes sobre esse
Events no Books On Line (=BOL) O BOL As opes disponveis para salvamento procedimento.
pode ser encontrado em Iniciar\Progra- da trace so:
mas\Microsoft SQL Server\Books On Line. Trace Template: utilize para gerar um Concluso
A parte inferior da console destaca o template (arquivo com extenso .tdf, de Quando o assunto tuning, o Profiler
comando da linha TextData na linha do Template Data File). Como vimos anterior- uma ferramenta indispensvel. No prximo
cursor ; mente nesse artigo, um template serve nmero continuaremos esse assunto e nos
Note que a linha de execuo da stored para armazenar a parametrizao da trace, aprofundaremos nos principais eventos
procedure stp_Mostrar_Pedido aparece indicando quais eventos, colunas e filtros que devem ser analisados tendo em vista a
como SQL:Batch Completed e no como que foram aplicados. Se gravssemos um otimizao de processos. At l!
RPC:Completed por se tratar de uma cone- template com o nome SQLMag_Ed11.tdf
S
Faa o download e comente essa
L2
select top 3 Duration,LoginName,TextData matria em:
from trace_sqlmag www.sqlmagazine.com.br/sql11
where eventclass=12 --SQL:BatchCompleted
and duration > 0
order by duration DESC A
--------------------------------------------------------------------- Paulo Ribeiro
Duration LoginName TextData (psribeiro@hotmail.com) Microsoft
MCDBA e membro da equipe editorial
1500 SQLMag\UserSQL EXECUTE msdb.dbo.sp_sqlagent_get_perf_counters
da SQL Magazine. Atua como DBA
300 Sa insert into groupContents select DISTINCT
snior em SQL Server na Livraria e
250 Sa drop index groupcontents.PK_groupcontents Papelaria Saraiva S/A.

10
SQL - Magazine

11
E
A
voluo
das consultas hierrquicas
do Oracle 9i ao 10g.
Thiago Avelar

lguns aplicativos utilizam dados hierrquicos. Como


exemplo temos aqueles que necessitam manipular
organogramas, lista de materiais de uma fbrica de
montagem ou rvores genealgicas. Esses tipos de informao
so representados de forma mais conveniente em uma estrutura
da hierarquia. Perceba tambm que a hierarquia possui cinco
nveis. A Listagem 2 apresenta o cdigo necessrio para insero
destes dados na tabela Localidades.
Percebam que ao cadastrar o Brasil o cdigo pai no foi infor-
mado pois ele est no primeiro nvel da hierarquia.
de rvore e, apesar do modelo relacional no ter sido elabo-
rado para esse tipo de informao, eles podem ser facilmente Consultando os Dados
organizados em uma tabela relacional por meio do uso de uma O Oracle 9i possui duas clusulas que permitem uma leitura
relao de auto-referncia. completa dos dados de uma tabela com auto-relacionamento:
O Oracle fornece algumas extenses teis ao ANSI SQL para
manipulao dos dados hierrquicos representados em uma Connect By: responsvel por informar ao Oracle como o
tabela relacional. Com as extenses fornecidas, voc pode cons- auto-relacionamento ocorre. nela que informada qual coluna
truir operaes hierrquicas complexas em dados estruturados deve ser comparada coluna pai correspondente ao relaciona-
em rvore. Este artigo faz uma introduo aos dados hierrqui- mento. Nesta clusula, podemos utilizar a palavra reservada
cos abordando a criao de consultas no Oracle 9i e 10g.
L2
INSERT INTO LOCALIDADES (COD_LOCAL, NOM_LOCAL)
Como os dados so cadastrados? VALUES (1, Brasil);
Para analisarmos o funcionamento de relaes de auto-refe- INSERT INTO LOCALIDADES (COD_LOCAL, NOM_LOCAL, COD_LOCAL_PAI)
rncia, ser utilizado inicialmente como exemplo uma tabela VALUES (2, Rio de Janeiro, 1);
para cadastrar localidades de um pas (estados, cidades e bairros). INSERT INTO LOCALIDADES (COD_LOCAL, NOM_LOCAL, COD_LOCAL_PAI)
Perceba que um pas composto de vrios estados e estes estados VALUES (3, Rio de Janeiro, 2);
so compostos de vrias cidades e estas cidades possuem muitos INSERT INTO LOCALIDADES (COD_LOCAL, NOM_LOCAL, COD_LOCAL_PAI)
bairros, ou seja, um exemplo claro de hierarquia. Veja o cdigo VALUES (4, Jacarepagu, 3);

para criao da tabela na Listagem 1. INSERT INTO LOCALIDADES (COD_LOCAL, NOM_LOCAL, COD_LOCAL_PAI)
VALUES (5, Madureira, 3);
No cdigo acima, o campo Cod_Local_Pai chave estrangeira
do campo Cod_Local da mesma tabela. O auto-relacionamento INSERT INTO LOCALIDADES (COD_LOCAL, NOM_LOCAL, COD_LOCAL_PAI)
VALUES (6, Taquara, 4);
est definido. Em uma tabela de auto-relacionamento, no pri-
meiro nvel de uma hierarquia, o campo que se relaciona com a INSERT INTO LOCALIDADES (COD_LOCAL, NOM_LOCAL, COD_LOCAL_PAI)
VALUES (7, Freguesia, 4);
chave primria fica com o valor vazio. No nosso exemplo, esse
INSERT INTO LOCALIDADES (COD_LOCAL, NOM_LOCAL, COD_LOCAL_PAI)
campo COD_LOCAL_PAI. Veja na Figura 1 um exemplo de VALUES (8, So Paulo, 1);
como ficaria a organizao dos locais, sendo o Brasil o 1 nvel
INSERT INTO LOCALIDADES (COD_LOCAL, NOM_LOCAL, COD_LOCAL_PAI)
L1 VALUES (9, Paran, 1);

CREATE TABLE LOCALIDADES INSERT INTO LOCALIDADES (COD_LOCAL, NOM_LOCAL, COD_LOCAL_PAI)


( VALUES (10, Curitiba, 9);
COD_LOCAL NUMBER(5),
COD_LOCAL_PAI NUMBER(5), INSERT INTO LOCALIDADES (COD_LOCAL, NOM_LOCAL, COD_LOCAL_PAI)
NOM_LOCAL VARCHAR2(30), VALUES (11, gua Verde, 10);
PRIMARY KEY (COD_LOCAL),
FOREIGN KEY (COD_LOCAL_PAI) REFERENCES LOCALIDADES INSERT INTO LOCALIDADES (COD_LOCAL, NOM_LOCAL, COD_LOCAL_PAI)
(COD_LOCAL) VALUES (12, Batel, 10);
);

12
SQL - Magazine

F1
Deste modo, os passos seguidos na execuo da consulta da
Listagem 3 so:
1. verificada no 2 nvel da hierarquia a existncia de pelo
menos um n;
2. Existindo ns, a pesquisa comea pelo n mais
esquerda;
3. Os dados do n so retornados e se o mesmo tiver ramifica-
es, os dados dos ns posteriores so retornados obedecendo
ordem de pesquisa que da esquerda para a direita;
4. Ao terminar a pesquisa do n mais esquerda, sero retor-
nados os dados do segundo n do 2 nvel;
5. A pesquisa termina ao chegar no ltimo n da rvore
hierrquica.
F2
Nota: importante o leitor atentar para o uso da palavra PRIOR.
Seu uso no obrigatrio, mas o efeito de no us-lo bastante diferente.
Isto por que a clusula PRIOR garante a ligao com a linha anterior
da hierarquia. Sem o seu uso, apenas o primeiro elemento da hierarquia
recuperado. Por exemplo, para a consulta apresentada na Listagem 3
sem o PRIOR, teramos como resultado apenas o n Brasil.

A Pseudocoluna Level
Ao utilizar a clusula Connect By em um comando SQL,
possvel verificar o nvel hierrquico do registro listado. Para
isto temos a coluna Level, exemplificada na Listagem 4 e na
Figura 3.
O uso desta coluna importante, por exemplo, quando qui-
sermos filtrar o resultado da pesquisa. A Listagem 5 apresenta

L3
SELECT COD_LOCAL, NOM_LOCAL, COD_LOCAL_PAI
prior que responsvel por manter uma referncia para o nvel FROM LOCALIDADES
ancestral da hierarquia. CONNECT BY PRIOR COD_LOCAL = COD_LOCAL_PAI
START WITH COD_LOCAL_PAI IS NULL;

Start With: informa ao Oracle em qual nvel inicial de


hierarquia os registros sero pesquisados. Sem esse comando, L4
SELECT LEVEL, COD_LOCAL, NOM_LOCAL
o Oracle no sabe quantos ramos existem na hierarquia impli- FROM LOCALIDADES
cando na considerao de cada registro como o nvel inicial da CONNECT BY PRIOR COD_LOCAL = COD_LOCAL_PAI
START WITH COD_LOCAL_PAI IS NULL;
hierarquia, tentando desta forma, gerar uma rvore hierrquica
para cada registro.
A Listagem 3 apresenta o cdigo para recuperar os dados da F3
tabela Localidades de acordo com a hierarquia presente no auto-
relacionamento. O resultado da consulta pode ser visualizada
na Figura 2.

No exemplo, informamos na clusula Start With que a pesquisa


dever ser iniciada pelos registros onde o cdigo pai da localidade
nulo (no nosso caso o nico existente o Brasil). Na clusula
Connect By, informamos que o auto-relacionamento se d com o
COD_LOCAL igual a COD_LOCAL_PAI. Neste caso, a palavra
reservada prior indica que o campo COD_LOCAL dever ser
procurado no nvel ancestral da hierarquia e comparado com o
valor de COD_LOCAL_PAI do registro atual.
Assim, o percurso seguido pela pesquisa comea no nvel
definido no comando Start With e percorrido linha a linha,
onde em cada nvel os ns so lidos da esquerda para a direita.

13
E voluo das consultas hierrquicas do Oracle 9i ao 10g.

uma consulta onde so retornados apenas os registros do terceiro F4


nvel da hierarquia, ou seja, as cidades. O resultado da consulta
pode ser visto na Figura 4.

Endentando o Resultado da Pesquisa


Para uma melhor visualizao da rvore hierrquica, podemos
utilizar a funo RPAD para endentar os registros de acordo com
seu nvel. O RPAD uma funo que possui 2 parmetros, o texto
que ser retornado pela funo e o espaamento da endentao.
A Listagem 6 apresenta um exemplo de uso da endentao e a
Figura 5, seu resultado. F5

Diferenas entre o Oracle 8i e Oracle 9i


No Oracle 8i, a clusula Connect By no pode ser utilizada
em uma consulta que possua Joins. No Oracle 9i, esta restrio
foi removida. A Listagem 7 apresenta um exemplo no qual sero
retornados os clientes que moram na cidade do Rio de Janeiro.
No Oracle 8i, a clausula Connect By s pode ser utilizada
com tabelas. J no Oracle 9i, ela pode ser utilizada com Vises
(Views), tabelas externas e outros objetos.
N o O r a c l e 9 i fo i c r i a d a u m a f u n o c h a m a d a
SYS_CONNECT_BY_PATH que pode ser usada para descre-
ver o caminho hierrquico de um registro. A funo possui dois
parmetros. O primeiro a coluna que conter a informao
F6

L5
SELECT COD_LOCAL, NOM_LOCAL
FROM LOCALIDADES
WHERE LEVEL = 3
CONNECT BY PRIOR COD_LOCAL = COD_LOCAL_PAI
START WITH COD_LOCAL_PAI IS NULL;

L6
SELECT RPAD( , LEVEL*5 5) || NOM_LOCAL AS LOCAL
FROM LOCALIDADES
CONNECT BY PRIOR COD_LOCAL = COD_LOCAL_PAI
START WITH COD_LOCAL_PAI IS NULL;

L7
para a qual o caminho ser especificado e o segundo o carac-
SELECT C.NOME, L.NOM_LOCAL
FROM LOCALIDADES L, CLIENTES C
tere que ser utilizado como separador dos nveis existentes
WHERE C.COD_CIDADE = L.COD_LOCAL no caminho. A Listagem 8 apresenta a consulta utilizada para
CONNECT BY PRIOR COD_LOCAL = COD_LOCAL_PAI
START WITH LEVEL = 3 AND UPPER(NOM_LOCAL) = RIO DE JANEIRO; listar as localidades e o caminho percorrido para alcan-la. Seu
resultado pode ser visto na Figura 6.
Vimos at aqui uma introduo s consultas hierrquicas e
L8 como o tratamento fornecido a elas evoluiu do Oracle 8i para o
SELECT NOM_LOCAL, SYS_CONNECT_BY_PATH(NOM_LOCAL, \)
AS CAMINHO 9i. A partir de agora discutiremos novos avanos acrescentados
FROM LOCALIDADES
CONNECT BY PRIOR COD_LOCAL = COD_LOCAL_PAI
na verso 10g do Oracle.
START WITH COD_LOCAL_PAI IS NULL;
Melhorias na Consulta Hierrquica do Oracle 10g
A partir de agora utilizaremos a tabela EMPLOYEE para
L9 apresentar as novidades que o Oracle 10g traz no tratamento
CREATE TABLE EMPLOYEE ( s consultas hierrquicas. A Listagem 9 apresenta o comando
EMP_ID NUMBER (4) CONSTRAINT EMP_PK PRIMARY KEY,
EMP_NAME VARCHAR2 (15) NOT NULL, para criao da tabela.
DEPT_ID NUMBER (2) NOT NULL, Observe novamente a limitao da chave externa (foreign key
MGR_ID NUMBER (4) CONSTRAINT EMP_FK REFERENCES
EMPLOYEE(EMP_ID), constraint) EMP_FK na coluna MGR_ID, que faz referncia
SALARY NUMBER 7,2) NOT NULL,
HIRE_DATE DATE NOT NULL); coluna EMP_ID da mesma tabela. Nesta tabela, MGR_ID repre-
senta a EMP_ID do gerente de um funcionrio.

14
SQL - Magazine

15
E voluo das consultas hierrquicas do Oracle 9i ao 10g.

Como vimos, at a verso 9i, as extenses hierrquicas do nando a visualizao confusa. A palavra-chave NOCYCLE pode
Oracle incluam a clusula START WITH CONNECT BY e ser usada na clusula CONNECT BY para eliminar esse erro
a pseudocoluna LEVEL. Ainda utilizando os recursos presentes (ver Listagem 14).
no Oracle 9i, o exemplo da Listagem 10 mostra os funcionrios A consulta acima reconhece que existe um ciclo, ignora-o
por ordem hierrquica e utiliza um recuo de linha para posicionar (como resultado da palavra-chave NOCYCLE) e retorna as linhas
os subordinados abaixo deles. como se no houvesse ciclos.
Os novos recursos de consulta hierrquica do Oracle 10g so:
Novo operador CONNECT_BY_ISCYCLE
o CONNECT_BY_ROOT s vezes, difcil identificar ciclos em dados hierrquicos. A
Novas pseudocolunas nova pseudocoluna do Oracle 10g, CONNECT_BY_ISCYCLE,
o CONNECT_BY_ISCYCLE poder ajud-lo a identificar facilmente os ciclos nos dados.
o CONNECT_BY_ISLEAF CONNECT_BY_ISCYCLE s poder ser usada juntamente
Novas palavras-chave com a palavra-chave NOCYCLE em uma consulta hierrquica.
o NOCYCLE A pseudocoluna CONNECT_BY_ISCYCLE retorna 1 se a linha
o SIBLINGS atual possui uma linha-filha que seja tambm uma linha-ances-
tral; caso contrrio, ela retornar 0. Veja a Listagem 15.
CONNECT_BY_ROOT
O operador CONNECT_BY_ROOT, quando aplicado a uma L10
coluna, retorna o valor daquela coluna para a linha raiz, ou seja, SELECT LEVEL, RPAD( ,2*(LEVEL - 1)) ||
EMP_NAME EMPLOYEE, EMP_ID, MGR_ID
agrupa o resultado pelo n pai. O exemplo da Listagem 11 mos- FROM EMPLOYEE
tra como o operador CONNECT_BY_ROOT usado. START WITH MGR_ID IS NULL
CONNECT BY PRIOR EMP_ID = MGR_ID;
Neste exemplo, o organograma criado a partir das linhas
LEVEL EMPLOYEE EMP_ID MGR_ID
que tm MGR_ID = 7839. Ou seja, qualquer funcionrio cujo ---------- -------------------- ---------- ----------
gerente seja 7839 ser considerado uma raiz para essa consulta. 1 KING 7839
2 JONES 7566 7839
Com isto, os funcionrios includos abaixo do organograma 3 SCOTT 7788 7566
sob essas razes sero exibidos no conjunto de resultados 4 ADAMS 7876 7788
3 FORD 7902 7566
juntamente com o nome de seu gerente. Assim, o operador 4 SMITH 7369 7902
2 BLAKE 7698 7839
CONNECT_BY_ROOT determina o primeiro n superior na 3 ALLEN 7499 7698
rvore para uma determinada linha agrupando os resultados 3 WARD 7521 7698
3 MARTIN 7654 7698
por ele. 3 TURNER 7844 7698
3 JAMES 7900 7698
2 CLARK 7782 7839
NOCYCLE 3 MILLER 7934 7782
No so permitidos ciclos em uma estrutura de rvore, no
entanto, alguns dados hierrquicos podem cont-los. O problema
que s vezes difcil identific-los e a construo hierrquica L11
START WITH CONNECT BY PRIOR reportar um SELECT EMP_NAME Employee, CONNECT_BY_ROOT EMP_NAME
erro se houver um ciclo nos dados. Top Manager
FROM EMPLOYEE
Para permitir que START WITH CONNECT BY START WITH MGR_ID = 7839
CONNECT BY PRIOR EMP_ID = MGR_ID;
PRIOR funcione apropriadamente mesmo com a presen-
a de ciclos, o Oracle 10g oferece uma nova palavra-chave, Employee Top Manager
-------------------- ------------
NOCYCLE. Se houver ciclos nos dados, voc poder utiliz-la JONES JONES
na clusula CONNECT BY e no receber o er ro SCOTT JONES
ADAMS JONES
mencionado anteriormente. FORD JONES
SMITH JONES
Os dados de teste que utilizamos na tabela EMPLOYEE no BLAKE BLAKE
tm nenhum ciclo. Para testar o recurso NOCYCLE, vamos ALLEN BLAKE
WARD BLAKE
introduzir um ciclo nos dados da tabela EMPLOYEE. Para fazer MARTIN BLAKE
isso, atualizamos a coluna MGR_ID do primeiro funcionrio na TURNER BLAKE
JAMES BLAKE
hierarquia (KING com EMP_ID=7839) com a EMP_ID de um CLARK CLARK
MILLER CLARK
funcionrio de nvel mais baixo (MARTIN com EMP_ID = 7654)
(ver Listagem 12).
Vejamos agora o que acontece se executarmos uma consulta
hierrquica. Perceba que voc receber um erro ORA-01436 L12
(ver Listagem 13). UPDATE EMPLOYEE
Alm do erro, observe que toda a estrutura da rvore (que SET MGR_ID = 7654
WHERE MGR_ID IS NULL;
inicia com KING) comea a se repetir abaixo de MARTIN tor-

16
SQL - Magazine

L13
SELECT LEVEL, RPAD( ,2*(LEVEL - 1)) || EMP_NAME EMPLOYEE, Observe que, como MARTIN gerente de KING neste conjun-
EMP_ID, MGR_ID
FROM EMPLOYEE to de dados e est tambm abaixo de KING na rvore, a linha de
START WITH EMP_ID = 7839
CONNECT BY PRIOR EMP_ID = MGR_ID;
MARTIN mostra o valor 1 para CONNECT_BY_ISCYCLE.
LEVEL EMPLOYEE EMP_ID MGR_ID
---------- -------------------- ---------- ---------- Nota: Para obter resultados corretos nas pesquisas subseqentes,
1 KING 7839 7654
2 JONES 7566 7839
devemos retornar os dados ao estado original, atualizando a MGR_ID
3 SCOTT 7788 7566 de KING para NULL.
4 ADAMS 7876 7788
3 FORD 7902 7566
4 SMITH 7369 7902 CONNECT_BY_ISLEAF
2 BLAKE 7698 7839
3 ALLEN 7499 7698 Em uma estrutura de rvore, os ns que no possuem filhos
3 WARD 7521 7698
3 MARTIN 7654 7698
so chamados de ns folha. CONNECT_BY_ISLEAF uma
4 KING 7839 7654 pseudocoluna que retorna 1 se a linha atual uma folha ou 0
5 JONES 7566 7839
6 SCOTT 7788 7566 caso contrrio. Veja exemplo da Listagem 16.
7 ADAMS 7876 7788 Este novo recurso pode ajudar a simplificar as instrues SQL
6 FORD 7902 7566
ERROR: que precisam identificar todos os ns folha. Sem a pseudocoluna,
ORA-01436: CONNECT BY loop in user data
para identific-los, voc provavelmente escreveria uma consulta
como a apresentada na Listagem 17.
SELECT LEVEL, RPAD( ,2*(LEVEL - 1)) || EMP_NAME
L14
EMPLOYEE, EMP_ID, MGR_ID
possvel simplificar ainda mais essa consulta com a nova
FROM EMPLOYEE pseudocoluna CONNECT_BY_ISLEAF, conforme mostrado
START WITH EMP_ID = 7839
CONNECT BY NOCYCLE PRIOR EMP_ID = MGR_ID;
na Listagem 18.
LEVEL EMPLOYEE EMP_ID MGR_ID
---------- -------------------- ---------- ---------- ORDER SIBLINGS BY
1 KING 7839 7654
2 JONES 7566 7839 A palavra-chave SIBLINGS foi introduzida no Oracle9i. No
3 SCOTT 7788 7566 entanto, faz sentido discut-la junto com os outros aprimora-
4 ADAMS 7876 7788
3 FORD 7902 7566 mentos do Oracle 10g. Uma consulta hierrquica com uma
4 SMITH 7369 7902 construo START WITH CONNECT BY PRIOR
2 BLAKE 7698 7839
3 ALLEN 7499 7698 exibe os resultados em uma ordem arbitrria, conforme mostra
3 WARD 7521 7698
3 MARTIN 7654 7698 o exemplo da Listagem 19.
3 TURNER 7844 7698 Como sempre, voc pode usar uma clusula ORDER BY para
3 JAMES 7900 7698
2 CLARK 7782 7839 ordenar as linhas de resultados da maneira que desejar. No entan-
3 MILLER 7934 7782 to, neste caso, o uso de uma clusula ORDER BY pode destruir

L15 L16
SELECT EMP_NAME, CONNECT_BY_ISCYCLE SELECT EMP_NAME, CONNECT_BY_ISLEAF
FROM EMPLOYEE FROM EMPLOYEE
START WITH EMP_ID = 7839 START WITH EMP_ID = 7839
CONNECT BY NOCYCLE PRIOR EMP_ID = MGR_ID; CONNECT BY PRIOR EMP_ID = MGR_ID;
EMP_NAME CONNECT_BY_ISCYCLE EMP_NAME CONNECT_BY_ISLEAF
--------------- ------------------ --------------- -----------------
KING 0 KING 0
JONES 0 JONES 0
SCOTT 0 SCOTT 0
ADAMS 0 ADAMS 1
FORD 0 FORD 0
SMITH 0 SMITH 1
BLAKE 0 BLAKE 0
ALLEN 0 ALLEN 1
WARD 0 WARD 1
MARTIN 1 MARTIN 1
TURNER 0 TURNER 1
JAMES 0 JAMES 1
CLARK 0 CLARK 0
MILLER 0 MILLER 1

17
E voluo das consultas hierrquicas do Oracle 9i ao 10g.

L20
as camadas hierrquicas dos dados exibidos, conforme mostra SELECT LEVEL, RPAD( ,2*(LEVEL - 1)) || EMP_NAME
EMPLOYEE, EMP_ID, MGR_ID
o exemplo da Listagem 20. FROM EMPLOYEE
START WITH EMP_ID = 7839
Como voc pode perceber, impossvel identificar a rela- CONNECT BY PRIOR EMP_ID = MGR_ID
o hierrquica entre as linhas. Para lidar com isto, utiliza- ORDER BY EMP_NAME;
mos a palavra-chave SIBLINGS. Ela utilizada em conjunto LEVEL EMPLOYEE EMP_ID MGR_ID
com uma clusula ORDER BY para ordenar o conjunto de ----- -------------------- ---------- ----------
4 ADAMS 7876 7788
resultados apropriadamente. A Listagem 21 apresenta um 3 ALLEN 7499 7698
2 BLAKE 7698 7839
exemplo deste cenrio. 2 CLARK 7782 7839
Perceba que BLAKE, CLARK e JONES so irmos hierrquicos 3 FORD 7902 7566
3 JAMES 7900 7698
e esto exibidos em ordem ascendente. Tambm so irmos 2 JONES 7566 7839
hierrquicos os descendentes de BLAKE ALLEN, JAMES, 1 KING 7839
3 MARTIN 7654 7698
MARTIN, TURNER e WARD. 3 MILLER 7934 7782
3 SCOTT 7788 7566
L17 4 SMITH 7369 7902
3 TURNER 7844 7698
SELECT EMP_ID, EMP_NAME, SALARY, HIRE_DATE 3 WARD 7521 7698
FROM EMPLOYEE E
WHERE NOT EXISTS
(SELECT EMP_ID FROM EMPLOYEE E1 WHERE E.EMP_ID = E1.MGR_ID);
L21
SELECT LEVEL, RPAD( ,2*(LEVEL - 1)) || EMP_NAME
EMP_ID EMP_NAME SALARY HIRE_DATE
EMPLOYEE, EMP_ID, MGR_ID
------- --------------- ---------- ---------
FROM EMPLOYEE
7369 SMITH 800 17-DEC-80
START WITH EMP_ID = 7839
7499 ALLEN 1600 20-FEB-81
CONNECT BY PRIOR EMP_ID = MGR_ID
7521 WARD 1250 22-FEB-81
ORDER SIBLINGS BY EMP_NAME;
7654 MARTIN 1250 28-SEP-81
7844 TURNER 1500 08-SEP-81
LEVEL EMPLOYEE EMP_ID MGR_ID
7876 ADAMS 1100 23-MAY-87
----- -------------------- ---------- ----------
7900 JAMES 950 03-DEC-81
1 KING 7839
7934 MILLER 1300 23-JAN-82
2 BLAKE 7698 7839
3 ALLEN 7499 7698
3 JAMES 7900 7698
3 MARTIN 7654 7698
L18 3 TURNER 7844 7698
3 WARD 7521 7698
SELECT EMP_ID, EMP_NAME, SALARY, HIRE_DATE 2 CLARK 7782 7839
FROM EMPLOYEE E 3 MILLER 7934 7782
WHERE CONNECT_BY_ISLEAF = 1 2 JONES 7566 7839
START WITH MGR_ID IS NULL 3 FORD 7902 7566
CONNECT BY PRIOR EMP_ID = MGR_ID; 4 SMITH 7369 7902
3 SCOTT 7788 7566
4 ADAMS 7876 7788
EMP_ID EMP_NAME SALARY HIRE_DATE
------- --------------- ---------- ---------
7876
7369
ADAMS
SMITH
1100 23-MAY-87
800 17-DEC-80
Concluso
7499 ALLEN 1600 20-FEB-81 Vimos neste artigo a utilizao das clusulas Start With e
7521 WARD 1250 22-FEB-81
7654 MARTIN 1250 28-SEP-81 Connect By em comandos SQL no Oracle para a pesquisa de
7844 TURNER 1500 08-SEP-81 registros em tabelas que possuem auto-relacionamento. O
7900 JAMES 950 03-DEC-81
7934 MILLER 1300 23-JAN-82 Oracle 10g aprimora ainda mais os j avanados recursos de
consulta hierrquica presentes na verso 9i do Oracle. Dentre
os novos recursos, destacam-se as maneiras fceis de identificar
L19 folhas e ciclos nos dados. A organizao de linhas irms fornece
SELECT LEVEL, RPAD( ,2*(LEVEL - 1)) || EMP_NAME uma excelente maneira de melhorar a legibilidade dos conjun-
EMPLOYEE, EMP_ID, MGR_ID tos de resultados. Os desenvolvedores j familiarizados com as
FROM EMPLOYEE
START WITH EMP_ID = 7839 construes hierrquicas do Oracle certamente acharo esses
CONNECT BY PRIOR EMP_ID = MGR_ID;
recursos muito teis.
LEVEL EMPLOYEE EMP_ID MGR_ID
------- -------------------- ---------- ----------
1 KING 7839 S
2 JONES 7566 7839 Faa o download e comente essa matria em:
3 SCOTT 7788 7566
4 ADAMS 7876 7788 www.sqlmagazine.com.br/sql11
3 FORD 7902 7566
4 SMITH 7369 7902
2 BLAKE 7698 7839
3 ALLEN 7499 7698 A
3 WARD 7521 7698
3 MARTIN 7654 7698 Thiago Avelar
3 TURNER 7844 7698
3 JAMES 7900 7698 (thavel@tutopia.com.br) desenvolvedor Delphi e Oracle
2 CLARK 7782 7839 Developer pela Gennari & Peartree Projetos e Sistemas.
3 MILLER 7934 7782

18
SQL - Magazine

19
M
A
onitorao
de sistemas de Banco de
Dados

Ricardo Lima Caratti

disponibilidade do banco um fator crtico para aplica-


es que manipulam bases de dados. Sistemas fora do ar
por alguns minutos podem causar o descontentamento
Monitorao intrusiva
Em muitos casos, necessrio obter informaes internas do
SGBD, como a quantidade de blocos ocupados por uma tabela
de milhares de usurios. Alm da infra-estrutura de hardware e ou como esses blocos esto distribudos. Essas informaes so
software projetada para garantir tal disponibilidade, necessria importantes e necessitam de um acompanhamento peridico.
a observao atenta e contnua do estado do SGBD. Neste artigo No entanto, sua obteno consome recursos do SGBD sendo
conheceremos algumas ferramentas de monitorao de banco necessrio o cuidado para no sobrecarreg-lo. Fica claro que
de dados. uma definio sensata da periodicidade em que as checagens sero
feitas fundamental. Outros exemplos comuns de monitorao
Mtodos de monitorao de banco de dados intrusiva so: fazer o acompanhamento das atividades de um
Atividades de monitoramento podem ser efetuadas de duas usurio ou grupo de usurios em particular para fins de depurao
formas: contnua ou sob demanda. Quando contnuas (ou pr- ou auditoria; fazer o acompanhamento em intervalos de tempo
ativas), as atividades buscam prever e evitar o surgimento de da taxa de crescimento de uma tabela e a avaliao do estado de
problemas. J as atividades por demanda (ou reativas) agem aps fragmentao dos grupos de arquivos do SGBD.
a identificao de um problema j ocorrido.
Um exemplo de utilizao do monitoramento por deman- Monitorao no intrusiva
da est relacionado a questes de desempenho. Imaginemos Como vimos, muito importante que o monitoramento no
que um novo mdulo de um aplicativo entrou em produo afete negativamente o desempenho do SGBD. Para isto, as ferra-
e em um dado momento o tempo de resposta do sistema mentas de monitorao devem aproveitar ao mximo os recursos
aumentou de forma no esperada. Nesse caso, poderia ser nativos de cada SGDB.
detectado que uma determinada consulta foi construda de Diversos fabricantes de bancos de dados disponibilizam in-
forma no otimizada. terfaces de programao para o desenvolvimento de mecanismos
O monitoramento pr-ativo consiste em fazer previses ba- de monitorao para seu produto. Atravs dessas interfaces
seadas em informaes estatsticas extradas do prprio SGBD e possvel obter informaes diretamente da estrutura de memria
do sistema operacional. De posse desses dados, ele deve decidir do SGBD com impacto mnimo de performance. A ORACLE, por
se h necessidade de executar uma ao que previna a parada exemplo, oferece a viso V$SESSION para verificar as sesses de
parcial ou total do sistema. Por exemplo, um monitor pr-ativo usurio conectados no SGBD. De forma similar, o MS SQL Server
pode detectar que uma tabela ir alcanar sua alocao mxima oferece a stored procedure sp_who.
e automaticamente estender essa alocao para que o sistema
continue funcionado. O que esperar de um sistema de monitoramento?
Embora o mtodo reativo tenha seu espao nas atividades Considerando o que foi apresentado at o momento, j
de monitorao, o mtodo pr-ativo , sem dvida, a forma possvel fazer uma projeo de um sistema de monitoramento.
mais eficaz de monitoramento no que tange a disponibilidade Porm, surgem algumas questes:
do SGBD. No entanto, preciso ter cuidado com a utilizao Quais dados sero coletados?
indiscriminada desses monitores, pois a verificao contnua Como fazer a coleta?
do sistema pode causar impacto negativo no desempenho do Como ser criado um repositrio centralizado para guardar
SGBD. Nesse contexto, a monitorao pode ser classificada em informaes?
intrusiva e no intrusiva, dependendo da interferncia que ela Como o SGBD ser acessado?
causa no sistema. Como essas informaes sero apresentadas?

20
SQL - Magazine

Na maioria dos livros e manuais de SGBD, um problema pode estar mais relacionado apresentados. Algumas caractersticas des-
monitorao um tema intimamente liga- aos recursos gerenciados por ele do que sas ferramentas so mostradas a seguir.
do a refinamento, ou seja, monitorar para pelo SGBD. Considere, por exemplo, um
otimizar performance. No entanto, sabe-se processo pesado sendo executado pelo Ferramenta da Quest Software
que o refinamento tende a ser muito mais usurio em horrio de pico (um antivrus, A Quest Software possui um conjunto de
eficiente na fase de projeto e desenvolvi- por exemplo). ferramentas que possibilitam ao DBA moni-
mento de um sistema do que durante a pro- A ampla gama de sensores de monito- torar e diagnosticar, em tempo real, vrias
duo. Ou seja, quando um sistema entra rao disponveis atualmente permite que condies de estado do SGBD. As principais
em produo, desejvel que ele j esteja fatores externos ao SGBD sejam tambm caractersticas dessas ferramentas so:
otimizado, restando para a monitorao o monitorados, como: Representao visual dos fluxos das
papel de identificar fatores que venham a Temperatura do ambiente: Caso exista atividades do SGBD;
comprometer sua disponibilidade. alguma falha no sistema de refrigerao, Suporte a monitorao de mltiplos
Pensando assim, um bom monitor pr- a temperatura poder subir de forma que servios de banco de dados ao mesmo
ativo tem como componente fundamental possa comprometer o funcionamento dos tempo;
o repositrio de dados. O principal objeti- computadores. Suporte a monitorao de sistema
vo desse repositrio indicar tendncias Umidade do ambiente: Ambientes operacional;
comportamentais do SGBD, como taxa muito midos podem prejudicar o fun- Suporte a identificao de gargalos;
de crescimento de usurios simultneos, cionamento do computador. Visualizao imediata de reas e situa-
taxa de crescimento de dados, consumo Temperatura interna da CPU: Por es problemticas;
de recursos do sistema e horrios de pico. mau funcionamento ou condies extre- Alerta de conteno de recursos de
Dessa forma, uma anlise temporal das mas, a temperatura da CPU poder subir SGBD;
informaes do repositrio poder apoiar para valores crticos. Assistente que ajuda em reparos e refi-
as tomadas de deciso do DBA. Temperatura dos Arrays de Discos: O namentos on-line;
Considerando que um DBA no est 24h uso intenso de I/O poder superaquecer Integrao com outras ferramentas
no ambiente de trabalho, um bom monitor os discos. para suporte a monitorao pr-ativa em
dever tomar aes para impedir a parada Falha em algum disco do Array: Os SGBD 24/7. Isso inclui envio de mensa-
do sistema sem a interveno imediata do atuais sistemas de array de discos possibili- gens ao DBA via celular, page ou e-mail;
DBA. Por exemplo, ao coletar a informa- tam realizar manutenes sem necessida- Apresentao detalhada de consultas
o de espao disponvel no disco, caso de de parar o sistema. Assim, monitorar em SQL ineficientes, utilizao de me-
o valor atual no esteja dentro do limite as condies dos discos importante e mria, utilizao de I/O, transaes e
considerado crtico, o monitor poderia efe- desejvel. bloqueios (locks).
tuar determinadas aes como enviar uma Fontes de alimentao: Computadores
mensagem de alerta para o DBA ou remo- projetados para alta disponibilidade vm A Figura 1 apresenta a interface principal
ver arquivos temporrios para liberar mais com duas ou mais fontes de alimentao do monitor Spotlight da Quest Software.
espao. A seguir so apresentadas algumas permitindo que uma entre em funciona- Nele possvel identificar o estado geral
informaes importantes a serem coletadas mento caso a outra falhe. do SGBD e de seus componentes. Neste
pelo monitor: exemplo esto sendo monitorados trs
SGBD: Sesso de usurio, utilizao Onde encontrar ferramentas de servidores de banco de dados ao mesmo
de memria, utilizao de espao de monitorao tempo, um SGBD ORACLE, denominado
armazenamento, performance geral do Alguns SGBDs j tra- F1
sistema, atividades de backup e recovery, zem ferramentas de mo-
conteno de bloqueios (locks) e transa- nitorao em seu pa-
es por minuto. cote. Existem tambm
NO-BREAK: Os NO-BREAKs moder- fabricantes de softwares
nos possuem uma interface de comuni- especializados nessa ta-
cao com o computador, sendo possvel refa, como por exemplo
monitorar as condies das baterias, a BMC Software (www.
temperatura interna, oscilao e falta de patrol.com), Quest Sof-
energia eltrica. tware (www.patrol.com)
SISTEMA OPERACIONAL: CPU, e Veritas (www.veritas.
memria, espao em disco, processos de com). Essas ferramentas
usurio e rede. esto disponveis para
os principais SGBD co-
O monitoramento do sistema operacio- merciais e podem ser
nal importante, pois em muitos casos consultadas nos sites Spotlight monitorando duas instncias ORACLE.

21
M onitorao de sistemas de banco de dados

F2
do SGBD alcance um com o sistema operacional. Por fim, obser-
valor no desejado ou ve a regio em vermelho denominada Disk
de alerta, a cor da re- Storage indicando que a capacidade mxi-
gio correspondente ma de alguma estrutura de armazenamento
mudar de verde para pode est chegando ao seu valor limite.
vermelho como vere- Caso o DBA precise de maiores detalhes
mos mais adiante. sobre os problemas identificados, possvel
Observe na Figura fazer uma anlise mais profunda clicando
1 que o ser vidor nas regies indicadas em vermelho. Se a
NEWTON no apre- regio Paging for selecionada, possvel
senta no momento observar os recursos utilizados pelo sistema
nenhum problema. operacional como mostra a Figura 3.
Ainda nessa figura, Ainda na Figura 3 observe que quase
Spotlight monitorando o SGBD PITOLOMEU (MS SQL Server) com veja os destaques 1 e toda a memria RAM (regio Memory
alguns problemas 2 representando res- circulada em vermelho) do sistema est
F3 pectivamente as ati- ocupada (somente 8,69 MB livre de um
vidades dos processos total 1GB) justificando a quantidade de
de escrita em discos paginaes por segundo. Mais uma vez,
(DBWR1 e LGWR1) clicando na regio Memory, possvel
e o estado dos com- aumentar ainda mais o nvel de detalhe. A
ponentes da SGA Figura 4 mostra os processos e a quantidade
do ORACLE (Buffer de recursos consumidos por eles. Observe
Cache, Redo Buffer, na coluna Physical MB (circulada em ver-
Shared Pool, Java melho) que s o servio sqlservr consome
Poll e Large Pool). 871,73 MB.
J o PITOLOMEU e
WEBER esto na cor Nota: A Quest tambm possui uma ferramen-
vermelha (ver desta- ta denominada Iwhatch que permite coletar
que 3) indicando que informaes e armazen-las em um repositrio.
Spotlight mostrando com mais detalhes o problema da Paginao. algo pode no estar Essa ferramenta , em geral, executada junta-
indo bem. Nesse mo- mente com os servios do SGBD permitindo
NEWTON, e dois MS SQL Server, deno- mento o DBA poder selecionar o SGBD a anlise temporal dos dados. O Iwhatch destaca-
minados PITOLOMEU e WEBER, todos ser analisado. A Figura 2 mostra trs regies se pela baixa intruso no sistema.
em mquinas distintas. Observe ainda em vermelho indicando o que pode estar
que o banco que est sendo visualizado acontecendo de errado no PITOLOMEU. Ferramenta da Patrol (BMC
no momento o NEWTON. Note que a Note que o nmero de paginaes (Paging) Software)
tela foi organizada obedecendo estrutura atingiu o valor de 99 por segundo indicando A Patrol tambm possui um conjunto
modular do ORACLE, ou seja: sesses de que, provavelmente, a quantidade de me- de ferramentas que, na mesma linha da
usurio (Sessions); processos servidores mria principal (RAM)
com informaes sobre o espao em me- no suficiente para F4
mria ocupada pela PGA, quantidade de co- executar os servios
nexes dedicadas e compartilhadas (MTS); necessrios. Isso obriga
a estrutura de memria cache (SGA) com o sistema operacional
seus componentes e indicadores de perfor- a fazer a paginao,
mance (Buffer Cache hit rate); os processos aumentando assim a
responsveis pela escrita (Database Writes, utilizao dos recursos
Redo Log Writer e Archiver) e finalmente, de I/O e conseqen-
as unidades de armazenamento. temente diminuindo a
Uma caracterstica importante dessa fer- performance geral do
ramenta a possibilidade de verificar o fluxo sistema.
de informaes (em Kbytes/Seg) de uma Note que a regio
regio para outra (veja as regies circuladas OS Status tambm
em vermelho). Com isso possvel identifi- est em vermelho, con-
car gargalos potenciais em todo o sistema firmando que algo no
computacional. Caso algum componente est indo muito bem Spotlight mostrando o consumo de recursos dos processos ativos.

22
SQL - Magazine

Quest Software, possibilitam a monitora- Anlise de performance; DBXray monitorando o NEWTON (Ser-
o do SGBD e sistema operacional. Suas Dados estatsticos acumulados em vidor ORACLE) e o WEBER (Servidor MS
principais caractersticas so: repositrio; SQL Server), respectivamente. As mesmas
Condio de performance em tempo Alerta de conteno de recursos de observaes aplicadas ao Spotlight tambm
real dos servidores de banco de dados; SGBD; podem ser consideradas aqui, tanto no que
Visualizao imediata de reas e situa- Alerta de falta de espao; se refere estratgia de visualizao como
es problemticas; Condio e utilizao de memria. possibilidade de aumentar o nvel de detalhe
Isolamento da causa do problema; As figuras 5 e 6 mostram a ferramenta at chegar ao foco do problema.
F5
Concluso
Vimos neste artigo uma introduo a
algumas ferramentas para monitorao de
banco de dados. Infelizmente no tive opor-
tunidade de avaliar a ferramenta da Precise
(Indepth). Porm, pelo que pude ver no
site (http:/veritas.com/), ela possui funcio-
nalidades equivalentes s apresentadas pela
Quest e Patrol. Gostaria de complementar
dizendo que as observaes sobre as ferra-
mentas apresentadas aqui so superficiais e
servem apenas para dar uma idia ao leitor
das facilidades presentes nelas.
S
Faa o download e comente
essa matria em:
www.sqlmagazine.com.br/sql11

R
ARONOFF, Eyal, LONEY, Kevin, SANA-
WALLA, Noorali, ORACLE 8 Advanced
Tuning & Administration, Berkeley,
California, Oracle Press, 1998
DBXray mostrando o estado geral de funcionamento de um SGBD ORACLE.
CYRAN, Michele, Desinginig and Tuning
F6
for Performance, Release 2 (8.1.6),
Oracle Corporation, 1999.

DATE, C. J., Introduo a Sistema de


Banco de Dados, 7 ed. [Traduo: Van-
denberg D. de Souza], Rio de Janeiro,
2000.

A
Ricardo Lima Caratti
(ricardo.caratti@terra.com.br) traba-
lha atualmente na Politec (Braslia),
Sun Certified Programmer for Java 2
Plataform, Oracle Certified Professional
(OCP), graduado no curso de Tec-
nologia da Informao pela UPIS/DF,
trabalhou 12 anos no Ncleo de Pro-
cessamento de Dados da Universidade
Federal do Cear (UFCe) e 5 anos no
Instituto Nacional de Estudos e Pesqui-
sas Pedaggicas (INEPe).
DBXray mostrando o estado geral de funcionamento de um SGBD MS SQL Server.

23
A
N
justes
de Desempenho em
Consultas Simples na SQL
Peter Gulutzan e Trydy Pelzer

este artigo, falaremos sobre a otimizao de con-


sultas simples baseada na sintaxe. Aprenderemos
quais condies de pesquisa so melhores e, ciente
dessas informaes, decidiremos se ser necessrio alterar
Esse exemplo obtm um total de 27 pontos, calculados da
seguinte maneira:
5 pontos para a coluna (smallint_column) sozinha es-
querda;
a ordem das expresses ou substituir uma expresso 2 pontos pelo fato do tipo de dados operando (smallint_co-
por outra que desempenhe a mesma funo de forma mais lumn) ser numrico exato;
eficiente. 10 pontos para o operador de igualdade;
Para otimizar uma consulta com base na sintaxe, devemos 10 pontos para o literal (12345) sozinho direita.
desconsiderar os fatores no sintticos (por exemplo, ndices, Veja outro exemplo:
tamanhos de tabela, armazenamento). ... WHERE char_column >= varchar_column || x
Antes de comear, vale ressaltar que no adianta tentar otimizar
grande parte da sintaxe SQL, pois somente algumas instrues A contagem de pontos para esse tipo de condio de pesquisa
SQL possuem opes que tornam isto possvel. A sintaxe que muito inferior: somente 13.
oferece muitas possibilidades de otimizao so as condies de 5 pontos para a coluna (char_column) sozinha esquerda;
consulta SQL. Veja aqui trs exemplos de condies de pesquisa: 0 ponto para o tipo de dados operando CHAR
... WHERE title LIKE The % OR title LIKE A % (char_column);
... WHERE name <> Smith 5 pontos para o operador maior que ou igual a;
... WHERE number = 5
3 pontos para a expresso com vrios operandos
Apesar das consultas mais lentas serem as que contm junes (varchar_column || x) direita;
e subconsultas, este artigo trata somente das consultas em tabela
nica. Alm disso, apesar das condies de pesquisa poderem
T1
aparecer em clusulas HAVING, IF ou ON, trataremos somente Operador Pontos
das que aparecem em clusulas WHERE. = 10
> 5
>= 5
Ajuste geral
< 5
Nesta parte do artigo, trataremos de algumas idias gerais
<= 5
que voc deve ter em mente ao escrever condies de consultas LIKE 3
simples. <> 0
Contagens de pontos da condio de pesquisa para operadores.
Cdigo para pontos T2
Operando Pontos
As melhores condies de pesquisa so as que trabalham Literal sozinho 10
com poucas linhas e comparaes fceis. As Tabelas 1 e 2 Coluna sozinha 5
mostram listas tpicas de tipos de condies de pesquisa, Parmetro sozinho 5
Expresso com vrios operandos 3
ordenadas da melhor para a pior. Cada componente da con-
Tipo de dados numrico exato 2
dio da pesquisa possui uma contagem de pontos: quanto
Outro tipo de dados numrico 1
melhor o componente, mais alta a pontuao. Voc pode Tipo de dados temporal 1
ver pelos pontos distribudos mostrados nas Tabelas 1 e 2 que a Tipo de dados caractere 0
melhor condio de pesquisa seria algo como: NULO 0
Contagens de pontos da condio de pesquisa para operandos.
... WHERE smallint_column = 12345

24
SQL - Magazine

0 ponto para o tipo de dados operando Propagao constante A instruo transformada mais de 50%
VARCHAR (varchar_column). Formalmente, a Lei da Transitividade mais rpida. Em outras palavras, s vezes
afirma que: vale a pena fazer suas prprias transfor-
A contagem de pontos precisa para uma IF maes.
condio de pesquisa varia a depender do (A <comparao> B) IS TRUE AND (B <com- s vezes, a propagao constante no
parao> C) IS TRUE
fornecedor. Ento no adianta memorizar THEN funcionar com flutuantes, pois pode haver
nada alm da ordem e do conceito desta (A <comparao> C) IS TRUE AND NOT (A ao mesmo tempo maior que e igual a
<comparao> C) IS FALSE
tcnica de otimizao. Lembre-se apenas quando ocorrem comparaes numricas
que a condio que leva menos tempo onde o operador de comparao (com- aproximadas. Se funcionar, porm, espere
obtm mais pontos. parison operator) um dos seguintes: = ou GANHO: 5/8.
Tendo conhecimento desse conceito, > ou >= ou < ou <= mas nenhum destes: <> Na prtica, voc ver muitos operandos
voc pode decidir se ir mudar a ordem das ou LIKE. semiconstantes, como parmetros ou fun-
expresses ou substituir uma expresso por A Lei da Transitividade leva observao es de programa. So exemplos as funes
outra que desempenhe a mesma funo. simples de que podemos substituir B por C nulas como CURRENT_DATE (uma funo
Apesar de um otimizador de um SGBD sem alterar o significado de uma expresso. nula uma funo sem argumentos). Como
moderno possuir muito mais regras que exi- Quando uma substituio dessas variveis o uso de um valor constante sempre acelera
gem informaes fora do escopo da prpria envolve a substituio de um valor cons- os acessos, tente uma transformao para
instruo SQL, todos os SGBDs recorrem tante, o processo chamado de propagao agilizar esses casos. Veja aqui um exemplo:
contagem de pontos quando no h outras constante. Query #1 se transforma em Query #2:
informaes disponveis. As duas expresses a seguir possuem o Query #1:
Uma outra maneira de otimizar uma mesmo significado, mas a segunda possui SELECT * FROM Table1
WHERE date_column = CURRENT_DATE
condio de pesquisa colocando vrias uma melhor contagem de pontos porque AND amount * 5 > 100.00
expresses na ordem correta. As expresses ela substitui o nome de coluna (column1) Query #2:
nesta clusula WHERE j esto na ordem por um literal (5): SELECT * FROM Table1
WHERE date_column = DATE 2002-01-01
ideal: Expresso #1 AND amount * 5 > 100.00
... WHERE column1 < column2
SELECT * FROM Table1 AND column2 = column3 GANHO: 5/8
WHERE column1 = 5 AND column1 = 5
AND column2 = 77.3
AND column3 = Smith Expresso #2
Se voc estiver pensando em transformar
AND column4 < 117 ... WHERE 5 < column2 esse tipo de expresso, lembre-se de que
AND column4 > column5 AND column2 = column3
GANHO: 0/8 AND column1 = 5 (devido constante DATE) precisar alterar
GANHO: 2/8 a consulta todos os dias. Isso s prtico
A observao na parte inferior deste Expresso #2 chamada de transformao quando um programa gera as consultas
exemplo nos informa que h um ganho da Expresso #1 (escrever uma transforma- no servidor.
de 0/8. O ganho mostra quantas vezes a o significa reescrever uma instruo SQL
consulta executada mais rapidamente para produzir o mesmo resultado, mas com Eliminao de cdigo morto
se comparada pesquisa otimizada pelo sintaxe diferente. Quando duas instrues (Dead Code)
SGBD (a pesquisa foi executada em SGB- SQL possuem sintaxes diferentes, mas que Em alguns programas SQL antigos, voc
Ds de 8 fabricantes). Neste caso, nos 8 produziro de forma previsvel e regular encontrar literais dos dois lados do opera-
SGBDs que a consulta foi executada, no as mesmas sadas, elas so chamadas de dor de comparao, como neste exemplo:
houve ganho de desempenho. Esse valor transformaes uma da outra). A maioria SELECT * FROM Table1
varia conforme os dados e as mquinas, dos bons SGBDs efetuam essa ao automa- WHERE 0 = 1
AND column1 = I hope we never execute
evidentemente. ticamente. Mas alguns no tentaro trans- this
Ento GANHO: 0/8 significa: voc formaes quando a expresso contiver
perderia o seu tempo se reorganizasse vrios parnteses e NOTs. Por exemplo, esta Antes de serem permitidos os /* comen-
esta clusula WHERE em outra ordem instruo SELECT pode ser lenta: trios */ em uma instruo SQL, essa era
pois o SGBD faz isso para voc. Todos os SELECT * FROM Table1 uma maneira de incluir uma seqncia de
fabricantes de SGBD possuem o conhe- WHERE column1 = 5 AND comentrio em linha. Como a expresso
NOT (column3 = 7 OR column1 = column2)
cimento bsico da contagem de pontos, 0 = 1 sempre falsa, essa consulta no
por isso a reorganizao automtica. Isso Aplicando ns mesmos as transforma- retornar linha alguma; portanto, os SGBDs
significa que, em situaes comuns, voc es, chegamos a esta instruo: podero ignorar a clusula WHERE inteira.
no ganhar nada fazendo sua prpria Mas alguns no a ignoraro. Testamos isso
SELECT * FROM Table1
otimizao baseada na sintaxe. No entan- WHERE column1 = 5
removendo a clusula WHERE e obtivemos
to, h muitas excees a essa regra. No AND column3 <> 7 um ganho!
AND column2 <> 5
restante deste artigo, analisaremos algumas SELECT * FROM Table1
dessas situaes. GANHO: 5/8 GANHO: 5/8

25
H ow TO: Usando objetos OLE via SQL Server

bvio que essas duas consultas no so O Oracle permite a incluso de um Pesquisas que no diferenciam
equivalentes. A questo simplesmente comentrio que indique qual ndice deseja maisculas de minsculas
que se deve levar menos tempo para recu- usar. Seria mais ou menos assim: O Access Jet da Microsoft considera
perar zero linhas devido a uma condio as seqncias SMITH e Smith iguais,
sempre falsa do que se levaria para fazer SELECT /*+ INDEX(Widgets Widget_index) */ ou seja, ele no diferencia maisculas de
uma leitura de tabela inteira, desde que column1, column2, column3 minsculas. O Oracle, por outro lado, nor-
o SGBD no avaliasse a condio sempre FROM Widgets malmente faz essa distino (o mecanismo
WHERE column1 <> 7;
falsa. Esse exemplo mostra que os SGBDs GANHO: apenas 1/8 por causa das funcio- diria que SMITH e Smith so seqncias
nalidades especficas do Oracle
nem sempre rejeitam condies sempre diferentes). O Sybase permite que voc deci-
falsas e todos os seus dependentes no est- da sobre esse tipo de distino quando voc
gio de PREPARAO. Mas eles rejeitam As otimizaes especficas ao Oracle no faz a instalao, e um SGBD padro SQL
condies sempre verdadeiras. Ento, voc so boas idias quando prendem voc a ele. permitir que voc altere essa capacidade de
pode usar condies sempre verdadeiras Nesse caso, a dica est em um comentrio distino em tempo de execuo. J vimos
para um equivalente SQL de compilao e por isso, outros SGBDs iro ignor-la. muitos programadores tentar garantir que
condicional. Por exemplo, se voc teme que Utilizar mecanismos especficos de cada no haver essa distino usando a funo
um SGBD no oferea alta preciso para banco para otimizar a consulta uma boa UPPER, como em:
resultados de diviso, inclua uma condio desde que no entre em conflito com os ... WHERE UPPER(column1) = SMITH
parte que s seja usada quando necessrio demais SGBDs.
como neste exemplo: Isso pode ser um erro quando se lida
... WHERE (77 / 10 = 7.7 Resumos bvios com seqncias que contm letras que no
AND column1 / 10 = 7.7) Todos que estejam acostumados com sejam estritamente latinas. Com alguns
OR (77 / 10 = 7 AND column1 * 10 = 77)
GANHO: 5/8 C, sabem que a expresso x=1+1-1-1 SGBDs, quando voc traduz determinadas
resumida em x = 0 durante a compila- seqncias francesas ou alems em letras
No entanto, devido ao aspecto de pouca o. Ento, pode ser surpresa para voc maisculas, as informaes so perdidas.
confiabilidade, no uma boa idia usar c- que muitos SGBDs no resumam es- Por exemplo, a funo:
digo redundante. Suponha que uma coluna, ses cinco candidatos transformao ... UPPER(rsum)
indexed_column, seja uma coluna NOT aparentemente bvios:
NULL indexada. Voc pode transformar retorna RESUME, ou seja, as marcas de
essa instruo SQL: ... WHERE column1 + 0 acento so perdidas, alterando o significado
SELECT * FROM Table1 ... WHERE 5 + 0.0 da palavra de curriculum vitae para reini-
... WHERE column1 IN (1, 3, 3)
ciar. Como as informaes no se perdem
na seguinte instruo: se for feito de outra maneira, melhor usar
... CAST(1 AS INTEGER)
SELECT * FROM Table1 a funo LOWER, como aqui:
WHERE indexed_column > 0 ... WHERE a || b
... WHERE LOWER(column1) = rsum
Essa uma maneira de forar o SGBD a
pesquisar pelo ndice. Vale ressaltar que isso Porm, se voc encontrar expresses Uma maneira ainda melhor eliminar
s funciona com alguns SGBDs. Em termos como essas em cdigo antigo, nossa dica totalmente a funo de resumo se for
gerais, no inclua condies redundantes : deixe-as isoladas. Elas esto l por possvel. Tanto o manual da Microsoft
em clusulas WHERE. razes histricas, como forar o SGBD como o da Oracle dizem: Evite funes
a ignorar ndices, alterar o tipo de da- em colunas. Estamos certos de que eles
Certifique-se de usar o dos de resultado, permitir a diferena querem dizer evite funes em colunas
SGBD correto entre SMALLINT e INTEGER ou fugir quando houver outra maneira de obter o
Existem vrias maneiras de garantir que de um limite de tamanho de linha. Sinto resultado necessrio. Por exemplo, para
um SGBD especfico execute uma expres- muito, mas os casos aparentemente b- garantir que no haver distino entre
so. Veja aqui trs exemplos, todos usando vios so precisamente aqueles em que maisculas e minsculas, o melhor mtodo
extenses SQL no-padro: voc deve parar e se perguntar se o pro- usar uma collation case-insensitive em vez
Exemplo 1: gramador original teve algum motivo para de uma funo de resumo.
... WHERE :variable = Oracle a estranha escolha de sintaxe. Contudo, Uma pesquisa um pouco mais rpida
AND /* cdigo especfico para o Ora-
cle aqui */ recomendamos que voc transforme esta pressupe que os dados estejam limpos e
Exemplo 2:
condio de pesquisa: solicita somente combinaes previsveis,
SELECT /* ! HIGH_PRIORITY */ ... ... WHERE a - 3 = 5 como esta:
/* todos SGBDs com excesso do MySQL
ignoram isto */ ... WHERE column1 = SMITH
em: OR column1 = Smith
Exemplo 3: GANHO: 8/8
... WHERE <escape-sequence> AND /* cdi- ... WHERE a = 8 /* a - 3 = 5 */
go ODBC */ que ainda lenta. Nossa dica aqui :
GANHO: 6/8

26
SQL - Magazine

tire proveito da eliminao de cdigo brincadeira. Mas, apesar de a palavra estar SMALLINTs, DECIMALs ou FLOATs.
morto para que a pesquisa Smith ocorra morta, a idia vive nesta regra: o lado es- Assim, esta condio:
somente quando o SGBD fizer distino en- querdo de uma condio de pesquisa deve ... WHERE decimal_column * float_column
tre maisculas e minsculas. Veja como: ser um nome de coluna simples; o lado direi-
... WHERE column1 = SMITH to deve ser um valor fcil de pesquisar. mais lenta que:
OR (SMITH <> Smith AND column1 = Para reforar essa regras, todos os SGBDs ... WHERE integer_column * integer_co-
Smith)
GANHO: 3/8 iro transpor a expresso: lumn

5 = column1 GANHO: 5/8


SARGabilidade (Sargability)
em:
A condio de pesquisa SQL ideal possui Resumindo os ajustes gerais
a forma geral: column1 = 5 O lado esquerdo de uma condio de
<column> <operador de comparao> Quando houver aritmtica envolvida, pesquisa deve ser um nome de coluna sim-
<literal> somente alguns SGBDs faro a transpo- ples; o lado direito deve ser um valor fcil
sio. Por exemplo, testamos a seguinte de pesquisar. Cada componente de uma
No incio, os pesquisadores da IBM cha- transformao: condio de pesquisa possui uma con-
mavam esses tipos de condies de pesquisa ... WHERE column1 - 3 = -column2 tagem de pontos. Quanto mais altos os
de sargable predicates (predicados com pontos, mais rpido o componente. A
argumentos pesquisveis), pois SARG transformado em: condio que leva menos tempo obtm
... WHERE column1 = -column2 + 3
uma contrao de Search ARGument GANHO: 4/8 mais pontos.
(argumento de pesquisa). Depois, a Mi- Coloque as vrias expresses na ordem
crosoft e a Sybase redefiniram sargable O ganho mostra que o fato de ns mes- correta.
como que pode ser pesquisado pelo n- mos termos feito a transformao foi de Use a Lei da Transitividade e o conceito
dice. Bom, quando uma mesma palavra considervel ajuda. Em um computador de propagao constante para substituir um
possui dois significados diferentes, ela no de 32 bits, a aritmtica mais rpida se literal de um nome de coluna ou expresso
deve mais ser usada como palavra! Por isso todos os operandos so INTEGERs (pois de coluna toda vez que puder fazer isso sem
intitulamos a seo de Sargability s de INTEGERs so nmeros de 32 bits) e no alterar o significado de uma expresso.

27
H ow TO: Usando objetos OLE via SQL Server

Alguns SGBDs no resumiro a maioria a expresso mais provvel esquerda. Quando o SGBD efetua pesquisas em n-
das expresses aparentemente bvias. De Essa uma recomendao oposta for- dices na ordem da consulta, possvel que
qualquer forma, no use esse princpio necida para AND porque OR gera testes ele siga estas etapas:
como o motivo para sempre transformar adicionais se a primeira expresso for Pesquisa de ndice: column1=1. Result
expresses como essa quando encontr-las falsa enquanto AND s gera testes adi- set = {row 3}
em cdigo antigo. Normalmente, elas esto cionais se a primeira expresso for true. Pesquisa de ndice: column2=A. Result
l por razes histricas. Lembre-se sempre Portanto, transforme Expresso #1 em set = {row 1}
de entender o cdigo antes de alter-lo. Expresso #2: AND para mesclar os conjuntos de
Evite funes em colunas. Se no puder Expresso #1: resultados. Result set = {}
evitar funes, no use UPPER para garan- ... WHERE column2 = B OR column1 = A Pesquisa de ndice: column1=1. Result
tir que no haja distino entre maisculas e Expresso #2: set = {row 3}
minsculas. Em vez disso, use LOWER. ... WHERE column1 = A OR column2 = B Pesquisa de ndice: column2=A. Result
GANHO: 4/7 assumindo que a ocorrncia de set = {row 1}
column1 = A mais provvel
Ajustes especficos AND para mesclar os conjuntos de
At aqui, falamos sobre o ajuste geral das Essa uma transformao recomendada resultados. Result set = {}
condies de pesquisa. Agora vamos anali- especialmente para sistemas Microsoft. OR para mesclar os conjuntos de resul-
sar como aprimorar o seu cdigo usando Mais uma vez, os usurios Oracle devem tados. Result set = {}
operadores SQL especficos. ignorar essa recomendao porque os
sistemas Oracle calculam da direita para Agora, vamos trocar a consulta usando a
AND a esquerda ao fazerem a operao com o Lei Distributiva:
Quando tudo o mais for igual, os SGBDs otimizador cost-based. SELECT * FROM Table1
avaliaro uma srie de expresses com Os operadores OR tambm funcionam WHERE column1 = 1
AND (column2 = A OR column2 = B)
AND da esquerda para a direita (exceto o mais rapidamente se todas as colunas forem GANHO: 2/8
Oracle, que avalia da direita para a esquer- idnticas porque isso reduz o nmero de
da quando o otimizador cost-based est colunas e ndices que o SGBD precisa ler. Fazendo as pesquisas na nova ordem, o
em operao). Voc pode tirar proveito Por isso, em uma srie longa com opera- SGBD seguiria estas etapas:
desse comportamento colocando a ex- dores OR, as expresses para uma mesma Pesquisa de ndice: column2=A. Result
presso menos provvel primeiro ou se coluna devem estar juntas. Por exemplo, set = {row 1}
ambas forem igualmente provveis co- voc deve transformar Expresso #1 em Pesquisa de ndice: column2=B. Result
locando a expresso menos complexa pri- Expresso #2: set = {row 2}
meiro. Depois, se a primeira expresso for Expresso #1: OR para mesclar os conjuntos de resul-
falsa, o SGBD no perder tempo ava- ... WHERE column1 = 1 tados. Result set = {row 1, 2}
OR column2 = 3
liando a segunda. Por exemplo (a me- OR column1 = 2 Pesquisa de ndice: column1=1. Result
nos que esteja usando o Oracle), voc Expresso #2:
set = {row 3}
deve transformar: ... WHERE column1 = 1 AND para mesclar os conjuntos de
OR column1 = 2
... WHERE column1 = A AND column2 = OR column2 = 3 resultados. Result set = {}
B
GANHO: 1/8
em: Esse teste gerou um ganho para apenas
... WHERE column2 = B AND column1 = dois dos oito SGBDs testados. Os outros
A AND mais OR SGBDs tendem a aplicar eles mesmos a
GANHO: 6/7 assumindo a ocorrncia de
column2 = B menos provvel A Lei Distributiva diz o seguinte: Lei Distributiva de modo que estaro sem-
pre trabalhando com a mesma consulta
A AND (B OR C)
Nota: O Oracle com o otimizador rule-based cannica. No entanto, a evidncia mostra
tambm obtm ganho, mas no faa isso para que, para condies simples de pesquisa, a
o Oracle que est executando o otimizador a mesma coisa que construo
cost-based. (A AND B) OR (A AND C)
A AND (B OR C)

OR melhor que
Ao escrever expresses com OR, coloque Suponha que voc tenha uma tabela (A AND B) OR (A AND C)
T3 idntica Tabela 3, em que seja necessrio
Linha column1 column2
executar uma consulta onde os operadores NOT
1 3 A AND vm primeiro: Evite a utilizao da expresso NOT
2 2 B
SELECT * FROM Table1 transformando-a em uma condio mais
3 1 C WHERE (column1 = 1 AND column2 = A) simples. Para isto, inverta a operao de
OR (column1 = 1 AND column2 = B)
Tabela para uma consulta AND mais OR. comparao. Por exemplo,

28
SQL - Magazine

OR column1 = 6
... WHERE NOT (column1 > 5) ... WHERE column1 > SUBSTRING(? FROM 1
FOR 1)
Condio #2:
transforma-se em AND column1 LIKE ?
... WHERE column1 IN (5, 6)
GANHO: 2/8
... WHERE column1 <= 5 GANHO: 4/8
Essas pessoas esto ligeiramente enga-
Uma condio mais complexa requer nadas. O IN (2/8) mais rpido que OR. Outra transformao interessante de
mais cuidado. Nestes casos, pode-se aplicar Ento, quando possvel, transforme OR LIKE com um parmetro usar o ope-
o Teorema DeMorgan, que diz o seguin- em IN. rador de igualdade, em vez do operador
te: Entretanto, vale uma ressalva aqui: quan- LIKE, se o parmetro no contiver um
NOT (A AND B) = (NOT A) OR (NOT B) do um operador IN tem uma srie formada caractere curinga. Por incrvel que parea,
e apenas por nmero inteiros, melhor no esse procedimento pode realmente ajudar.
NOT (A OR B) = (NOT A) AND (NOT B) utiliz-lo. Assim, a condio Por exemplo, possvel transformar a
... WHERE column1 IN (1, 3, 4, 5) condio
Dessa forma, por exemplo, a condio ... WHERE column1 LIKE ABC
de pesquisa deveria ser transformada em em
... WHERE NOT (column1 > 5 OR column2 ... WHERE column1 BETWEEN 1 AND 5 ... WHERE column1 = ABC
= 7) AND column1 <> 2
GANHO: 5/8
transforma-se em GANHO: 7/8

... WHERE column1 <= 5 A armadilha aqui que LIKE A e = A


AND column2 <> 7
Ganhos semelhantes podem ocorrer no so exatamente as mesmas condies.
Se aps a transformao voc possuir um quando for possvel representar uma srie Em uma instruo SQL padro, a compara-
operador de desigualdade, o resultado ser usando uma expresso aritmtica. o LIKE considera os espaos direita. Por
mais lento. Em qualquer conjunto de valo- outro lado, a comparao de igualdade os
res distribudos de modo uniforme, quando LIKE ignora. Alm disso, os operadores LIKE e de
existem mais de duas linhas, os valores di- A maioria dos SGBDs usar um ndice igualdade, por padro, no usam necessaria-
ferentes sempre excedem os valores iguais. para um padro LIKE que comece com mente os mesmos collates. Por isso, no faa
Por isso, alguns SGBDs no usaro um ndi- um caractere real, mas evitar um ndice a transformao em colunas VARCHAR e
ce para comparaes de desigualdade, mas para um padro LIKE que comece com certifique-se de forar o mesmo collate, se
usaro para comparaes de maior que ou um caractere curinga (seja ele % ou _). Por necessrio.
menor que. Assim, voc pode transformar exemplo, se a condio de pesquisa for Se uma coluna contiver apenas dois
o tipo de condio ... WHERE column1 LIKE C_F% ou trs caracteres, provavelmente voc
... WHERE NOT (bloodtype = O) tenderia a usar SUBSTRING em vez de
os SGBDs iro resolv-la localizando LIKE, mas, como no bom usar funes
em todas as chaves de ndice que comecem em colunas, o operador LIKE sempre
... WHERE bloodtype < O com C e filtrando apenas as que contiverem produzir melhores resultados que vrios
OR bloodtype > O
F na terceira posio. Em outras palavras, operadores SUBSTRING. Isso quer dizer
GANHO: 3/8 no necessrio transformar a condio que voc deve transformar Expresso #1
O ganho desse exemplo 3/8 se pratica- de pesquisa em Expresso #2:
mente todo mundo tiver o tipo sangneo ... WHERE column1 LIKE C_F% Expresso #1:
O. Mas acontece justamente o contrrio se em ... WHERE SUBSTRING(column1 FROM 1 FOR
1) = F
a maioria das pessoas tiver um tipo sang- ... WHERE column1 >= C OR SUBSTRING(column1 FROM 2 FOR 1) =
neo diferente. Por isso, essa transformao AND column1 < D F
AND column1 LIKE C_F% OR SUBSTRING(column1 FROM 3 FOR 1) =
deve ser feita apenas se voc souber como F
os valores esto distribudos e se a possibi- GANHO: -5/8
Expresso #2:
lidade de haver mudana na distribuio for ...WHERE column1 LIKE %F%

mnima. Se o SGBD mantiver estatsticas, Nota: De fato, com IBM, Informix, Microsoft, GANHO: 5/6
ele ter essas informaes e proceder da Oracle e Sybase, a expresso transformada ser
forma mais apropriada. mais lenta! Nota: Ingres e InterBase no suportam SUBS-
TRING; o ganho para apenas seis SGBDs.
IN Se quiser acelerar o operador LIKE com
Muitas pessoas acham que no existe um parmetro (LIKE ?) e souber que o pa- SIMILAR
muita diferena entre as duas condies, dro comea com um caracter, faa voc Se duas expresses que estiverem sendo
OR e IN, porque ambas retornam o mesmo mesmo a transformao. Veja como: unidas com OR estiverem em colunas defi-
conjunto de resultados: ... WHERE column1 LIKE ? nidas como CHAR ou VARCHAR, o novo
Condio #1: operador SIMILAR, do SQL-99, pode ser
... WHERE column1 = 5 transforma-se em mais rpido que o operador OR (ver SQL

29
H ow TO: Usando objetos OLE via SQL Server

Magazine 4 para maiores informaes). Esta UNION condio de pesquisa contm OR, eles se
a sintaxe bsica de SIMILAR: Em SQL, uma unio de duas tabelas recusam a usar ndices. Por isso, nesse caso,
... <string> SIMILAR TO <pattern> o conjunto de todos os valores de dados e apenas nesse caso, UNION produz um
existentes em cada uma das duas tabelas resultado melhor que OR. Como esse um
Para o operador SIMILAR, string o eliminando as repeties, ou seja, UNION conjunto de circunstncias bastante limita-
nome de uma coluna ou uma expresso retorna linhas no duplicadas de duas ou do, recomendamos que OR seja utilizado
de coluna. Os caracteres curinga a seguir mais consultas. Essa pode ser uma tima em vez de UNION quando as colunas em
podem ser includos no pattern (padro): maneira de mesclar dados. Mas ser que questo no estiverem indexadas.
% ou _ significa o mesmo que os carac- a melhor? Para testar isso, executamos duas
teres curinga usados com LIKE. instrues SELECT diferentes: Query #1 e EXCEPT
* ou + significa "o anterior se repete Query #2: Qualquer expresso A AND NOT B pode
indefinidamente": zero para infinitas vezes Query #1 ser transformada com EXCEPT. Veja um
no primeiro caso e um para o infinito no SELECT * FROM Table1 exemplo a seguir onde Query #1 trans-
WHERE column1 = 5
segundo. UNION formada em Query #2:
[A-F] significa qualquer caractere entre SELECT * FROM Table1
WHERE column2 = 5 Query #1:
A e F. SELECT * FROM Table1
Query #2 WHERE column1 = 7 AND
[AEK] significa A, E ou K. SELECT DISTINCT * FROM Table1 NOT column2 = 8
[^AEK] significa qualquer coisa dife- WHERE column1 = 5
Query #2:
OR column2 = 5
rente de A, E ou K. SELECT * FROM Table1
GANHO: 7/7 WHERE column1 = 7
[:ALPHA:] significa qualquer coisa EXCEPT
que seja uma letra latina. Outras opes Nota: O MySQL no suporta UNION. O SELECT * FROM Table1
WHERE column2 = 8
para esta enumerao incluem [:UPPER:] ganho para apenas 7 SGBDs.
GANHO: -2/3
(somente para letras maisculas), [ :
LOWER:] (somente para letras minsculas), Nos nossos testes, nem column1 nem Nota: Informix, Ingres, InterBase, Microsoft,
[:DIGIT:] (para qualquer dgito entre 0 e column2 foram indexados. Observe que e MySQL no suportam EXCEPT.
9) e [:ALNUM:] (para qualquer dgito ou Query #1 maior, usa uma construo
letra latina). SQL relativamente rara e, invlida como O ganho negativo mostra que essa trans-
| e || significam, respectivamente, o parte de uma instruo CREATE VIEW. Se formao no uma boa idia! Somado ao
operador lgico OR e concatenao. Query #2 sempre for executada mais rapi- fato de que o suporte a EXCEPT raro,
damente, como nesse exemplo, poderamos recomendamos o seguinte: use AND NOT;
Dessa forma, por exemplo, a condio recomendar que Query #1 sempre fosse evite EXCEPT.
de pesquisa transformada em Query #2. No entanto,
... WHERE column1 SIMILAR TO [A- em alguns SGBDs, isso poderia resultar INTERSECT
F][AEK]_ em execues mais lentas. Para saber o Embora existam muitas maneiras de
ser verdadeira para as seqncias motivo, precisamos considerar duas falhas transformar expresses formadas por AND
DEN do otimizador. usando INTERSECT, observamos que ne-
FAB
A primeira delas que muitos otimiza- nhuma delas produz ganhos. Como muitos
e ser falsa para as seqncias dores funcionam apenas em uma clusula SGBDs no aceitam o operador INTER-
GIB WHERE em uma instruo SELECT sim- SECT em hiptese alguma, no entraremos
AKRON ples. Por isso, acabam sendo executadas em detalhes sobre o assunto.
Como o operador SIMILAR aceita o duas operaes SELECT em Query #1.
operador lgico OR no pattern, s vezes Primeiro, o otimizador encontra todas as CASE
OR no ser necessrio. Por exemplo, voc linhas em que a condio column1 = 5 Suponha que uma condio de pesquisa
poderia transformar Expresso #1 em Ex- verdadeira. Depois, encontra todas as linhas tenha mais de uma referncia a uma rotina
presso #2: em que column2 = 5 em uma passagem lenta:
Expresso #1: separada, ou seja, ele faz um table scan duas ... WHERE slow_function(column1) = 3
OR slow_function(column1) = 5
... WHERE column1 = A vezes! Ento, se column1 no estiver inde-
OR column1 = B
OR column1 = K xado, Query #1 dever levar exatamente Para evitar que slow_function seja exe-
o dobro de tempo para ser executada que cutada duas vezes, transforme a condio
Expresso #2: Query #2. utilizando CASE:
... WHERE column1 SIMILAR TO [ABK]
Se column1 estiver indexada, a pesquisa
GANHO: 1/1
dupla continuar a ocorrer, mas uma falha ... WHERE 1 =
CASE slow_function(column1)
pouco comum no otimizador, observada WHEN 3 THEN 1
Nota: Apenas o Informix suporta o comando em alguns SGBDs, compensa isso. Quan- WHEN 5 THEN 1
END
SIMILAR como descrito no SQL-99. do esses otimizadores percebem que uma GANHO: 4/7

30
SQL - Magazine

Nota: InterBase no suporta Case. Notas de estilo Agora, aqui esto as trs condies de
Ao executar vrias instrues SQL pesquisa que respondem pergunta:
Resumindo os ajustes especficos seqencialmente, importante usar um Search condition #1
Quando tudo o mais for igual, os estilo consistente. Por exemplo, em vez de ... WHERE MOD(decimal_column, 1) = 0

SGBDs avaliaro uma srie de expresses executar as instrues SQL Search condition #2
... WHERE CAST(decimal_column AS
com AND da esquerda para a direita SELECT column1*4 FROM Table1 WHERE COLU- CHAR(7)) LIKE %.00%
MN1 = COLUMN2 + 7
(exceto o Oracle, que avalia da direita select Column1 * 4 FROM Table1 WHERE Search condition #3
para a esquerda). Voc pode tirar proveito column1=(column2 + 7) ... WHERE decimal_column = CAST(decimal_
column AS INTEGER)
desse comportamento colocando a expres- execute estas duas:
so menos provvel primeiro ou, se ambas SELECT column1 * 4 FROM Table1 WHERE Qual delas a melhor? Se voc tiver lido
forem igualmente provveis, colocando a column1 = column2 + 7 este artigo at aqui, existe uma resposta.
SELECT column1 * 4 FROM Table1 WHERE
expresso menos complexa primeiro. column1 = column2 + 7 A condio de pesquisa no 1 a pior.
Em uma srie de expresses com OR, GANHO: 2/8
Embora no exista um CAST, ela depende
coloque primeiro a expresso mais prov- da converso de dados de nmeros decimais
vel, a menos que voc esteja usando um Voc deve estar pensando: Mas elas so para nmeros inteiros porque as operaes
sistema Oracle. idnticas!. Bem, semanticamente, todas as em mdulos trabalham com nmeros in-
Em uma srie de expresses com OR, quatro expresses SELECT so idnticas. teiros. Existe ainda uma operao implcita
coloque as colunas idnticas juntas. O truque que alguns SGBDs armazenam de diviso.
Aplique a Lei Distributiva para escrever os resultados analisados de consultas ante- A condio de pesquisa no 2 a interme-
condies de pesquisa simples com o forma- riores e os reutilizam se as consultas forem diria. Alguns SGBDs armazenam valores
to A AND (B OR C) em vez de (A AND B) exatamente as mesmas, inclusive os espaos decimais como seqncias de caracteres.
OR (A AND C). e a disposio de letras maisculas e mins- Por isso, a converso de dados no difcil.
Transforme a expresso NOT em algo culas. Por isso, um estilo firme e consistente Entretanto, LIKE mais lento quando o pa-
mais legvel. Em uma condio simples, criar instrues que sejam fceis de serem dro comea com um caractere curinga.
inverta o operador de comparao; em lidas, mas tambm que sejam mais rapida- A condio de pesquisa no 3 a melhor.
uma condio mais complexa, aplique o mente executadas! Ela quebra as regras definidas na citao no
Teorema DeMorgan. No forneceremos um guia de estilo aqui 1 e na citao no 2, mas dissemos que essas
Quando estiver familiarizado com a dis- porque no essa a finalidade deste artigo. citaes eram ilusrias (a Microsoft adota
tribuio de um conjunto de valores, voc No entanto, mostraremos que a transfor- uma acepo incomum para sargable).
poder acelerar o processo transformando mao no exemplo usou algumas regras Se voc comparar todas as trs condies
pesquisas de desigualdade em pesquisas de comuns e fceis de serem lembradas: usando as contagens de pontos mostradas
maior que ou de menor que. Coloque as palavras-chave em letras nas tabelas 1 e 2 no incio deste artigo, per-
Transforme uma srie de expresses maisculas e os nomes de colunas em letras ceber que a condio no 3 a que alcana
com OR na mesma coluna em IN. minsculas. a maior pontuao porque usa o operador
A maioria dos SGBDs usar um ndice Use os nomes de tabelas com a inicial de igualdade e tem um nmero menor de
para um padro LIKE que comece com um maiscula. expresses. Alm disso, mais prximo do
caractere real, mas evitar um ndice para Use espaos simples ao redor de cada ideal de sargable porque comea com
um padro que comece com um caractere palavra e de cada operador aritmtico. <column> <comparison operator>
curinga. No transforme condies LIKE
em comparaes com >=, < e assim por Consideraes finais Concluso
diante a menos que o padro LIKE seja Suponha que voc tenha uma coluna de Neste artigo vimos um conjunto de dicas
um parmetro (por exemplo LIKE ?). preos, definidos como DECIMAL(7,2), e sobre otimizao. Faam bom proveito
Nos casos em que o parmetro no tiver precise responder pergunta: Quais preos delas. Mas no se esquea que isto ape-
um caractere curinga, acelere o processa- so dlares redondos? nas parte do problema da otimizao de
mento de LIKE ? substituindo o operador Para iludir voc, aqui esto duas citaes consultas SQL.
de igualdade de LIKE, desde que os espaos presentes na documentao on-line do S
direita e agrupamentos diferentes no Microsoft SQL Server 2000: Faa o download e comente
sejam um fator relevante. Citao no1: Avoid data conversion essa matria em:
LIKE sempre ser melhor que vrios functions (Evite funes de converso de www.sqlmagazine.com.br/sql11
operadores SUBSTRING; portanto, evite a dados).
transformao. Citao no2: If the same column is on A
Transforme UNION em OR. both sides of the comparison operator, the Peter Gulutzan e Trudy Pelzer so au-
Coloque uma condio de pesquisa em expression is not sargable (Se a mesma tores do livro SQL Performance Tuning
uma expresso CASE se o resultado for uma coluna estiver nos dois lados do operador de (Addison-Wesley, 2002).
reduo no nmero de referncias. comparao, a expresso no SARGable).

31
N ovidades
do Firebird 1.5

Carlos Henrique Cantu

N os ltimos meses o Firebird teve presena constante na


mdia on-line: recentemente ficou em segundo lugar em
uma pesquisa Qual o seu banco de dados preferido? rea-
lizada nos fruns do site LinuxQuestions.org (www.linuxquestions.
org/questions/showthread.php?s=&threadid=116360), com di-
podem ser encontradas em nenhuma das verses do InterBase
disponveis no momento.

Nota - Histria: O Firebird um banco gratuito e Open Source que


teve sua origem no cdigo do Borland InterBase 6.0. Aps a liberao
ferena de apenas 2 votos para o primeiro lugar, que acabou do cdigo do IB 6.0 como um produto Open Source, a Borland decidiu
ficando com o MySQL. Os outros bancos que participaram da lanar as verses posteriores do IB sob o modelo comercial (software
pesquisa foram o Postgres, Sybase, Berkeley DB, Oracle e DB2. fechado e pago). Inconformados com essa atitude, muitos usurios e
A guerra de nomes promovida pelo Mozilla e pelo Firebird pessoas envolvidas com o InterBase se juntaram e criaram o Firebird,
tambm contribuiu para colocar o banco de dados na mdia, e com a determinao de dar continuidade um banco de dados que fosse
teve um final feliz com a mudana do nome do browser Mozilla gratuito e com cdigo aberto.
Firebird para Mozilla FireFox, deixando o uso do nome Firebird
livre para o banco de dados. O site da Oreilly, famosa editora Novidades
de livros da rea de informtica, promoveu uma pesquisa sobre Mudanas nos nomes dos arquivos
qual seria o banco de dados preferido dos seus visitantes e o O Firebird 1.0 utilizava os mesmos nomes de arquivos que o
Firebird/InterBase ficou em primeiro lugar. Tudo isso mostra seu progenitor, o InterBase. O Firebird 1.5 trouxe novos nomes
que o Firebird est ampliando rapidamente seu espao no dis- para esses arquivos, marcando sua identidade nos mesmos. A
putado mundo dos SGBD! Tabela 1 mostra os principais arquivos renomeados. A lista
O lanamento da verso 1.5 promete manter o FB sob os olha- completa est no release notes do FB 1.5.
res da mdia especializada por mais algum tempo. Essa verso
um marco na histria do Firebird, pois a primeira verso em Comandos CASE, COALESCE e NULLIF
que o banco d sinais claros de independncia do seu progenitor, O comando CASE permite retornar um valor baseado nas
o InterBase. Apesar da verso 1.0 ter apresentado vrias caracte- condies definidas. A introduo desse comando permitiu a
rsticas que j o diferenciavam do InterBase, ela ainda mantinha implementao de duas outras funes: COALESCE e NULLIF.
uma vnculo muito forte com o IB, usando inclusive os mesmos COALESCE retorna o primeiro valor no nulo de uma seqncia
nomes de arquivos, chaves de registro no Windows, etc.
Nome no FB 1.0 Nome no FB 1.5 Descrio T1
O Firebird 1.5 comeou a ser desenvolvido h vrios meses
Banco de dados de
atrs e deveria ser apenas uma verso de consolidao, apresen- isc4.gdb security.fdb
segurana
tando pela primeira vez a base de cdigo convertida de C para ibserver.exe fbserver.exe Servidor Firebird
C++. No entanto, foram tantas as novidades incorporadas nessa interbase.msg firebird.msg Mensagens de erro, etc.
verso que a tornam praticamente uma major version. interbase.log firebird.log Log do servidor e cliente
Arquivo de configuraes
Nesse artigo estarei apresentando as principais novida- isc_config firebird.conf
do servidor no Linux
des disponveis no FB 1.5. A listagem completa de todos os Arquivo de configuraes
Ibconfig firebird.conf
recursos, alteraes e correes de bugs pode ser encontra- do servidor no Windows
Biblioteca cliente do
da no release notes do Firebird. O link para download do gds32.dll fbclient.dll
Firebird no Windows
Release Notes em portugus do Brasil pode ser obtido em Biblioteca cliente do
libgds.so libfbclient.so / libfbembed.so
www.sqlmagazine.com.br/apostilas/Firebird1.5_RNBR.zip. As Firebird no Linux
novidades apresentadas aqui so especficas do Firebird e no Arquivos renomeados no Firebird 1.5

32
SQL Magazine

de valores passados como parmetros. SQL dinmicos possvel utilizar parmetros nos comandos
NULLIF recebe dois parmetros de entrada Um recurso poderoso que permite mon- montados dinamicamente.
e retorna NULL caso os valores dos 2 par- tar e executar dinamicamente comandos O cdigo da Listagem 3 mostra um
metros sejam iguais; caso os valores sejam SQL dentro de Stored Procedures e Triggers exemplo simples de utilizao desse recur-
diferentes, o valor do primeiro parmetro atravs dos comandos Execute Statement e so. A procedure SOMA recebe o nome de
retornado. Internamente COALESCE e sua variao For Execute Statement. O um campo e de uma tabela e realiza uma
NULLIF so convertidos em um CASE. primeiro deve ser utilizado para a execuo operao de somatria (SUM) nesse cam-
A Listagem 1 mostra a utilizao do de comandos que no retornam resultados po, retornando o valor obtido. A procedure
CASE em um select para substituir o cdigo (updates, inserts, etc.) ou retornam no selecionvel GET_ULT_COMPRA recebe
utilizado no campo mtodo_pagto (que re- mximo 1 linha de dados. O segun- como parmetro o nome de uma tabela e
presenta o tipo de pagamento realizado em do especfico para comandos que re- uma sequncia de cdigos de clientes sepa-
uma venda) pela sua respectiva descrio. tor nam vrias linhas de resultado rados por vrgula e devolve o nome de cada
Na Listagem 2 usamos a funo coalesce (selects tradicionais). cliente e a data da sua ltima compra.
para obter, em ordem de preferncia, o Como a engine do banco de dados no
nome fantasia de uma empresa, ou a razo pode validar previamente o comando Verso Classic do servidor para
social ou, caso nenhum desses esteja dispo- SQL que ser montado em tempo de Windows
nvel, o string Sem Nome. A funo nullif execuo, necessrio tomar cuidado na Muitos desconhecem o fato de que o
utilizada no update faz com que o campo sua construo pois um comando invlido Firebird se apresenta em duas verses:
estoque da tabela produtos fique nulo caso provocar uma exceo/erro ao ser execu- Classic e SuperServer. A diferena princi-
o valor atual dele seja 0. tado. Devemos lembrar tambm que no pal entre as duas que a Classic dispara
um processo do servidor para cada co-
L1 nexo requisitada e no compartilha o
Uso do CASE em select
cache de dados entre elas, significando
SELECT v.Nota_Fiscal, v.total,
CASE v.metodo_pagto que se houver 10 conexes a um mesmo
WHEN V THEN vista banco de dados existiro 10 processos do
WHEN P THEN Parcelado
WHEN C THEN Carto de crdito Firebird rodando e cada um deles ter sua
WHEN D THEN Cheque Pr-datado
ELSE Tipo desconhecido || v.metodo_pagto || prpria rea de memria no compartilha-
END da. A verso SuperServer trabalha com um
FROM Vendas v;
nico processo do servidor, criando threads
para cada conexo e compartilhando o
L2 cache entre elas. A Figura 1 mostra a tela
Exemplos de uso do coalesce e nullif. de instalao indicando qual a verso que
select coalesce (c.nome_fantasia, c.razao_social, Sem Nome) se deseja instalar.
from clientes c;
A verso Classic sempre existiu no
update produtos set estoque = nullif(estoque,0); Linux mas durante quase 8 anos parou
de ser produzida para o Windows. Seu
L3
retorno se deve ao fato de trabalhar me-
Utilizao do Execute Statement e For Execute Statement lhor com computadores SMP (Symmetric
CREATE PROCEDURE Soma (Campo VARCHAR(30), Tabela VARCHAR(50)) Multiple Processor) rodando siste-
RETURNS (Resultado NUMERIC (18,2)) ma operacional Windows, do que a
AS
BEGIN verso SuperServer. Dependendo do
EXECUTE STATEMENT SELECT SUM( || Campo || ) FROM || Tabela INTO
:Resultado; nmero de conexes simultneas e do
END tamanho definido para o cache dos ban-
CREATE PROCEDURE GET_ULT_COMPRA ( cos de dados, a verso Classic necessita
VARTABELA VARCHAR(32), de grande quantidade de memria RAM
VARCODIGOS VARCHAR(512))
AS no servidor.
DECLARE VARIABLE VARNOME VARCHAR(50);
DECLARE VARIABLE VARULTCOMPRA DATE;
begin Mltiplos servidores rodando
for execute statement
select nome, ultcompra from || :VarTabela || simultaneamente
where codigo in ( || :VarCodigos || ) A partir da verso 1.5, o Firebird permite
into :VarNome, :VarUltCompra
do que vrios servidores estejam rodando si-
begin
/* Processa as informaes */ multaneamente na mesma mquina. Cada
suspend; instncia do servidor deve usar uma porta
end
end TCP/IP distinta, lembrando que a porta
padro a 3050 (a mesma do InterBase).

33
N ovidades do Firebird 1.5

F1 O exemplo abaixo cria conhecida como versioning) do Firebird


uma chave primria na tabela torna praticamente desnecessria a uti-
TESTE e nomeia o ndice asso- lizao de travamentos pessimistas nas
ciado como ind_teste_pk_ID. aplicaes. No entanto, h situaes
Pelo nome podemos identifi- onde esse tipo de bloqueio bem vindo.
car facilmente a tabela a quem O Firebird 1.5 implementa duas novas
ele pertence (teste), que se clusulas no select para trabalhar com
trata de uma chave primria travamentos pessimistas. As clusulas
(pk), e qual o campo inde- WITH LOCK e FOR UPDATE
xado (ID). tem a funo de travar os reg istros
alter table teste add cons- selecionados, evitando que outr as
traint pk_teste primary transaes possam alter-los enquanto
key (id) using desc index
ind_teste_pk_ID; permanecerem bloqueados.
Devemos tomar cuidado para no ex-
Tela de instalao do servidor Firebird Classic ou SuperServer Triggers universais trapolar o uso desse recurso sob a pena
At a verso 1.0, um trigger de gerarmos deadlocks generalizados ou
Apesar de j ser possvel rodar vrios s poderia estar associado a um nico termos queda de performance.
servidores ao mesmo tempo, o pro- evento (after/before - insert,update,delete). O servidor gerencia o resultado de
cesso de instalao ainda no est pre- Agora podemos associar um nico trigger um select enviando as linhas resultantes
parado totalmente para essa situao, a vrios eventos! Para identificar o tipo de em pacotes para o cliente. O nmero de
sendo necessrio fazer algumas configura- ao que disparou o trigger foram criadas linhas enviadas em cada pacote varia de
es manuais para completar o processo. 3 variveis : Inserting, Updating e Deleting, acordo com alguns parmetros, como
A revista ClubeDelphi n50 contm um que podem ser checadas no cdigo do trig- a configurao da rede, protocolo, e o
artigo de minha autoria que mostra como ger e, atravs de Ifs, condicionar os coman- tamanho de cada linha. Sendo assim,
fazer a instalao e configurao de mlti- dos a serem executados, como mostrado quando utilizamos a clausula WITH LOCK
plos servidores Firebird no Windows. na Listagem 4. estamos na verdade travando uma quanti-
Atravs desse recurso pode-se at mesmo dade incerta de registros a cada fetch e por
rodar um servidor Firebird em conjunto Nota: No possvel criar triggers universais isso recomendado utiliz-la em se-
com o InterBase, o que pode facilitar a vida do tipo AFTER e BEFORE ao mesmo tempo. lects que retornem apenas uma nica
dos desenvolvedores que possuem sistemas linha de resultado.
trabalhando com os 2 bancos de dados ou NULLs em constraints e A clusula FOR UPDATE age de uma
esto migrando de um para outro. ndices nicos maneira diferente. Ela faz com que os
De acordo com o padro SQL 99, n- registros recuperados sejam enviados
Nomeao de ndices dices e constraints nicas podem aceitar um a um a cada fetch realizado pelo
automticos valores nulos desde que a coluna indexada cliente, o que nos permite determinar
Esses ndices so criados automaticamen- no esteja definida como NOT NULL. O exatamente qual foi a quantidade de
te pelo servidor Firebird durante a criao Firebird 1.5 implementa essa funcionali- registros bloqueados. Obviamente h
de uma constraint que dependa de ndices, dade, lembrando que a nica exceo o uma queda de performance na recupera-
como por exemplo chaves primrias ou caso de ndices criados por chaves primrias o de muitos registros quando o FOR
estrangeiras. At a verso 1.0, esses ndi- que, por definio, devem ter suas colunas UPDATE utilizado.
ces recebiam nomes padres no formato definidas como NOT NULL.
RDB$??? (ver Figura 2). fcil observar que Nota: Se voc no tem a preocupao de saber
esses nomes no dizem muita coisa ao de- Travamento pessimista exatamente quantos registros foram travados, o
senvolvedor, por exemplo: para saber quais O bom uso da arquitetura MGA (Mul- with lock sozinho tem mais performance pois
campos esto sendo indexados necessrio ti Gerational Architecture, tambm trava mais registros de uma nica vez.
consultar a metadata do banco.
F2
Outro problema gerado pela nomeao
automtica de ndices que durante um
backup/restore do banco de dados, o ndice
pode voltar com um nome diferente, o que
quebraria qualquer PLANO definido pelo
usurio que utilizasse esse ndice.
A verso 1.5 permite nomear o ndice
que ser gerado pela constraint atravs da
clusula USING. Nomeao de ndices automticos no FB 1.0

34
SQL Magazine

Uso de triggers universais


L4 ou no final (padro) da ordenao. Fique
atento com o uso do nulls first pois ele
CREATE TRIGGER TABELA_BIU FOR TABELA
ACTIVE BEFORE INSERT OR UPDATE POSITION 0 impede o uso de ndices para otimizar a
AS ordenao, o que pode gerar problemas
begin
if (inserting) then de performance em selects que retornam
begin
/* Executa alguma operao quando for insero */
grande quantidade de linhas.
end A ordenao de colunas retornadas por
else
if (updating) then UNIONs em selects tambm possvel atra-
begin vs do uso do grau (posio) das colunas na
/* Executa alguma operao quando for edio */
end clusula order by. O exemplo da Listagem 6
end
junta informaes de notas fiscais de 2 ta-
belas (filiais) atravs do union e ordena o
data)), funes alfanumricas (ex: group by resultado por data decrescente, sub-orde-
Em ambas as situaes devemos levar substring (fone from 1 for 2)) e at mesmo nando pelo campo processada, deixando as
em conta que, em selects que retornam o uso da clusula CASE (veja Listagem 5 notas que ainda no foram processadas por
vrios registros, no h garantia que todos e Figura 3)! ltimo (assumindo-se que o estado NULL
eles sejam travados no momento inicial da no campo processada determina que a nota
execuo do comando! Como vimos, os Nota: A clusula HAVING agora s permite a no foi processada).
registros so bloqueados quando so requi- utilizao de colunas ou expresses que estejam
sitados atravs de um fetch. Isso quer dizer presentes no group by. Nas verses anteriores essa Gerenciamento de excees
que se uma aplicao est recuperando os restrio no existia, mas os resultados obtidos O Firebird 1.5 permite a definio di-
dados em blocos, os registros que ainda no eram incorretos. nmica das mensagens exibidas por uma
foram requisitados no estaro protegidos. exceo no momento em que ela gerada,
Nesse meio tempo, uma outra transao Order by com expresses e permitindo que poucas excees estejam
pode acessar esses registros e bloque-los, posicionamento de nulls definidas previamente e que a mensagem
causando uma exceo (erro) quando a Agora possvel utilizar o order by com apresentada ao usurio mude de acordo
primeira transao tentar trav-los. Se expresses, bem como determinar se os com o problema encontrado. Tambm
houver necessidade de travar todos os re- valores nulos iro aparecer no comeo possvel re-gerar uma exceo (re-raise)
gistros no momento da abertura de uma
L5
query, podemos fazer uso de um FetchAll, Exemplos do uso de CASE com Group By
mas geralmente isso no desejado por select count(c.*)
questes de performance. from clientes c
group by
No exemplo abaixo, o primeiro select case
bloquear um nico registro selecionado WHEN (c.estado in (RS, SC, PR)) then Sul
WHEN (c.estado in (SP,RJ, ES, MG)) then Sudeste
pelo campo cdigo (chave primria). O WHEN (c.estado in (MG,MS,GO,DF)) then Centro-Oeste
segundo select travar os registros da WHEN (c.estado in (AC,RO,AM,RR,AP,PA)) then Norte
WHEN (c.estado in (MA,PI,CE,RN,PB,PE,AL,SE,BA)) then Nordeste
tabela de clientes onde o campo cidade ELSE Regio desconhecida
END
seja igual a So Paulo, lembrando que os
registros sero bloqueados um a um, a cada Ou ainda mais interessante:

fetch realizado. select


case
Select * from clientes WHEN (c.estado in (RS, SC, PR)) then Sul
where codigo = :x with lock; WHEN (c.estado in (SP,RJ, ES, MG)) then Sudeste
Select * from clientes WHEN (c.estado in (MG,MS,GO,DF)) then Centro-Oeste
where cidade = WHEN (c.estado in (AC,RO,AM,RR,AP,PA)) then Norte
So Paulo for update with lock; WHEN (c.estado in (MA,PI,CE,RN,PB,PE,AL,SE,BA)) then Nordeste
ELSE Regio desconhecida
END as REGIAO,
Mais recursos nas funes de count(c.*) as NUM_CLIENTES
from clientes c
agregao group by 1
A verso 1.0 do Firebird permitia a
utilizao do group by somente com co- L6
lunas nomeadas no select ou com funes Exemplo de utilizao de nulls last com uma union
definidas pelo usurio (udf ). A verso 1.5 Select data, nota_fiscal, valor, processada
estendeu a utilizao do group by aceitan- From notas_filial_1
Union
do agora o grau (posio) da coluna no Select data, nota_fiscal, valor, processada
From notas_filial_2
select (ex: group by 1, 2), funes num- Order by 1 desc, 4 nulls last;
ricas (ex: group by extract (month from

35
N ovidades do Firebird 1.5

dentro de um bloco de tratamento de nomenclatura especialmente se estiver ro- mais rpido do que o acesso ao disco, e
excees WHEN...DO, bem como obter o dando o servidor no Windows XP ou ME portanto h um alto ganho de performance
valor numrico do cdigo do erro da exce- com a opo de Recuperao de sistema nessas situaes. Caso no haja memria
o nas variveis GDSCODE e SQLCODE. ativada. Nessa situao, o Windows realiza RAM livre suficiente, o mtodo antigo de
A Listagem 7 mostra exemplos do uso de backups automticos de todos os arquivos ordenao utilizado.
excees dinmicas e re-raise de excees: com extenso .gdb quando so acessados
pela primeira vez, deixando a performance Otimizador mais inteligente
Comando LEAVE/BREAK da primeira conexo com o banco terrivel- Foram realizadas grandes melhorias
Permite interromper o processamento mente lenta. no otimizador de queries promovendo
de loops gerados pelos comandos WHILE, ganhos de performance entre 30% e 60%!
FOR SELECT e FOR EXECUTE, desviando Opes de configurao O otimizador agora menos suscetvel
o processamento para o prximo comando do servidor a falhas na escolha dos ndices e ganhou
logo aps o END final do loop. O padro Um novo arquivo chamado firebird.conf poderes para utiliz-los em situaes onde
SQL-99 aconselha a utilizao do LEAVE ao contm vrios parmetros de configurao anteriormente no era possvel. Selects
invs do BREAK, mas ambos tem a mesma global do servidor Firebird. Esse arquivo extensos envolvendo diversas tabelas ou
finalidade. Os comandos Leave, Break e substitui o antigo isc_config (Linux) ou que utilizam junes do tipo left join
Exit podem ser usados tanto em triggers ibconfig (Windows). Dezenas de parme- produzem agora PLANos mais inteligentes
como em stored procedures. A Listagem 8 tros foram adicionados, oferecendo muito de acesso.
mostra um exemplo de utilizao do leave mais funcionalidade e flexibilidade na con-
para interromper um loop baseado em figurao do servidor. O arquivo firebird. Mensagens de erro mais
uma condio. conf est extensivamente comentado com especficas
explicaes sobre cada parmetro dispon- Houve uma preocupao com a melho-
Apelidos (alias) de banco de vel, e pode ser editado/visualizado com ria das mensagens de erros apresentadas
dados qualquer editor de texto puro. pelo servidor, fazendo com que elas sejam
At hoje o string de conexo com um mais explcitas e especficas situao de
banco de dados Firebird obrigatoriamen- Ordenao em memria erro ocorrido, facilitando muito o processo
te continha o caminho (path) completo O servidor passou a utilizar a memria de debug do cdigo de stored procedures
para o banco de dados, o que poderia RAM disponvel ao invs de arquivos tem- e triggers.
facilitar a ao de hackers que facilmente porrios para fazer as ordenaes (sorts) ne-
descobririam a localizao fsica do arqui- cessrias durante a execuo de comandos Servidor Embedded
vo no servidor. A verso 1.5 introduziu SQL. O acesso memria RAM muito A utilizao de bancos de dados relacionais
o arquivo aliases.conf, localizado no
F3
diretrio de instalao do FB. Ele permite
que apelidos sejam atribudos aos ban-
cos de dados e que esses apelidos sejam
utilizados nos strings de conexo. O ar-
quivo aliases.conf pode ser editado com
um editor de textos puro, como o
bloco de notas. Cada linha do arquivo
deve estar no formato apelido = caminho,
por exemplo: Resultado do select com case e group by

Banco1 = c:\bancos\meu_banco.fdb L7
Exemplos de uso e tratamento de excees

No exemplo, o string de conexo para If (new.valor < 0) then


Exception valor_negativo O valor || cast (new.valor as varchar(15)) ||
o banco de dados meu_banco.fdb rodan- no vlido!;
do em um suposto servidor chamado
...
my_server pode ser especificado como begin
my_server:Banco1 ao invs de my_server: update produtos set estoque = (estoque new.qtde)
where codprod = new.codprod;
c:\bancos\meu_banco.fdb.
when any do
begin
Novo padro para a extenso insert into log (coderro, descricao)
values (sqlcode,Erro ao atualizar estoque do produto : || new.codprod);
dos arquivos de Bancos de dados exception; -- Re-raise
A extenso padro dos arquivos de ban- end
end
cos de dados Firebird mudou de .gdb para ...
.fdb. recomendvel que voc adote a nova

36
SQL Magazine

L8 Aumento do nmero mximo de


Utilizao do Leave para interromper o loop.
ndices por tabela O limite passou de 64
conta = 1;
while (:conta < 100) do para 256 ndices por tabela.
begin Trfego de VARCHARs magros
-- Realiza algum processamento, como clculos com as variveis x e y
if (:x = :y) then leave; -- Se o valor da varivel x for igual ao de y, sai do loop. Com o uso da fbclient.dll do Firebird 1.5, as
conta = conta + 1; informaes de campos do tipo VARCHAR
end
trafegam pela rede sem preenchimento des-
necessrio. At a verso 1.0 a requisio de
sempre dificultou a gerao de softwares de SavePoints um campo definido como VARCHAR(100)
demonstrao ou catlogos em CDROM, SavePoints funcionam como marcas trafegaria pelo menos 100 bytes pela rede,
pois o usurio teria a incmoda tarefa de inseridas em determinados pontos durante mesmo que o valor armazenado no campo
instalar o servidor de banco de dados na sua a execuo de mltiplos comandos SQL. no ocupasse todo o espao definido.
mquina para poder acess-los. O servidor Atravs dele possvel fazer um rollback API de servios parcialmente dispo-
Embedded resolve definitivamente esse parcial das operaes realizadas voltando o nvel na verso Classic para Linux A
problema trazendo um servidor Firebird estado do banco de dados para um determi- API de servios para backup, restores e
completo (com todas as funcionalidades do nado SavePoint. Entre os recursos listados validao do banco de dados est dispon-
servidor comum) em uma nica DLL que nesse artigo, esse o nico que tambm vel na verso CS para Linux. Os servios
pode ser distribuda junto com a aplicao. est disponvel no InterBase 7.x. de estatsticas e log do servidor ainda no
isso mesmo! Voc s precisa distribuir Os comandos disponveis para criao e esto disponveis nessa verso.
o seu executvel juntamente com a DLL manipulao de SavePoints so: BIGINT Novo tipo de dado que re-
do servidor embedded e ter um servidor SAVEPOINT identificador cria um presenta um Inteiro de 64 bits.
Firebird totalmente funcional! Note que o SavePoint com o nome determinado por Recreate View Permite criar ou re-
servidor embedded permite apenas uma identificador criar uma view caso ela j exista.
conexo local de uma nica aplicao por ROLLBACK TO identificador Des- Create or Alter [stored procedure/
vez. Um artigo mostrando a utilizao do faz as operaes realizadas aps a criao do trigger] Cria ou altera uma stored proce-
servidor embedded, escrito por este autor, savepoint determinado por identificador dure ou trigger caso j exista, mantendo as
pode ser encontrado na revista ClubeDel- RELEASE SAVEPOINT [ONLY] iden- dependncias e permisses existentes.
phi 51. tificador Apaga o SavePoint especificado Definio de comentrios Comen-
Vale lembrar que para acessar bancos de e todos os SavePoints criados depois dele trios de final de linha podem ser definidos
dados em mdias read-only como CDROMs caso ONLY no seja utilizado. utilizando-se -- ao invs de /* ... */.
preciso anteriormente ter configurado Para no quebrar a atomicidade dos Inicializao de variveis Agora
o arquivo do banco de dados para modo comandos executados, os SavePoints no possvel inicializar variveis durante
somente leitura atravs do utilitrio gfix Firebird no esto disponveis em Stored a sua declarao (ex: declare variable
e o parmetro mode read_only (ex: gfix Procedures e Triggers, pois elas possuem contador = 0;).
mode read_only user SYSDBA pas mas- um mecanismo interno onde todos os co- Blocos vazios Blocos Begin...End que
terkey meubanco.fdb). mandos (ou bloco de comandos begin... no possuem comandos em seu corpo ago-
end) executados so associados automati- ra podem ser compilados sem gerar erro.
ROW_COUNT camente a savepoints internos. Current_Connection e Current_
possvel saber quantas linhas foram Atravs de blocos de tratamento de Transaction Retornam os identificadores
afetadas pela execuo de um comando excees (when...do), pode-se controlar (valor do tipo inteiro) da conexo e tran-
de DML (Data Manipulation Language) quais operaes sero desfeitas dentro sao atual.
checando a varivel ROW_COUNT de uma Stored Procedure ou Trigger. Na
logo aps a execuo do comando. Essa Listagem 9 vemos um exemplo de utiliza- O que podemos esperar para o
varivel pode ser checada dentro de triggers o de SavePoints durante a execuo de futuro
e stored procedures. um script SQL: Por incrvel que parea, enquanto os
ltimos ajustes estavam sendo feitos para
Nota: ROW_COUNT no atualizada Outros aprimoramentos o lanamento da verso 1.5, alguns desen-
pela execuo dos comandos (FOR) EXECUTE Cache de conexo com o BD de se- volvedores j trabalhavam na verso 2.0
STATEMENT. gurana Agora o Firebird SuperServer do Firebird!
Exemplo: estabelece a conexo com o banco de dados Dois fatores contribuiro para que a
de segurana (security.fdb) durante a pri- verso 2.0 esteja ainda mais recheada de
Update produtos set estoque = estoque + meira conexo com o servidor e a mantm novidades:
:qtde where codprod = :MeuProduto;
If (row_count = 0) then aberta enquanto houver uma conexo ativa, 1) Jim Starkey o criador do Inter-
Exception exc_notfound No foi || agilizando o processo de abertura de novas Base foi contratado pela IBPhoenix
possvel atualizar o estoque para ||
o produto || :MeuProduto; conexes clientes. para desenvolver uma verso derivada

37
N ovidades do Firebird 1.5

do Firebird (atualmente chamada de ndices (otimizando pesquisas e garba- S


Vulcan) para rodar em processadores ge collection); Faa o download e
64bits com suporte total multi-thread. Novo protocolo local de conexo comente essa matria em:
A boa notcia que o Vulcan tambm (XNET); www.sqlmagazine.com.br/sql11
Open Source e ter muitas das suas mu- Suporte completo a multi-thread e
danas incorporadas ao cdigo fonte do SMP;
Firebird! Suporte explcito a cursores SQL den- R
2) Juno do cdigo do Yaffil O Yaffil tro de Stored Procedures e Triggers;
era um banco de dados comercial derivado Release Notes do Firebird 1.5
do Firebird 1.0 e desenvolvido por russos. Concluso
H alguns meses foi anunciada a juno Nesse artigo foi demonstrado as ino- How to lock a record in
do cdigo do Yaffil ao Firebird, ou seja, os vaes mais importantes acrescenta- InterBase/Firebird
novos recursos implementados no Yaffil das ao Firebird 1.5. importante que (www.interbase-world.com/en/articles/
sero portados para o Firebird. Antes que todos leiam o Release Notes que acom- detail.php?ID=805&phrase_id=10765)
me perguntem: Sim! O Firebird continuar panha o FB para f icarem cientes de
gratuito e Open Source! todos os detalhes dessas implementaes, Lista de discusso Firebird-Devel
Aliado a esses dois fatores, podemos bem como caractersticas de instalao, (www.firebirdsql.com)
esperar novidades muito interessantes para etc.
a prxima verso: Aos que ainda no utilizam o Fire- Firefox - A New Brand of Browser
Funes SQL; bird como servidor de dados, espero
(www.firebirdsql.org/index.php?action=
Select from Select; que eu tenha conseguido despertar sua
view_item&topic=1076405361)
Backups incrementais; curiosidade a ponto de faz-lo baixar e tes-
Monitoramento de queries e cone- tar o servidor! O download pode ser feito
xes; no site oficial do firebird (www.firebirdsql.
Novo sistema de segurana e geren- org). Lembre-se, de graa! e garanto que
ciamento de usurios; ficar muito satisfeito com o que vai en- A
Novo algoritmo para rvore de contrar pela frente. Carlos Henrique Cantu
L9 (cantu@clubedelphi.com.br) Ba-
Utilizao de SavePoints
charel em Cincia da Computao e
Insert into tabela1 (campoA) values (1); ps-graduado em anlise de sistemas,
Commit;
Insert into tabela1 (campoA) values (2); trabalha com o desenvolvimento de
SavePoint SP1;
Insert into tabela1 (campoA) values (3); softwares h 15 anos. consultor
SavePoint SP2;
Select count(*) from tabela1 -- Retornar 3
especializado em bancos de dados
Delete from tabela1; Firebird/InterBase, mantenedor do site
Select count(*) from tabela1 -- Retornar 0 www.firebase.com.br, editor da SQL
RollBack to SP2; -- Desfaz o DELETE Magazine, membro da equipe editorial
Select count(*) from tabela1 -- Retornar 3 da revista ClubeDelphi e presidente do
RollBack to SP1; -- Desfaz a insero do valor 3 DUG-BR (www.dugbr.com.br). Ministra
Select count(*) from tabela1 -- Retornar 2
palestras sobre Firebird em diversos
RollBack; -- Desfaz a insero do valor 2;
Select count(*) from tabela1 -- Retornar 1 eventos por todo o Brasil.

38
SQL Magazine

39
U
H
m tradutor
de Triggers

Geraldo Zimbro

diversos motivos para que se queira portar triggers entre


bancos de dados diferentes. Um motivo comum hoje em
dia so as polticas de consolidao, centralizao, ou
padronizao de SGBDs, em curso em diversas empresas e que
impem a migrao de um sistema feito em um BD para outro.
rapidamente um tradutor que trate a maioria dos triggers, e deixe
uns poucos casos para serem manualmente traduzidos.
Um passo importante na hora de construir um tradutor desse
tipo decidir quais comandos e construes da linguagem sero
tratados e quais sero deixados de fora. No nosso exemplo iremos
Embora a migrao do esquema e dos dados possa oferecer al- construir um tradutor de triggers escritos em PL/SQL Oracle
guma dificuldade por conta dos tipos de campos e restries de para a linguagem do Firebird 1.5 (uma verso melhorada da
integridade, j existem ferramentas que auxiliam esta atividade, linguagem disponvel no Interbase 6.0 e no FB 1.0). Passemos a
como por exemplo o IBDataPump (www.clevercomponents.com). analisar agora as principais semelhanas e diferenas entre estas
No entanto, a migrao dos triggers quase sempre realizada duas linguagens.
de forma manual, sendo uma tarefa custosa e principalmente O primeiro ponto a ser analisado diz respeito aos eventos que
entediante, propensa portanto introduo de bugs. Se este pas- ativam os triggers. Nesse quesito temos uma incompatibilidade
so for automatizado, o custo de migrao pode ser reduzido e, difcil de ser superada: o Oracle possui um tipo especial de triggers,
principalmente, a qualidade melhorada. Outras motivaes para chamado de statement level (vide artigo de Stored Procedures e Tri-
a migrao so a atualizao de aplicaes que usam SGBDs que ggers no Oracle publicado na SQL Magazine n 4). No h como
caram em desuso, ou cujas licenas se tornaram muito caras, ou criar diretamente um trigger equivalente no Firebird. No entanto,
ainda a migrao para software livre. conforme afirmamos antes, isto no chega a ser um empecilho
Neste artigo apresentaremos uma soluo automatizada para grave pois esse tipo de trigger raramente utilizado. De resto, os
um problema muito comum na rea de banco de dados: portar triggers do Oracle so ativados pelos mesmos seis eventos que o
triggers entre sistemas gerenciadores de bancos de dados (SGBD). Firebird: after ou before insert, after ou before update e after ou before
Mais precisamente, iremos mostrar como construir um progra- delete, chamados uma vez para cada linha afetada na tabela.
ma tradutor que reescreva na linguagem do Firebird 1.5 (PSQL) Ainda sobre a ativao de um trigger, o Oracle permite definir
triggers originalmente escritos em PL/SQL Oracle. A tcnica a ser que um trigger de update seja acionado somente se determinados
utilizada a mesma empregada na construo de compiladores, e campos forem alterados. possvel tambm definir uma pr-con-
pode ser facilmente adaptada para outros SGBDs. No entanto, dio (clusula WHEN) para que um trigger seja acionado. Essas
exigido que o programador tenha um mnimo de conhecimentos funcionalidades no esto presentes no Firebird, mas veremos que
tericos sobre construo de compiladores (normalmente ensi- fcil simul-las com o uso de alguns comandos IF-THEN.
nado em qualquer curso de graduao em informtica). Faremos O segundo ponto diz respeito aos tipos de dados. Para os tipos
um breve apanhado da teoria necessria, mostrando o uso das bsicos de dados no teremos muitos problemas, pois os tipos
ferramentas mais comuns disponveis: o lex e o yacc. do Firebird so compatveis com os do Oracle. J para os curso-
res, arrays (vetores) e tabelas temporrias as semelhanas sero
LSemelhanas entre as linguagens suficientes para evitar solues complicadas, mas teremos de
Para que seja possvel automatizar a traduo de um trigger restringir um pouco a traduo nesse ponto.
de uma linguagem para outra necessrio que haja um mnimo No geral, embora haja diferenas entre as linguagens analisa-
de compatibilidade entre suas estruturas. Linguagens que apre- das, grande parte delas so diferenas de sintaxe, ou seja, exis-
sentem construes muito especficas iro dificultar ou mesmo tem comandos com funes semelhantes mas com nomes ou
tornar invivel o mapeamento. Por sorte, as construes muito construes diferentes em cada linguagem. Assim, ser possvel
especficas em geral no so muito utilizadas, o que torna o construir um tradutor que ir abranger a maioria dos triggers
tradutor eficaz na maioria dos casos. Ou seja, podemos construir comumente implementados.

40
SQL - Magazine

L1
Exemplo de GLC Essa gramtica mostra como podem ser bird. Dessa forma, sempre que uma deter-
E E + E
E E - E
geradas expresses matemticas. Por exem- minada produo for utilizada, o fragmento
E E * E plo, a produo E E + E nos mostra de cdigo associado a ela ser executado.
E E / E
E ( E ) que a varivel E pode ser substituda
E id
E num por E + E. Assim, para construir uma Nota: Uma limitao do yacc que ele no
expresso aritmtica qualquer envolvendo deve ser utilizado com gramticas ambguas.
Reviso: compiladores, identificadores e nmeros podemos ir Gramticas ambguas so as que permitem mais
gramticas, lex, yacc, atributos aplicando as regras de substituio acima. de uma rvore de derivao, ou seja, significa
Iremos agora fazer uma pequena reviso Esse processo chamado de derivao. Por que o compilador pode realizar a derivao de
prtica do processo de traduo e as princi- exemplo, para derivar a expresso id * ( id mais de uma forma diferente. O problema que
pais ferramentas utilizadas o lex e o yacc. + num ) podemos usar as seguintes regras em geral apenas uma delas correta.
Nosso ambiente de desenvolvimento foi o de produo:
Linux Conectiva 7.0, Kernel 2.4 e gcc 2.95.3. A Listagem 3 apresenta um fragmento de
O lex e o yacc so instalados por default nessa E E * E id * E id * ( E ) id * ( E uma GLC no yacc descrevendo o comando
distribuio. + E ) id * ( id + E ) id * ( id + num ) IF do PL/SQL. Novamente, os %% so
Lex e yacc so ferramentas complemen- separadores, e a gramtica ir ficar entre o
tares para a construo de compiladores. O que o lex e o yacc fazem criar um primeiro e o segundo %%. Sempre que
Ambas possuem uma linguagem de progra- programa tradutor que, recebendo como tivermos mais de uma possibilidade de subs-
mao prpria, que quando processada gera entrada um programa em uma linguagem, tituio (p.e. EE+E ou EEE) iremos
como sada um programa em C padro, que encontra uma derivao que produza essa agrup-las atravs do smbolo | (p.e. E
ao ser compilado pelo gcc gera um execut- entrada de acordo com determinada GLC. E+E | EE). No yacc, a substituda
vel o nosso tradutor. por um :; o ; marca o fim da lista de
A tcnica de construo de compiladores Lex produes, e o cdigo a ser executado vem
que iremos utilizar divide o compilador O lex cuida de reconhecer os smbolos ter- entre chaves (o cdigo ilustrado somente
em trs etapas de anlise e uma de snte- minais: identificadores, nmeros, palavras na Listagem 4).
se: anlises lxica, sinttica e semntica, reservadas, operadores, parnteses etc. Nesse exemplo no mostramos o restante
e gerao de cdigo. Por se tratar de um Na Listagem 2 temos um fragmento de da gramtica para os smbolos EXP e CMD.
tradutor simples, no iremos abordar ne- um arquivo lex (o arquivo completo est Note que os smbolos terminais (tokens)
nhum tipo de otimizao de cdigo nem no site da revista). O smbolo %% um so descritos antes do primeiro %% e
representaes intermedirias. O lex serve separador de sees. Basicamente, o arqui-
para construir analisadores lxicos, e o yacc vo lex ir descrever, entre o primeiro e o L2
Exemplo do arquivo lex
para construir analisadores sintticos. O segundo %%, o que ser retornado para WS [ \n\t]
analisador semntico e a gerao de cdigo cada padro que for encontrado. Assim, ire- LETTER
DIGIT
[a-zA-Z_]
[0-9]
sero manualmente escritos por ns de uma mos retornar uma constante _CREATE ID ({LETTER}({LETTER}|{DIGIT})*)
NUM ({DIGIT}+(\.{DIGIT}+)?)
forma predeterminada para ser integrada quando encontrarmos a palavra CREATE QQSTR ([][^\n]*[])
QSTR ([][^\n]*[])
ao lex e ao yacc. no programa fonte, e assim por diante. De-
ver haver uma entrada para cada palavra %%
{WS} {};
Gramticas reservada da linguagem. J NUM um CREATE { return _CREATE; }
REPLACE { return _REPLACE; }
Para se construir um compilador ne- padro mais elaborado, descrito antes do IF { return _IF; }
cessrio conhecer o conceito de Gramtica primeiro %%, e que formado por dgitos THEN { return _THEN; }
ELSE { return _ELSE; }
Livre de Contexto (GLC). Uma GLC um com ponto opcional. Nesse caso, quando END IF { return _ENDIF; }

conjunto de regras de substituio que um nmero for reconhecido, iremos re- {NUM} { yylval = yytext; return _NUM; }
{ID} { yylval = yytext; return _ID; }
podem ser aplicadas para que determinada tornar uma constante _NUM e iremos . { return yytext[0]; }
sentena seja produzida em uma lingua- armazenar o seu valor na varivel global %%

gem. yylval, que uma string do C++. Finalmen-


L3
Uma GLC formada por: um conjunto te, o ponto significa um caractere simples: Fragmento do arquivo yacc
#token _ID _NUM _IF _THEN _ELSE _ENDIF
de smbolos terminais (que correspondem os operadores + e , por exemplo.
%%
a smbolos da linguagem e so tambm cha-
mados de tokens), um conjunto de smbolos Yacc CMD_IF : _IF EXP _THEN CMDS _ENDIF
| _IF EXP _THEN CMDS _ELSE CMDS
no-terminais ou variveis (que represen- O yacc ter a descrio GLC da linguagem _ENDIF
;
tam passos intermedirios), um conjunto a ser traduzida, no nosso caso, o PL/SQL.
de regras de produo (que mostram Junto com as regras de produo no yacc, CMDS : CMD ; CMDS
| CMD ;
como podemos substituir os smbolos), e iremos colocar trechos de cdigo que sero ;

um smbolo inicial. Como exemplo, veja a acionados para realizar a traduo de uma %%
gramtica da Listagem 1. estrutura para sua correspondente no Fire-

41
U m Tradutor de Triggers

L4
Fragmento do arquivo yacc
devero ter o seu padro descrito no arquivo %%
do lex. Vemos tambm que CMDS uma CMDS : CMD ; CMDS { $$ = $1 + ;\n + $3; }
lista de CMD separados por ;: quando um | CMD ; { $$ = $1 + ;\n; }
;
caractere aparece entre plics quer dizer que
CMD : CMD_IF
ele deve aparecer no programa de entrada | CMD_INSERT
tambm. | CMD_UPATE
... // trecho de cdigo suprimido
Essa gramtica nos informa que um co- ;
mando IF do PL/SQL sempre terminado CMD_IF : _IF EXP _THEN CMDS _ENDIF { $$ = IF + $2 + THEN \nBEGIN\n + $4 +
por um ENDIF, possui um THEN e pode END;\n }
| _IF EXP _THEN CMDS _ELSE CMDS _ENDIF { $$ = IF + $2 +
ter um ELSE ou no. Aps o THEN e aps THEN \nBEGIN\n + $4 + END\nELSE\nBEGIN\n + $5 + END;\n }
;
o ELSE podem vir uma lista de comandos
%%
separados por ;.

Atributos Gramtica Inicial


L5
Para facilitar a programao, o yacc dis- TRG _CREATE RPL _TRIGGER TRGNAME ORDER EVENTS _ON TRGTABLE FOREACHROW PLBLOCK
FOREACHROW _FOR _EACH _ROW
ponibiliza um atributo para cada token en- RPL _OR _REPLACE |
TRGNAME _ID '.' _ID | _ID
contrado durante a anlise sinttica. Assim, ORDER _BEFORE | _AFTER
na produo A X Y Z teremos quatro EVENTS EVENTS _OR EVENT | EVENT
EVENT _INSERT | _UPDATE UPDCOLS | _DELETE
atributos. Utilizamos os atributos dos sm- UPDCOLS _OF _ID COLS |
COLS ',' _ID COLS |
bolos do lado direito para calcular o valor TRGTABLE _ID '.' _ID | _ID
do atributo do smbolo do lado esquerdo,
ou seja, usamos X, Y e Z para calcular A.
Finalmente, cada atributo representado importante atentar que no Firebird no END no local apropriado e (3) ignorando
por um $ seguido do nmero de sua posio: existe ENDIF, mas cada bloco de comandos o ENDIF.
o A $0, o X $1, o Y $2 e o Z $3. O $0 deve vir entre BEGINEND. Estamos assumindo que cada comando
pode ser escrito tambm como $$. Nesta listagem temos a traduo de ter a sua prpria regra de traduo, como
A Listagem 4 apresenta, para o exemplo um IF: (1) tomando os atributos do lado no caso do CMD_IF, CMD_INSERT,
da Listagem 3, a regra de traduo do IF esquerdo e concatenando-os na ordem CMD_UPDATE etc. Cada uma dessas re-
em PL/SQL Oracle para IF em Firebird. correta, (2) colocando as palavras BEGIN- gras ir calcular o seu atributo $$. A regra
de traduo default $$ = $1, ou seja, se ne-
ex e Yacc nhuma traduo for especificada o valor de
O processo de um compilador ou interpretador de uma linguagem de programao geralmente $1 copiado para o $$. Na listagem acima,
decomposto em 2 tarefas: na traduo de CMD : CMD_IF teremos
1) Ler o programa fonte e descobrir sua estrutura; o valor de $1 copiado diretamente para $$.
2) Processar sua estrutura para gerar o programa final. Note que a traduo de CMDS : CMD
; CMDS concatena os atributos do lado
O Lex e o Yacc podem ajudar na primeira tarefa que pode ser subdividida em mais 2 partes: direito antes de copiar para $$. Com isso,
1) Dividir o cdigo em tokens (funo do Lex); o compilador ir agir da seguinte forma:
2) Descobrir a hierarquia da estrutura do programa (Yacc). cada comando ter uma regra de traduo,
semelhante ao cdigo que mostramos para
Lex e yacc so dois programas de linha de comando disponveis em quase todas as distribuies o CMD_IF. O resultado dessa traduo
do Unix e do Linux. O lex deve ser chamado recebendo como entrada um parmetro que o nome copiado para CMD, e depois cada CMD
do arquivo contendo os comandos a serem processados. Por exemplo: concatenado na regra CMDS, acumulando
$bash> lex entrada.l todo o cdigo do trigger em CMDS.
Tendo entendido como as coisas funcio-
A sada do lex ser um programa em C (lex.yy.c) contendo rotinas que sero chamadas pelo nosso nam, nosso trabalho agora ser criar uma
compilador. gramtica para o PL/SQL Oracle e projetar
O yacc deve ser chamado recebendo como parmetro o nome do arquivo que contm as regras uma traduo das estruturas de cada co-
de traduo para o nosso compilador, e produz como sada o cdigo source do compilador (y.tab. mando para seu equivalente no Firebird.
c). Esse cdigo fonte contm chamadas para as funes geradas pelo lex no arquivo lex.yy.c (dessa
forma, um include usado para referenciar o arquivo lex.yy.c). Depois basta usar o gcc para compilar A gramtica utilizada
o arquivo y.tab.c e assim gerar o executvel do nosso compilador. Agora definiremos de forma incremen-
O programa compilado gerado pelo yacc um executvel que l um arquivo na entrada padro e, tal a gramtica. Inicialmente trataremos
atravs das regras de traduo especificadas, produz o arquivo compilado, ou seja, o cdigo tradu- dos eventos e em seguida do bloco com
zido, na sada padro. as declaraes de variveis e comandos.
A Listagem 5 ilustra a gramtica inicial.

42
SQL - Magazine

L6
Fragmento de Cdigo do Yacc Estamos usando a letra grega para
string ofColumns;
%%
simbolizar a substituio por vazio, de
modo a representar comandos opcionais.
TRG : _CREATE RPL _TRIGGER TRGNAME ORDER EVENTS _ON TRGTABLE FOREACHROW PLBLOCK
{ Por exemplo, RPL pode ser substitudo por
cout<<SET TERM !! ;;
cout<<CREATE <<$2<<TRIGGER <<$4<< FOR <<$8<<endl; OR REPLACE ou por vazio, de forma que
cout<<ACTIVE <<$5<< <<$6<< AS<<endl;
if (OfColumns != )
podemos ter aps o CREATE a clusula
$10= IF ( NOT UPDATING OR( + OfColumns + )) THEN\n BEGIN\n + OR REPLACE ou direto o nome do trig-
$10 + END\n;
ger. Alm disso, no Firebird o REPLACE
cout<<BEGIN\n<<$10<<\nEND !!\n<<endl;
}
deve ser trocado por ALTER.
; Para simular a funcionalidade UPDATE
FOREACHROW : _FOR _EACH _ROW ; OF coluna presente no Oracle e ausente no
RPL : _OR _REPLACE { $$ = OR ALTER ; } Firebird iremos gerar um trigger de update
| { $$ = ; }
;
comeando com um IF que ir testar se
alguma das colunas presentes na lista de
TRGNAME : _ID . _ID { $$ = $1 + $2 + $3 };
| _ID colunas do update foi alterada. Este teste
;
consiste em comparar o valor novo com o
ORDER : _BEFORE velho: old.coluna <> new.coluna. Devemos
| _AFTER
; apenas tomar cuidado com a lgica do teste
EVENTS : EVENTS _OR EVENT { $$ = $1 + OR + $3; } para considerar tambm valores nulos. O
| EVENT
;
teste correto ser (para cada coluna C): (new.
C <> old.C) or (new.C is null and old.C is not
EVENT : _INSERT
| _UPDATE UPDCOLS null) or (new.C is not null and new.C is null).
| _DELETE
;
Esse mesmo artifcio pode ser utilizado para
simular a clusula WHEN. A Listagem 6
UPDCOLS : _OF COLS { OfColumns = $2; }
| { OfColumns = ; } mostra o cdigo dessa traduo.
;

COLS : _ID , COLS


{ $$ = ((NEW.+$1+ <> OLD.+$1+) OR \n +
Exemplo
(NEW.+$1+ IS NULL AND OLD.+$1+ IS NOT NULL) OR \n + Na Listagem 7 vemos o cdigo de um
(NEW.+$1+ IS NOT NULL AND OLD.+$1+ IS NULL))\n + OR +$3; }
| _ID trigger ativado no insert e no update da
{ $$ = ((NEW.+$1+ <> OLD.+$1+) OR \n +
(NEW.+$1+ IS NULL AND OLD.+$1+ IS NOT NULL) OR \n +
coluna quantidade em PL/SQL. Esse trig-
(NEW.+$1+ IS NOT NULL AND OLD.+$1+ IS NULL))\n; } ger apenas um exemplo, no h nenhum
;
propsito coerente em acion-lo apenas na
TRGTABLE : _ID . _ID { $$ = $1 + $2 + $3 };
| _ID alterao da quantidade.
; Traduzindo este trigger para a linguagem
PLBLOCK : _BEGIN CMDS _END ; { $$ = $2 + \n; } do Firebird (ver Listagem 8) veremos que
;
foi inserido um teste para verificar se a
CMDS : CMD ; CMDS { $$ = $1 + $2 + $3; }
| { $$ = ; } S
;
Faa o download e comente essa
matria em:
L7 www.sqlmagazine.com.br/sql11
Trigger em PL/SQL
CREATE OR REPLACE TRIGGER TRG_AI_PEDIDO
AFTER INSERT OR UPDATE OF QUANTIDADE ON ITEM A
FOR EACH ROW
BEGIN Geraldo Zimbro
UPDATE PEDIDO SET
NUMERO_ITENS = NUMERO_ITENS + :NEW.QUANTIDADE,
(zimbrao@cos.ufrj.br) pesquisador da
TOTAL = TOTAL + :NEW.VALOR COPPETEC, professor de informtica da
WHERE ID = :NEW.PEDIDO_ID;
END; UFRJ e membro da equipe editorial da
SQL Magazine. doutor em Banco de
L8 Dados pela COPPE desde 1999. Partici-
Trigger traduzido para o Firebird
SET TERM !! ; pa de projetos de consultoria pela Fun-
CREATE OR ALTER TRIGGER TRG_AI_PEDIDO FOR ITEM
ACTIVE AFTER INSERT OR UPDATE AS dao COPPETEC desde 1995, tendo
BEGIN
IF (NOT UPDATING OR atuado no projeto de diversas bases de
(((NEW.QUANTIDADE <> OLD.QUANTIDADE) OR
(NEW.QUANTIDADE IS NULL AND OLD.QUANTIDADE IS NOT NULL) OR dados de instituies como Embratel,
(NEW.QUANTIDADE IS NOT NULL AND OLD.QUANTIDADE IS NULL)))) THEN
BEGIN
Marinha, Ministrio da Defesa e Data-
UPDATE PEDIDO SET
NUMERO_ITENS = NUMERO_ITENS + new.QUANTIDADE,
Sus. Site: www.cos.ufrj.br/~zimbrao
TOTAL = TOTAL + new.VALOR
WHERE ID = new.PEDIDO_ID;
END
END !!

43
H
U m dos mais poderosos re-
cursos do transact-SQL do
SQL Server a possibilidade
de criar instncias de objetos OLE
ow to:
Usando objetos OLE via SQL
Server

Anderson Pontes Pinto

Procedure
Sp_OACreate
Descrio
Cria a instncia de um
objeto OLE.
Parmetros
ProgID: a string de caracteres que referencia a classe do objeto OLE
pelo nome. OLEComponent.Objeto
Ou
Clsid: a string de caracteres que referencia a classe
T1

em scripts SQL sem o auxlio de do objeto pelo ID.


linguagens de programao como {nnnnnnnn-nnnn-nnnn-nnnn-nnnnnnnnnnnn}
C ou VB, utilizando assim as fun-
Objecttoken OUTPUT: o parmetro de sada retornado pela
cionalidades desses objetos para au- procedure que identifica o objeto criado. Deve ser retornado para uma
mentar o poder dos procedimentos varivel do tipo int.
implementados. Sp_OASetProperty Atribui um novo valor Objecttoken: o objecttoken retornado pela procedure Sp_OACreate.
A tecnologia OLE (Object Linked a propriedade de um Propertyname: Nome da propriedade do objeto.
and Embedding) da Microsoft per- OLE automation. newvalue : Valor atribudo propriedade.
[ , index... ]: um ndice de parmetros para objetos que solicitem,
mite a vinculao e incorporao respeitando o tipo do dado.
de objetos de outros aplicativos. sp_OAMethod Chama o mtodo de Objecttoken: o objecttoken retornado pela procedure Sp_OACreate.
Esta tecnologia permite que o SQL um OLE automation. methodname: Nome do mtodo do objeto.
Server hospede um objeto per- [returnvalue OUTPUT ] : o retorno do mtodo chamado.
tencente a outro aplicativo dentro [[ @parametername = ] parameter [ OUTPUT ] [ ...n ] ]: Caso o mtodo
de seus scripts sem ter a neces- exija parmetros voc deve descrever cada um na seqncia.
sidade de conhecer detalhes sp_OAGetErrorInfo Recupera informaes [Objecttoken ]: o objecttoken retornado pela procedure
do aplicativo em questo. de erro de um OLE Sp_OACreate.
automation. [source OUTPUT ]: Retorna a fonte que gerou o erro.
Para isso, o SQL Server dispo-
[description OUTPUT ]: Retorna a descrio do error.
nibiliza algumas procedures de [helpfile OUTPUT ]: Retorna o arquivo de help do objeto OLE.
sistema (system procedures) que [helpid OUTPUT ]: Retorna o ID de contexto dentro do arquivo de help
do objeto OLE.
possibilitam o acesso e manipulao de
objetos OLE via transact-SQL. sp_OAGetProperty L o valor de Objecttoken: o objecttoken retornado pela procedure Sp_OACreate.
propriedades OLE Propertyname: Nome da propriedade do objeto.
A Tabela 1 contm as principais automation. [propertyvalue OUTPUT ]: Valor de retorno da propriedade
procedures com a descrio de [index...]: um ndice de parmetros para objetos que solicitem,
sua f uno e seus parmetros. respeitando o tipo do dado.

Os parmetros opcionais esto sp_OADestroy Destri um objeto OLE


Objecttoken: o objecttoken retornado pela procedure Sp_OACreate.
criado.
entre colchetes.
sp_OAStop Pra o lado server do
No existem parmetros para esta procedure.
OLE automation
Nota: Somente membros da server role
sysadmin podem executar as procedures System Procedures para manipulao de objetos OLE.
listadas na Tabela 1. Para verificar os membros do sysadmin, Criando uma procedure para envio de e-mail
e conseqentemente se o seu usurio possui esse role, execute a Usando o Microsoft Collaboration Data Objets (CDO) for
procedure da Listagem 1. Caso voc no seja membro desse role, Windows NT, scripts SQL podem enviar mensagens de e-mail
consulte o administrador do seu banco de dados para lhe garantir esse sem ter que acessar o Microsoft Exchange Server. CDO utiliza
direito ou disponibilizar um usurio para execuo dos procedimentos o protocolo SMTP (Simple Mail Transfer Protocol) do IIS dire-
aqui utilizados. tamente. O componente CDO pode ser chamado pelo Visual

44
SQL - Magazine

T2 acordo com os parmetros da procedure.


Propriedades Tipo Descrio Exemplo
From String Endereo do remetente Editor@sqlmagazine.com.br As linhas 20 a 23 verificam se o parmetro
To String Endereo do destinatrio Leitor@sqlmagazine.com.br referente ao arquivo anexo foi informado
Cc String Cpia para outro destinatrio Leitor2@sqlmagazine.com.br e atribuem o mesmo atravs da execu-
Bcc String Cpia oculta para outro destinatrio Leitor3@sqlmagazine.com.br o do mtodo AttachFile, na linha 22.
Subject String Assunto Assunto do E-mail
O e-mail enviado na linha 24, com
Body String Texto da mensagem A SQL Magazine est nota 10!
a execuo do mtodo Send e o objeto
Importance Long Importncia 0 (baixa), 1 (normal) e 2(alta)
destrudo na linha 25 pela procedure
0 - formato HTML
OADestroy. Para executar a procedure
BodyFormat Long Formato do corpo criada utilize a seguinte sintaxe, a partir
1 - formato texto comum
0 - formato HTML do Query Analizer:
MailFormat Long Formato do e-mail
1 - formato texto comum
Exec sp_Envia_Email
Atributos da Classe NewMail email@origem.com.br,
email@destino.com.br,
T3 Teste de Procedure SQL Server,
Mtodos Descrio Exemplo Estou testando o envio de e-mail pelo
banco de dados
Send Faz o envio da mensagem. Pode ser usado passando os parmetros
From, To, Subject, Body e Importance.
Caso voc no seja membro da server
objNewMail.Send ( [From] [, To] [, Subject] role sysadmin, a procedure no ser exe-
[, Body] [, Importance] ) cutada, retornando o erro apresentado
SetLocateIDs Associa o Codepage ID para a nova na Listagem 3.
850
mensagem
AttachFile Anexa arquivos no e-mail arquivo.doc
Concluso
AttachURL Anexa arquivos ou uma URL no e-mail http://localhost/arquivo.htm
claro que no vamos fazer uma
Mtodos da Classe NewMail aplicao completa utilizando somente
L1
Basic, Visual C++, Visual J++, arquivos Verificando os membros do role sysadmin.
ASP e script SQL Server. sp_helpsrvrolemember @srvrolename=sysadmin
Neste exemplo, consideramos o objeto GO
da verso Microsoft CDO for NTS 1.2 ServerRole MemberName MemberSID
Library, mas existem outras verses
----------------------------------- ------------------------------ ------------------
de objetos com eventuais alteraes nos sysadmin BUILTIN\Administradores 0x01020000000000052000000020020000
cdigos, tais como: Microsoft CDO 1.21 sysadmin SERVER_BD\Administrador 02AD0375C625CBC06DBEB0C50F4010000
sysadmin GRUPO_DB\Administrator 0x010500000000000515000000CF0
Library, Microsoft CDO for Windows sysadmin distributor_admin 0x341ACF2112019E47A
sysadmin sa 0x01
2000 Librarye Microsoft CDO for (5 row(s) affected)
Exchange 2000 Library.
Veja um exemplo do uso de OLE
automation acessando a classe NewMail L2
Implementao da procedure
do objeto CDO do Windows NT Server
(CDONTS). Essa classe permite o envio 01 CREATE PROCEDURE sp_Envia_Email
02 @remetente varchar(1000),
de e-mail utilizando o protocolo SMTP. A 03 @destinatario varchar(1000),
04 @assunto varchar(1000),
Tabela 2 lista as propriedades dessa classe 05 @corpodoemail varchar(1000),
e a Tabela 3 lista os mtodos. 06 @anexo text = NULL,
07 @formato tinyint = 1
A Listagem 2 traz a implementao da 08 AS
stored procedure que cria, inicializa os pa- 09 DECLARE @object int
10 DECLARE @varobj int
rmetros e executa a classe NewMail. Esse 11 EXEC @varobj = sp_OACreate CDONTS.NewMail, @object OUT
12 EXEC @varobj = sp_OASetProperty @object, From, @remetente
procedimento pode ser executado a partir 13 EXEC @varobj = sp_OASetProperty @object, To, @destinatario
de uma trigger, outra stored procedure ou 14 EXEC @varobj = sp_OASetProperty @object, Subject, @assunto
15 EXEC @varobj = sp_OASetProperty @object, Body, @corpodoemail
ainda a partir de uma aplicao cliente, 16 IF @formato = 0 BEGIN
desde que o usurio conectado possua os 17 EXEC @varobj = sp_OASetProperty @object, BodyFormat, 0
18 EXEC @varobj = sp_OASetProperty @object, MailFormat, 0
direitos citados anteriormente. 19 END
20 IF @anexo IS NOT NULL
Observando a Listagem 2 temos a 21 BEGIN
declarao das variveis nas linhas 9 e 10. 22 EXEC @varobj = sp_OAMethod @object, AttachFile, NULL, @anexo
23 END
A criao do objeto atravs da procedure 24 EXEC @varobj = sp_OAMethod @object, Send, NULL
OACreate na linha 11. As linhas de 12 a 19 25 EXEC @varobj = sp_OADestroy @object
26 GO
inicializam as propriedades do objeto de

45
H ow TO: Usando objetos OLE via SQL Server

S
scripts SQL, ou acessar centenas de ob- (Distributed Management Objects) que
jeto OLE dentro de um script, mas essa encapsula os objetos do SQL Server 2000. Faa o download e
possibilidade faz com que scripts SQL Assim, praticamente qualquer atividade comente essa matria em:
tenham poderes de acesso a objetos da feita dentro do Enterprise Manager pode www.sqlmagazine.com.br/sql11
mesma forma que um cdigo ASP, por ser realizada dentro de um script SQL
exemplo. Outro grande trunfo que temos instanciando o objeto SQLServer da A
a possibilidade de acessar a prpria DMO Microsoft SQLDMO Object Library.
Anderson Pontes Pinto
L3 (andersonppinto@uol.com.br)
formado em Anlise de sistemas pela
Server: Msg 229, Level 14, State 5, Procedure sp_OACreate, Line 11
EXECUTE permission denied on object sp_OACreate, database master, owner dbo. Universidade So Francisco de So
Server: Msg 229, Level 14, State 5, Procedure sp_OASetProperty, Line 12
EXECUTE permission denied on object sp_OASetProperty, database master, owner dbo. Paulo, tem experincia de 11 anos na
Server: Msg 229, Level 14, State 5, Procedure sp_OASetProperty, Line 13 administrao de banco de dados. Atua
EXECUTE permission denied on object sp_OASetProperty, database master, owner dbo.
Server: Msg 229, Level 14, State 5, Procedure sp_OASetProperty, Line 14 como Palestrante de eventos como
EXECUTE permission denied on object sp_OASetProperty, database master, owner dbo.
Server: Msg 229, Level 14, State 5, Procedure sp_OASetProperty, Line 15 Frum Access, Fenasoft, Comdex e
EXECUTE permission denied on object sp_OASetProperty, database master, owner dbo.
Server: Msg 229, Level 14, State 5, Procedure sp_OAMethod, Line 24 ministra treinamentos de SQL Server
EXECUTE permission denied on object sp_OAMethod, database master, owner dbo. dentro das empresas. DBA da Pontes
Server: Msg 229, Level 14, State 5, Procedure sp_OADestroy, Line 25
EXECUTE permission denied on object sp_OADestroy, database master, owner dbo. & Associados.

46
SQL - Magazine

47
E Divro ntrevista
mitry Yemanov
1) Qual a sua ocupao oficial da engine do banco e das rotinas de
no momento? DSQL). Tambm sou o gerente de
Dmitry Yemanov tem Eu trabalho em uma empresa de lanamento das verses em desenvolvi-
consultoria onde lidero o departamento mento (1.5 e 2.0), mantenedor da verso
26 anos de idade, de R&D. Ns desenvolvemos solues para Win32, e um dos administradores
do projeto.
nasceu em Riga HR/CRM/ERP para nossos clientes. Te-
mos 2 nveis de produtos os destinados a
(Latvia) e atualmen- grandes corporaes que utilizam Oracle 4) Qual parcela do seu tempo
(que so bem mais caros), e os destinados voc dedica ao desenvolvimento
te mora em Penza empresas menores baseados no Firebird do Firebird ?
Na mdia de 20 a 30 horas por semana.
(Rssia). gradu- (e obviamente mais baratos). O software
Depende basicamente das tarefas em
cliente desenvolvido em Delphi.
ado em Cincia da que eu estou trabalhando em determi-
2) Como se deu o seu nado momento. Gostaria de dedicar
Computao/Enge- envolvimento com o projeto mais tempo ao projeto (especialmente
Firebird ? no desenvolvimento da verso 2.0), mas
nharia de Sistemas. infelizmente meu emprego oficial toma
Nossa empresa precisava de um RDBMS
Trabalha na ELSI gratuito para um novo software que es- muito do meu tempo.
tvamos desenvolvendo. Comeamos
Consulting onde a utilizar o InterBase 6.0 assim que a 5) Quais foram as maiores
dificuldades para se familiarizar
chea o departa- Borland liberou seu cdigo sob a licena
com o cdigo do InterBase 6.0
IPL, e mudamos para o Firebird (FB)
mento de R&D, assim que ele surgiu. aps sua abertura pela Borland ?
Depois disso, comecei a pesquisar o A base de cdigo bastante complexa.
desenvolvendo cdigo fonte do FB e acompanhar a lista difcil de aprend-la, desenvolve-la e
mant-la. por isso que hoje ns estamos
softwares em de desenvolvedores (fb-devel). Foi muito
fazendo uma grande limpeza e re-estrutu-
interessante para mim, especialmente
Delphi com Oracle porque eu nunca tinha me envolvido em rao do cdigo. No existe praticamente
um projeto Open Source antes. Alguns nenhuma documentao sobre o cdigo
e Firebird. desen- meses depois j estava apto para trabalhar fonte disponvel.
volvedor ativo do em algumas partes do cdigo. Algum
6) Quais foram os principais
tempo depois eu submeti minhas primei-
cdigo do Firebird ras correes para o time de desenvolve- recursos que voc adicionou
dores do Firebird e logo depois ganhei ao Firebird (incluindo os que
e mantenedor das direito de upload na rvore CVS. ainda no foram publicados
oficialmente)?
verses 1.5 e 2.0 Ordenao em memria, triggers
3) Qual o seu papel atual no
projeto? universais, novas variveis contextu-
Desenvolvedor central (basicamente ais (connection_id, transaction_id,

48
SQL - Magazine

row_count, etc), ndices nicos que isso acontece? O Firebird ficazes e por alguns algoritmos usados
aceitam NULLs, comando LEAVE popular na Rssia? nos sub-sistemas. Atualmente, com todo
para gerenciamento de loops, algumas Todos os softwares da Borland tinham o poder de processamento e memria
melhorias no parser e toneladas de cor- algum tipo de suporte do governo para que temos disponveis, alguns algorit-
rees de bugs, que eu considero ser serem usados nas escolas e universidades. mos antigos acabaram se tornando um
o trabalho mais importante. O release Como resultado, quase todos os progra- grande gargalo de performance. Isso se
notes traz um lista completa de tudo madores na Rssia tiveram contato com torna um fator crucial quando o gargalo
que eu j fiz. o Turbo Pascal e Turbo C/C++. Quando est relacionado a uma parte vital da en-
Para a verso 2.0 adicionei algumas o Delphi/Cbuilder foram lanados eles se gine, como por exemplo a coleta de lixo
novas funcionalidades: cursores expl- tornaram as ferramentas mais utilizadas (garbage collection).
citos em PSQL, expresses na funo no pas para o desenvolvimento Win32.
SUBSTRING e algumas outras funcio- Como o InterBase acompanhava os pro- Nota 1: Jim Starkey foi contratado pela
nalidades que ainda esto em desenvol- dutos da Borland, acabou se tornando IBPhoenix para desenvolver uma verso do
vimento como por exemplo eventos bastante popular. O Firebird no poderia Firebird compatvel com SMP, totalmente
parametrizados (no qual eu comecei a ser ignorado nessa questo, j que ele multithread e compatvel com os novos pro-
trabalhar em 2001) e o novo protocolo tem basicamente os mesmos recursos cessadores de 64bits. Para isso, ele derivou
local (chamado de XNET). (na verdade mais recursos do que o IB), o cdigo do Firebird 2.0 e criou o Firebird
mais bugs corrigidos e, claro, porque Vulcan, tambm Open Source, que j est em
7) Como feita a sincronizao ele grtis. fase de testes e ter muitas das suas novidades
e a comunicao entre os Ns russos sempre gostamos de fuar incorporadas ao Firebird tradicional.
desenvolvedores do FB no que nos cdigos internos dos softwares e
diz respeito atribuio de resolver os problemas por conta prpria, 10) Voc acredita que o Firebird
tarefas, resoluo de conflitos sem precisar do suporte do fabricante. j tenha fora suficiente para
de cdigo, uploads, etc? Se precisarmos de algum recurso ento confrontar os bancos de dados
Todos so bem vindos para participar melhor termos acesso ao cdigo e desen- comerciais, como o Oracle ou o
do projeto e fazer o que puderem e tive- volve-lo ns mesmos, ao invs de esperar MSSQL? E sobre o PostgreSQL?
rem interesse em fazer. Temos muitos a Borland (ou qualquer outro fabricante) Sobre os grandes bancos comerciais, eu
usurios que nos mandam suas necessi- entender as nossas necessidades e agen- tendo a dizer no. Ns podemos com-
dades e pedidos de novas funcionalidades dar suas implementaes. Portanto, petir em algumas reas, mas isso pode ser
que, por sua vez, ficam registradas no eu no estou surpreso ao ver vrios considerado sorte nossa, ou ento algum
nosso tracker no SourceForge para futuro russos no projeto. problema deles. Ainda h muito a ser feito
desenvolvimento. Acredito sermos bas- para confrontar por exemplo o Oracle.
tante democrticos e podemos balancear 9) Se voc fosse re-escrever
entre os interesses dos prprios desenvol- todo o cdigo do banco, o que
vedores, patrocinadores e usurios. As voc mudaria ?
questes sobre o desenvolvimento so Algumas partes da base de cdigo
discutidas na lista fb-devel e em e-mails j foram re-escritas e esse processo
privados. A comunicao feita atravs continuar. Eu no posso apontar al-
de fruns, e-mails e ICQ. Os uploads gum sub-sistema que ser refeito do
so feitos pelos encarregados das ver- incio, pois muito cdigo tem que
ses e mantenedores de plataformas, ser analisado e provavelmente rede-
que so designados especificamente senhado ou reimplementado. Jim
para essa funo. [Starkey] (criador do InterBase)
Os raros conflitos de cdigo so resol- comeou uma re-estruturao
vidos automaticamente pelas ferramentas agressiva no cdigo do FB 2.0 para
de CVS ou, quando isso no possvel, o seu projeto Vulcan.
manualmente. O tamanho do cdigo Existem vrias idias boas para
sempre um fator complicador na hora a engine do banco e tudo que pre-
de compatibilizar o desenvolvimento cisamos fazer prover uma boa
de todos. implementao para elas. Os
problemas mais crticos, na
8) Existem muitos minha humilde opinio
desenvolvedores russos so causados por
trabalhando no cdigo do estruturas de
Firebird. Porque voc acha que dados ine-

49
E ntrevista - Dmitry Yemanov

Hoje podemos brigar sem problemas Uma lista mais completa ser publicada Rssia) e era um recurso que seria imple-
com o PostgreSQL e tenho certeza que em breve no site oficial. mentado no Yaffil (ver Nota 2). A idia era
temos fora suficiente para derrot-lo. discutida nos newsgroups russos continu-
13) Como o Firebird um amente. Quando os desenvolvedores do
11) Ainda sobre o assunto banco de dados de cdigo Yaffil a implementaram, eu segui mais ou
Firebird x PostgreSQL, voc aberto, outros bancos de dados menos os mesmos passos e implementei
poderia listar alguns prs e (comerciais ou no) baseados algo similar. O servidor embedded do
contras de cada um? no IB 6.0 (como o prprio IB Yaffil era baseado na verso ClassicServer
O PostgreSQL implementou as mes- 7.x) podem pois essa verso tornava
mas coisas que j existem no InterBase h incorporar mais fcil sua implementa-
muito tempo. O MVCC do PostgreSQL cdigos do Se voc contar projetos o (a verso Classic para
praticamente um clone do mecanismo Firebird em seus co-merciais complexos Linux sempre teve uma
de versioning do InterBase. Se eu no projetos e se desenvolvidos com IB/FB x embedded engine como
estiver enganado, eles no tinham um beneficiar com PostgreSQL, eu acredito que o parte da distribuio, pois
mecanismo online de garbage collection isso. Como voc IB/FB saia na frente. no era possvel conect-
at as verses mais recentes. Na minha se sente a esse lo de outro modo), mas
opinio, as extenses objeto-relacionais e respeito? algum tempo depois eles
tipos de dados geomtricos so mais um Quanto mais ns alterarmos o cdigo, concordaram com a minha soluo e
exotismo do que uma necessidade real. mais difcil ser de algum outro fabricante implementaram o Yaffil embedded base-
H tambm o problema de no haver incorporar nosso cdigo e nossas idias ado na verso SuperServer (a verso do
uma verso nativa para Windows! em seus produtos. Mas isso pode real- FB embedded sempre teve a arquitetura
Eu no estou querendo dizer que o mente acontecer. Eu no gosto da idia, SuperServer, desde o incio).
PostgreSQL ruim. Eles tm alguns mas tenho que conviver com ela. Nota 2: O Yaff il um SGDB derivado
recursos interessantes que ns ainda no do cdigo do Firebird e que era desenvolvido
temos (ex: procura textual, ndices com na Rssia e distribudo atravs de uma licena
14) O servidor embedded comercial. H alguns meses foi anunciada a
expresses e histogramas de estatsticas
implementado por voc juno do cdigo do Yaffil no Firebird 2.0,
de dados). Se voc contar projetos co-
uma tima novidade. Foi difcil aproveitando todas as implementaes feitas
merciais complexos desenvolvidos com no Yaffil e que ainda no estavam disponveis
implement-lo? Como surgiu a
IB/FB x PostgreSQL, eu acredito que o no Firebird.
idia de cri-lo?
IB/FB saia na frente. Talvez o resultado da
Na verdade foi muito fcil. A arqui-
pesquisa recente do site LinuxQuestions.
tetura OSRI (Open Systems Relational 15) O que voc espera para o
org mostre exatamente isso. (www.
Interface) do servidor declara cada sub- futuro do Firebird ?
linuxquestions.org/questions/showthread.
sistema de maneira que tenha a mesma Muito sucesso, claro! Eu considero
php?s=&threadid=116360)
interface pblica. Isso significa que a o Firebird o nico banco de dados Open
engine do banco implementa a mesma Source com recursos completos, estabili-
12) Voc poderia nos dizer API, que estava escondida dentro dos bi- dade e rapidez para competir com alguns
quais so alguns dos recursos nrios e era chamada apenas pelo servidor servidores comerciais em reas genricas
planejados para o FB 1.6 e 2.0 ? remoto como parte do processo de comu- de negcios. H questes srias que pre-
Os maiores objetivos so: nicao cliente-servidor. O que eu fiz foi cisam ser resolvidas no desenvolvimento
Nova ODS (On Disk Structure), com remover o sub-sistema remoto e tornar futuro, mas estamos cada vez mais pr-
muitas melhorias na linguagem; os pontos de entrada da engine pblicos, ximos disso.
Suporte a SMP na verso SuperSer- dando origem assim ao ser vidor
ver do servidor; embedded. Na verdade a coisa um pouco 16) Voc tem algo a dizer para
Monitoramento de conexes e mais complicada j que o servidor os usurios do FB no Brasil?
queries no servidor; embedded tambm um gateway para Continuem usando e dando suporte
Otimizador mais inteligente e novos os servidores remotos, mas j d pra ter ao FB. Mantenham sua excelente comu-
caminhos de acesso a dados; uma idia. nidade forte e bem informada. Eu espero
Acesso a ndices mais rpidos e me- Essa idia foi inicialmente mencionada no futuro ver desenvolvedores brasileiros
lhorias de performance. no livro InterBase World (publicado na fazendo parte do projeto!

50
SQL - Magazine

51
E ntrevista - Dmitry Yemanov

52