Академический Документы
Профессиональный Документы
Культура Документы
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
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
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
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
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
9
P roler Parte I Criando uma trace para anlise de performance de um servidor SQL Server
10
SQL - Magazine
11
E
A
voluo
das consultas hierrquicas
do Oracle 9i ao 10g.
Thiago Avelar
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);
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;
13
E voluo das consultas hierrquicas do Oracle 9i ao 10g.
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
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.
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
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
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
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
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
34
SQL Magazine
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
36
SQL Magazine
37
N ovidades do Firebird 1.5
38
SQL Magazine
39
U
H
m tradutor
de Triggers
Geraldo Zimbro
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 %%
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 ;.
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.
;
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
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
44
SQL - Magazine
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