Vous êtes sur la page 1sur 23

Índice Usando ODBC com MySQL

Saindo do Forno... Indexação Textual com o PostgreSQL


Entrevista com Nickolay Samofatov Calendário de eventos
Entendendo o gStat - parte 1

Editorial
Informações
DB FreeMagazine nº 001
Abril/2005
É com grande satisfação que escrevo o editorial Contato geral:
da primeira edição da DB FreeMagazine. webmaster@dbfreemagazine.com.br
A DB FreeMagazine é sua mais nova fonte de in- Equipe editorial
formações sobre Banco de Dados; uma publicação Carlos H. Cantu
eletrônica que trata com carinho especial os Ban- (cantu@dbfreemagazine.com.br)
cos de Dados Open Source.
Luiz Paulo de Oliveira Santos
A “revista” já nasceu diferente, tanto no seu for- (lpaulo@dbfreemagazine.com.br)
mato (eletrônico) quanto no seu preço (gratuita). Contribuíram nessa edição
Nessa primeira edição temos artigos sobre os 3
Nickolay Samofatov
Bancos de Dados Open Source mais importantes Diogo Biazus
da atualidade: Firebird, PostgreSQL e MySQL. Luiz Paulo de Oliveira Santos
Também fizemos uma entrevista com Nickolay Carlos H. Cantu
Samofatov, um dos principais desenvolvedores do
É proíbida a reprodução de qualquer parte
Firebird.
do conteúdo dessa publicação sem autori-
Espero que vocês gostem do que vão encontrar zação prévia por escrito.
por aqui. Contamos com sua ajuda para tornar essa
iniciativa um sucesso, ajudando desde já, divulgan-
do o site da revista na comunidade, para os seus
amigos, conhecidos, etc.
Caso você tenha interesse em publicar artigos na
DB FreeMagazine, entre em contato conosco via
email.
Dica para melhor visualização:
Boa leitura, e bom divertimento!
ANUNCIE NA Utilize a resolução 1024x768 pixels e
Carlos H. Cantu DB FreeMagazine configure o Acrobat Reader para Zoom de
Editor DB FreeMagazine 100%. Feche todas as abas laterais e es-
Valorize seu produto ou serviço! conda as barras de ferramentas, liberando
o máximo de área útil na tela.
anuncios@dbfreemagazine.com.br
Página 2
Índice Usando ODBC com MySQL
Saindo do Forno... Indexação Textual com o PostgreSQL
Entrevista com Nickolay Samofatov Calendário de eventos
Entendendo o gStat - parte 1

Saindo do
aos seus requerimentos. O artigo faz algumas
comparações entre bancos de dados desktop Fonte:http://www.postgresql.org/docs/

Forno...
e relacionais, e cita outros fatores que devem whatsnew
ser levados em consideração na escolha.

Fonte:http://databases.about.com/b/ Evento brasileiro terá a presença do cria-


Continental Airlines migra para MySQL a/155217.htm dor do InterBase

A empresa aérea Continental Airlines mi- A segunda versão do Firebird Developers


grou recentemente seu sistema de emissão SQL Server no Linux? Day (FDD), evento promovido pela FireBase,
de tickets para o MySQL. No processo de mi- contará com a presença de Jim Starkey (cria-
gração, foi necessário certificar alguns drivers Aparentemente a Microsoft tem um projeto dor do InterBase e atual desenvolvedor do
e ferramentas para rodar em modo 32bits nos em andamento para portar o SQL Server para Firebird Vulcan) e de sua esposa, Ann Harri-
sistemas operacionais Linux 64bits da HP, en- ambiente Linux. Provavelmente ela percebeu son, presidente da IBPhoenix e conhecida no
quanto as versões nativas de 64bits não esta- que não será facil derrotar o Pinguim, como passado por “mãe do InterBase”. O FDD será
vam disponíveis. fez com outros SOs (ex: OS/2), e não perdeu realizado no dia 16 de Julho, em Piracicaba
tempo de criar meios para lucrar com o SO - SP.
F o n t e : h t t p : / / w w w. c o m p u t e r w o r l d . concorrente. O prazo estimado de lançamen-
com/databasetopics/data/software/ to é para a metade de 2006. Fonte:http://www.FirebirdDevelopersDay.
story/0,10801,100797,00.html?source=x589 com.br
Fonte:http://www.sqlservercentral.com/co-
Lançado o MySQL 5.0.3 lumnists/sjones/sqlserveronlinux.asp Firebird 2.0 Alpha1

A MySQL AB lançou recentemente a ver- PS: Calma! Vejam bem no final do artigo: Primeiro
Saiu a tão aguardada versão Alpha do Fi-
são 5.0.3 do MySQL, o primeiro beta de uma de Abril :-)
rebird 2.0. Essa versão trás inúmeras novida-
grande atualização nesse BD que roda em des, como backups incrementais, execute blo-
plataformas Linux, Solaris, AIX, Windows e PostgreSQL 8.0 ck, melhoria de performance, novo protocolo
Mac OS X. A versão final está estimada para de acesso local (xnet), novo sistema de inde-
sair no final do segundo trimestre de 2005. Foi lançado a versão 8.0 do PostgreSQL. xação, etc. O release notes pode ser baixado
Essa é a primeira versão que traz o servidor em http://www.ibphoenix.com/download/Fire-
F o n t e : h t t p : / / w w w. c o m p u t e r w o r l d . rodando nativamente no Windows, além de bird_v2Alpha01.ReleaseNotes_0200_02.pdf
com/databasetopics/data/software/ muitas outras novidades, como Point-in-time
story/0,10801,100737,00.html?source=x589 recovery, Savepoints, etc. Fonte:http://www.firebirdsql.org

Escolhendo qual BD usar

O site About publicou recentemente um


artigo que visa ajudar os leitores na escolha
de qual banco de dados se adapta melhor
Página 3
Índice Usando ODBC com MySQL
Saindo do Forno... Indexação Textual com o PostgreSQL
Entrevista com Nickolay Samofatov Calendário de eventos
Entendendo o gStat - parte 1

Entrevista
mento de softwares para bancos na Rússia. versões que eram mais úteis para nós do que

Firebird
Meu trabalho era desenvolver softwares o Firebird 1.0, então movemos todo o desen-

com Nickolay
de última geração para o governo, com extre- volvimento para o Firebird 1.5, antes do seu
ma escalabilidade, variando desde estações primeiro Alpha.

Samofatov
isoladas até centros financeiros que proces- Logo após, eu percebi que era muito mais
savam centenas de documentos por dia. O fácil adicionar recursos ao Firebird do que
custo com royalties para instalação em tercei- criar soluções complexas no lado cliente, o
ros tinha que ser mínimo. Foi então que de- que dificultava ainda mais o compartilhamen-
Entrevista realizada pela FireBase, em Fe- cidi usar alguns softwares Open Source para to de código da nossa aplicação cliente, que
vereiro de 2005. implementar as funcionalidades, adotando a deveria rodar tanto com o Firebird como Ora-
seguinte estrutura: cle. Foi por isso que implementei alguns recur-
1) Fale-nos um pouco sobre você... sos como o posicionamento de nulls (NULLS
Linux FIRST/LAST), savepoints e travamento pes-
Interbase/Firebird simista. Durante o desenvolvimento da nossa
Meu nome é Nikolay Samofatov, nasci em
InterClient/Jaybird aplicação cliente, eu me encontrei trabalhan-
Moscow, Rússia, no ano de 1982. Trabalho
Java 2 SE do no código do Firebird cada vez mais, pois
como engenheiro de software desde os 14
OpenORB a solução de problemas complexos me trazia
anos, tendo estudado física e matemática na
OmniORB a sensação de desafio.
Universidade Estadual de Moscow. Sou gra-
Delphi Client
duado em Ciência da Computação pela Uni- “Quando percebemos que 3) Quais foram suas
versidade Técnica Estadual de Moscow. Eu e
minha esposa mudamos para Toronto/Cana-
Quando percebemos a Borland não tinha inte- maiores contribuições
que a Borland não tinha in-
da há um ano atrás, e agora trabalho para a
teresse em atualizar o IB
resse em atualizar o IB 6.0 para o projeto até ago-
BroadView Software. Gosto dos prazeres da ra?
vida, de “projetos impossíveis” no trabalho, e
6.0, migrar para o Firebird OpenSource, migrar para
de praticar esportes radicais quando estou de
foi um caminho natural para o Firebird foi um caminho Desde o início do meu
nós. Em algum ponto do
folga (esquiar, downhill, nadar, pescar, etc).
processo, encontramos vá- natural.” trabalho dentro do proje-
to, acabei gastando meu
rios bugs no IB/FB e no InterClient, e preci- tempo basicamente nas questões de escala-
2) Como você se envolveu com o
samos corrigí-los. Foi então que decidi dar bilidade e estabilidade. Eu gosto de trabalhar
Firebird?
uma olhada no código do InterBase 6.0/FB na solução de bugs difíceis, ou de problemas
e fiquei espantado com o que encontrei: Ao difíceis de serem reproduzidos.
Comecei a trabalhar com o InterBase (IB)
compilar, o software produzia cerca de 20.000 No Firebird 1.5, implementei os save-
em 1997, como programador Delphi. A primei-
warnings, além de ser de difícil compreensão. points, corrigi diversos gargalos de perfor-
ra versão do IB que usei foi a 3.2. O que mais
A base de código Firebird2, gerada por Mike mance e implementei o novo gerenciador de
me atraiu nele foi a facilidade de uso e o poder
Nordell, me pareceu muito mais clara, en- memória escalável. Para o Firebird 2.0, im-
do BD.
tão comecei a corrigir os problemas nela, e plementei várias classes na biblioteca de tem-
Em 2001, após o final do meu contrato com
compilar o servidor nos meus computadores plates, adaptei a engine interna para 64bits de
a Altey Company, fui trabalhar para a Bank’s
linux. Muito rapidamente, comecei a produzir forma a eliminar o limite de 30GB nas tabelas,
Soft Systems, empresa líder no desenvolvi-
Página 4
Índice Usando ODBC com MySQL
Saindo do Forno... Indexação Textual com o PostgreSQL
Entrevista com Nickolay Samofatov Calendário de eventos
Entendendo o gStat - parte 1

e fiz algumas outras alterações internas. Uma ceitos de orientação à objetos em bancos de de alguma engine externa, como a Lucene.

Firebird
relação completa pode ser consultada no re- dados relacionais. Basicamente permitir o uso Se você trabalhar com aplicações corpora-
lease notes das versões. de herança, polimorfismo, encapsulamento e tivas, poderá sentir falta de selects entre ban-
abstração nas estruturas do banco de dados. cos de dados. Se você desenvolve aplicações
4) Você está trabalhando em algum recur- Tenho algumas idéias de como implementar GIS, poderá sentir falta de tipos de dados
so específico para o FB 2.0 ou 3.0? isso sem quebrar os principios de Codd para espaciais e índices R-tree. Se você trabalha
bancos relacionais. Isso possibilitaria o mape- com data warehouses, poderá sentir falta de
Para o FB 2.0, implementei a tecnologia amento direto das lógicas de negócio orienta- operações de ROLLUP/CUBO, ou de views
de backups físicos incrementais (nbackup), das à objeto no esquema de banco de dados, materializadas, ou re-escrita de queries.
possibilitando gerenciar grandes bases de encurtando o caminho do desenho da aplica- De qualquer forma, geralmente é possí-
dados eficientemente. Também criei a API de ção até a implementação, sem comprometer vel superar a falta desses recursos usando
“trace”, que permite que plugins de terceiros o acesso relacional aos dados. soluções externas, ou mesmo outros recur-
possam coletar informações detalhadas sobre Na maioria dos casos, eu recebo pelo tra- sos do próprio Firebird. Por exemplo, tabelas
a performance de instruções SQL no servidor. balho que estou fazendo. Por exemplo, os temporárias globais podem ser facilmente
Nos últimos meses, estive recursos do NBACKUP e da simuladas usando views atualizáveis e variá-
trabalhando com Adriano “Na maioria dos casos, eu API de trace foram financia- veis contextuais CURRENT_TRANSACTION/
Fernandes no desenho do recebo pelo trabalho que dos pela Broadview. Portanto, CURRENT_CONNECTION para saber quais
novo framework de inter-
nacionalização, que fará
estou fazendo. Por exem- se alguma empresa decide
que precisa de algum recur-
registros cada conexão ou transação pode en-
xergar. É fácil escrever procedures para imitar
com que o Firebird suporte plo, os recursos do so implementado e pretende triggers a fim de manter visões agregadas dos
completamente o UNICO- NBACKUP e da API de pagar por ele, eu posso fazer dados para propósitos de warehousing, etc.
DE 4.0, e corrigirá muitas o trabalho. Até então, eu ape- E se o custo do “quebra-galho” estiver
questões nessa área. Es- trace foram financiados nas faço alguns experimentos saindo mais caro do que ter o recurso imple-
ses dois últimos recursos pela Broadview.” e pesquisas para ver se as mentado na engine do banco, você mesmo
estão disponíveis em uma idéias são plausíveis. poderá fazê-lo. Não é tão difícil.
árvore de código separada da base de código
oficial do Firebird, e ainda não está claro se 5) Na sua opinião, quais são os principais 6) Como você vê o Firebird comparado
eles serão incorporados no FB 2.0 ou 3.0. recursos que o Firebird ainda não possui, com o PostgreSQL?
Para o Firebird 3.0, tenho algumas idéias, e quão difícil seria implementá-los?
como o suporte à gerenciadores de trava ex- O PostgreSQL precisa de um DBA para
ternos (OpenDLM) e técnicas de replicação O Firebird, da maneira em que está ago- ser utilizado com eficiência. Você precisa se
de cache entre nós de um cluster, para aliviar ra, já é um banco de dados muito utilizado, preocupar com o VACUUM, journals e diver-
a pressão no subsistema de I/O, quando for portanto, alguns recursos que você pudesse sas outras coisas. Os algoritimos de garbage
possível. Seria interessante permitir ao Fire- sentir falta dependem basicamente de qual collection do Firebird, protocolo de recupera-
bird executar SQL em data links ODBC, para área específica o BD estaria sendo utilizado. ção (“careful write”) e marcação de páginas
simplificar as tarefas de integração e a migra- Se você vai desenvolver aplicações web, po- geracionais estão integradas em caminhos
ção, para os usuários do FB. derá sentir falta do recurso de busca textual normais de acesso, e não precisam ser mani-
Também tenho a idéia de inserir alguns con- completa, que pode ser compensado pelo uso puladas separadamente.
Página 5
Índice Usando ODBC com MySQL
Saindo do Forno... Indexação Textual com o PostgreSQL
Entrevista com Nickolay Samofatov Calendário de eventos
Entendendo o gStat - parte 1

Um dos pontos fortes do Firebird é a faci- feitas no Vulcan e no Firebird desde a época um bom lugar para encontrar muitos desen-

Firebird
lidade de uso. Ele tenta gerenciar o máximo da divisão entre eles. Depois disso, precisa- volvedores do Firebird e conversar com vários
possível da lógica internamente, minimizando mos revisar as alterações e combiná-las em usuários.
o número de opções de “tuning”. uma base de código feita de ambas as ver-
Por exemplo, em índices onde as “fo- sões. Provavelmente nem todas as mudanças 10) Aparentemente o projeto Firebird não
lhas” são geralmente únicas, então a es- feitas no Vulcan irão prevalecer na base de tem um mecanismo oficial de contato dire-
trutura do nó utilizada é um simples B-Tree. código gerada. to com os usuários finais, dando a impres-
Mas se o número de folhas duplicadas au- O trabalho de revisão está sendo feito por são que alguns desejos dos usuários são
menta, então o índice automaticamente Dmitry Emanov, atualmente. ignorados pelos desenvolvedores. O que
se transforma em uma forma especial de você pensa sobre isso?
bitmap, compactando amplamente o número 8) Até agora as previsões de datas para
de registros para os nós duplicados. Muitas as versões finais do Firebird parecem ser Veja bem, a maioria dos desenvolvedores
das operações com índices são executadas sempre sub-estimadas. Você acredita que do Firebird são também usuários. E qualquer
na recuperação de bitmaps, e múltiplos ín- o projeto ainda não tem experiência sufi- usuário do Firebird pode se tornar um desen-
dices podem ser utilizados para avaliar uma ciente para prever datas com mais preci- volvedor, caso assim deseje. O espírito do
expressão. Não há necessidade do usuário são? Open Source é que se alguém quer que algu-
determinar o tipo de índice ou decidir qual ín- ma coisa seja feita, ele mesmo pode fazê-la,
dice deve ser utilizado em determinada query. Você já viu algum software ser lançado ou pagar alguém para fazer o serviço. Você
Outro recurso muito útil do Firebird é que você dentro do prazo estimado pelos desenvolve- também pode criar forks, branches e distri-
pode mover os arquivos de bancos de dados dores? :-) Mas sim, o processo de gerencia- buições com qualquer recurso experimental
para onde quiser, e conectá-los quando qui- mento das releases
ser. precisa de melhorias.
O Firebird é reconhecidamente muito está- Preciamos nos atrelar
vel quando utilizado com o Windows, enquan- mais em versões ba-
to que uma versão nativa do PostgreSQL para seadas em uma pro-
Windows só está aparecendo agora. gramação de tempo
Ao mesmo tempo, o PostgreSQL é uma pré-determinada.
engine poderosa e muito flexível, com muitos
recursos para usuários corporativos e cientis- 9) Você foi um dos
tas. palestrantes nas
duas conferências
7) Sendo um desenvolvedor da engine do realizadas em Fulda
Firebird, como você vê a migração entre o - Alemanha. Qual é
Firebird e o Vulcan, no aspecto técnico? O a sua avaliação das
código do FB servirá de base para a inte- conferências?
gração com o Vulcan ou será o contrário?
Muito boas! Eu
O plano é enumerar e revisar as mudanças gostei de falar lá. É
Página 6
Índice Usando ODBC com MySQL
Saindo do Forno... Indexação Textual com o PostgreSQL
Entrevista com Nickolay Samofatov Calendário de eventos
Entendendo o gStat - parte 1

desejado. Tudo depende de você, e se o re- útil em praticamente qualquer cenário que

Firebird
curso implementado for bom e estável, pro- não envolva uma quantidade monstruosa de
vavelmente será incorporado em uma versão dados.
oficial do Firebird.
12) Algum comentário final?
11) Atualmente o Firebird tem recursos que
o colocam à frente do MySQL, mas atrás Eu vejo a comunidade Brasileira de usu-
do Oracle e do MS-SQL. Em quais cenários ários em um papel importante na criação de
você acredita que o Firebird se enquadra uma estrutura internacional de suporte e de-
perfeitamente, e em quais cenários você senvolvimento. Eu gostaria de agradecê-los
não o utilizaria? por usar o Firebird e pelo suporte.

Eu não diria que o Firebird fica atrás do Nickolay Samofatov


MS-SQL e que o MySQL tem menos recursos
que o Firebird. O MS-SQL é muito difícil de Avalie esse artigo
ser usado. Sua linguagem procedural tem fun-
cionalidade muito limitada. A tentativa da Mi- ÓTIMO BOM RUIM
crosoft de controlar a estrutura da sintaxe da
TSQL com opções externas torna quase im-
possível de se escrever código portável entre
bancos de dados. Tente escrever um trigger
para marcar um registro com um valor obtido
por um generator do database e você saberá
do que eu estou falando.
O MySQL tem vários recursos, mas seu
núcleo não é muito poderoso e possui muitos
“quirks” e “kludges”
O Oracle é provavelmente o melhor ban-
co de dados coporativo atualmente, mas ele
é caro, pesado, e as vezes oferece soluções
não muito elegantes para alguns pro-
blemas.
O Firebird se enquadra
muito bem como um banco
amigável para o desenvol-
vedor, em aplicações cor-
porativas e configuração
embarcada. Ele é muito
Página 7
Índice Usando ODBC com MySQL
Saindo do Forno... Indexação Textual com o PostgreSQL
Entrevista com Nickolay Samofatov Calendário de eventos
Entendendo o gStat - parte 1

Entendendo o -t especifica o nome da tabela a ser Generation Esse valor é incrementado

Firebird
analisada cada vez que a página de hea-

gStat – parte 1 -z exibe informações da versão do gS- der é escrita (alterada)


tat Page size O tamanho definido para as
Carlos Henrique Cantu páginas do banco de dados.
Analisaremos nesse artigo as opções re- Um BD é formado por diversas
Se você alguma vez já teve dúvidas, tais tornadas pelo parâmetro –h, ou seja, as infor- páginas, de diversos tipos. As
como: “Como saber em qual dialeto está um mações do header do BD. As outras informa- páginas têm tamanho fixo, que
banco de dados?”, “Qual o tamanho atual das ções serão analisadas em artigos futuros. é determinado no momento da
páginas do BD?”, “A escrita síncrona (forced criação do banco de dados ou
writes) está ativa?”, então é porque desco- Cabeçalho (Header) então quando ele é restaurado
nhece a existência do gStat! de um backup (através do pa-
O gStat é um utilitário de linha de coman- A figura abaixo mostra o resultado do râmetro –p do gbak)
do que é instalado junto com o Firebird (na comando gstat –h no BD employee.fdb, que ODS Mostra a versão da estrutura
instalação completa) dentro da pasta bin, e acompanha o Firebird 1.5. version do arquivo do Banco de Dados.
que retorna diversas informações sobre um Geralmente a adição de novos
determinado banco de dados. As informações recursos ao servidor exige al-
retornadas dependem dos parâmetros passa- guma alteração na estrutura
dos para o utilitário, que podem ser: física do arquivo de banco de
dados utilizado por ele. A ODS
-a faz a análise dos dados e das pági- (On Disk Structure) informa ao
nas de índice servidor qual é a versão da es-
-d analisa as páginas de dados trutura de um determinado ar-
quivo de banco de dados.
-h analisa a página de cabeçalho do
A restauração de um backup
BD (header page)
feito em um servidor de versão
-I analisa as “folhas” das páginas de mais antiga em um servidor
índices mais recente, automaticamente
-l analisa a página de log Vejamos o que significa cada informação recria o arquivo de BD usando
retornada: a versão mais recente da ODS
-s analisa os relacionamentos das ta-
belas de sistema daquele servidor.
Campo Descrição
-u nome do usuário para conectar no
BD Checksum Esse campo é uma herança
do InterBase. No Firebird, ele
-p senha para conexão sempre retornará 12345.
-r analisa o tamanho médio dos regis-
tros e versões

Página 8
Índice Usando ODBC com MySQL
Saindo do Forno... Indexação Textual com o PostgreSQL
Entrevista com Nickolay Samofatov Calendário de eventos
Entendendo o gStat - parte 1

Oldest Informa qual o número da OIT Implemen- Determina a arquitetura do sis- Shadow Exibe o número de arquivos de

Firebird
Transaction (Oldest Interesting Transac- tation ID tema onde o BD foi criado. Al- count shadow desse banco de dados.
tion), significando a transação guns valores: Arquivos de shadow podem ser
mais antiga que não esteja com • 1 HP Apollo Domain OS criados e refletem a imagem
o status de commit, ou seja, • 2 Sun Solaris SPARC, exata do arquivo principal do
com o status de ativa, limbo ou HP9000 s300, Xenix, Motorola banco de dados. Geralmente
rolled-back. IMP UNIX, UnixWare, NCR são criados em outro HD, para
Oldest ID da transação mais antiga UNIX, NeXT, Data General DG- que no caso de uma falha do
Active que ainda está ativa no BD UX Intel HD principal, o shadow possa
• 3 Sun Solaris x86 assumir o lugar do BD princi-
Oldest ID da transação mais antiga • 4 VMS pal, evitando que o servidor fi-
Snapshot que ainda estava ativa quando • 5 VAX Ultrix que indisponível.
a transação identificada pela • 6 MIPS Ultrix
Oldest Active foi iniciada. Page Tamanho do buffer de cache,
• 7 HP9000 s700/s800 buffers em número de páginas. S esti-
Next Mostra o ID da próxima tran- • 8 Novell NetWare ver zero, indica que o valor uti-
Transaction sação a ser criada. Vale uma • 9 Apple Macintosh 680x0 lizado é o padrão, definido no
observação importante: A di- • 10 IBM AIX POWER series, arquivo firebird.conf pelo parâ-
ferença entre o valor de Next IBM AIX PowerPC metro DefaultDBCachePages.
Transaction com o valor de • 11 Data General DG-UX 88K
Next header Caso o BD possua mais de
Oldest Transaction determina • 12 HP MPE/xl
page uma página de header, esse
o momento em que um sweep • 13 SGI IRIX
automático será iniciado. Veja • 14 Cray valor indica o número da pági-
mais informações sobre isso • 15 SF/1 na de header posterior.
na nota “sweep automático” no • 16 Microsoft 32-bit Windows Database Exibe qual é o dialeto atual do
finald o artigo. • 17 IBM OS/2 dialect Banco de Dados. O Firebird
Bumped Não é mais utilizado. • 18 Microsoft Windows 16-bit suporta os dialetos 1,2 e 3,
Transaction • 19 Linux Intel sendo que o 1 é para manter
• 20 Linux SPARC a compatibilidade com bancos
Sequence O número seqüencial da pági-
Number de dados criados no InterBase
na de header, começando por
5.x e anteriores; o 2 é utilizado
zero (primeira página).
apenas para detectar inconsis-
Next ID da próxima conexão com o tências durante a passagem de
attachment banco de dados. O ID de uma um BD do dialeto 1 para 3; e o
ID conexão com o banco pode ser 3 é o dialeto mais rico e mais
obtido internamente (em pro- recente, tendo seu uso reco-
cedures, selects, triggers, etc) mendado.
através da variável current_
connection.

Página 9
Índice Usando ODBC com MySQL
Saindo do Forno... Indexação Textual com o PostgreSQL
Entrevista com Nickolay Samofatov Calendário de eventos
Entendendo o gStat - parte 1

Creation Data e hora da criação do BD. Ambas as situações descritas acima po-

Firebird
date Se a diferença entre Oldest active e Next dem fazer com que a performance do BD caia
transaction for muito grande, pode indicar que bastante em um ambiente de muita concor-
Attributes Exibe alguns atributos do BD:
as transações estão ficando abertas por mui- rência.
•force write: indica que o BD
to tempo, o que sugere uma falha no contro-
está configurado para o modo
le transacional da aplicação cliente que faz Conclusão
síncrono de escrita de dados,
acesso ao BD.
ou seja, o Firebird não irá man-
Se a diferença entre Next Transaction e Ol- Vimos nesse artigo como recuperar infor-
ter os dados gravados no buffer
dest Transaction for maior que 20.000, pode mações sobre um BD, determinando assim
de memória, enviando-os dire-
indicar que o sweep automático está desliga- suas características gerais como dialeto, ta-
tamente para o disco.
do, ou configurado com um valor demasia- manho da página, etc.
•no_reserve: indica que ne-
damente alto. No primeiro caso, você deverá Aprendemos também que o gstat pode nos
nhum espaço está sendo re-
realizar periodicamente um sweep manual no ajudar a detectar problemas de concorrência
servado para os registros de
BD através do utilitário gfix. Para o segundo no BD, o que geralmente leva a perda de per-
versão (ver nota “reservando
caso, pode-se usar o gfix para configurar um formance no servidor.
espaço”).
novo valor para o sweep automático. Em um próximo artigo, estaremos anali-
•Shutdown: Indica que o BD
está em modo shutdown, im-
possibilitando conexões de
usuários que não sejam o SYS-
DBA.

Detectando possíveis problemas

Um dos usos mais importantes do gStat é


para detectar possíveis problemas no geren-
ciamento transacional, que podem fazer com
que o BD fique lento em determinadas situa-
ções de grande concorrência, etc.
Para saber se as aplicações
clientes estão trabalhando adequadamente
com o controle transacional, devemos monito-
rar, com o BD em uso, os valores:

Oldest transaction
Oldest active
Next transaction

Página 10
Índice Usando ODBC com MySQL
Saindo do Forno... Indexação Textual com o PostgreSQL
Entrevista com Nickolay Samofatov Calendário de eventos
Entendendo o gStat - parte 1

sando as outras opções do gstat.


Reservando espaço Sweep automático

Firebird
Um abraço, e até mais!
O Firebird trabalha com o sistema de O sweep é um processo de limpeza do
concorrência chamado Versioning, ou MGA banco de dados. Através dele, o Firebird
(Multi Gerational Architecture). Esse modo libera espaços que não serão mais utilizados
Avalie esse artigo
faz uso de versões temporárias de registros, para que possam ser reaproveitados no
ÓTIMO BOM RUIM permitindo que uma transação enxergue servidor. Diferente do processo automático
os valores de um registro como eles eram de Garbage Collection, o sweep processa
em um determinado momento no tempo. também os registros que foram descartados
Para agilizar o controle de concorrência, o devido a um rollback de uma transação. O
Autor: Firebird “reserva” automaticamente 20% valor padrão para iniciar o sweep automático
Carlos Henrique Cantu
do espaço de uma página de dados para é 20.000, ou seja, quando a diferença entre
trabalhar com essas versões de registro. o ID da próxima transação e a OIT for
Mini-curriculo
No entanto, há situações onde o BD será igual a 20.000, o sweep será disparado.
Bacharel em Ciência da Computação, micrei- somente para leitura (catálogos em CD, Obviamente, após o término do sweep, o
ro desde os tempos de Apple II, trabalha com por exemplo) o que torna um desperdício número da OIT será avançado.
desenvolvimento de sistemas há 15 anos. É
a reserva desse espaço. Podemos indicar
consultor especializado em bancos de dados
Firebird e InterBase 6.0. Mantenedor do site Fire-
durante a restauração de um backup, através
Base (www.firebase.com.br) e autor do livro Fire- do parâmetro -USE_(ALL_SPACE) do gbak,
bird Essencial e presidente do DUG-BR (Delphi que não desejamos reservar espaço para
Users Group Brasil), tendo ministrado palestras os registros temporários, fazendo com que
sobre Firebird para milhares de pessoas em di- o tamanho do BD fique reduzido.
versas cidade do Brasil.

Página 11
Índice Usando ODBC com MySQL
Saindo do Forno... Indexação Textual com o PostgreSQL
Entrevista com Nickolay Samofatov Calendário de eventos
Entendendo o gStat - parte 1

Acessando
aplicações sob a licença GPL. No site do pró- o MyODBC-3.51.11-1-win.exe. Periodicamen-
prio MySQL podemos encontrar um driver te, novos downloads são disponibilizados, e o

MySQL via ODBC


ODBC para vários sistemas operacionais (vi- arquivo pode ter seu nome alterado de acordo
site o site: http://dev.mysql.com/downloads/), com essas novas versões.
sendo que nesse exemplo estaremos utilizan- Quando iniciarmos a instalação do driver
Luiz Paulo de Oliveira Santos do o Windows como cliente. de ODBC, executando o arquivo baixado, te-
Acessando o site, clique na opção descri- remos a seguinte tela:

MySQL
Com a utilização em massa dos bancos ta como “Connector/ODBC 3.51 -- Generally
de dados, nasceu também a necessidade de Available (GA) release“ e em seguida clique
acesso as informações armazenadas nessas em “Windows Downloads”.
bases. Nas empresas, é comum a necessida- Para instalação em ambiente Windows,
de de gerar arquivos texto para intercambio duas opções de instalação estão disponíveis:
de informações entre aplicações, geração de
malas diretas, emissão de etiquetas, etc. 1) Através de binary (.EXE) e instalação
Praticamente todos os setores das em- manual;
presas necessitam de informações que estão 2) Através de distribuição via MicroSoft Instal-
armazenadas em bancos de dados centraliza- ler (MSI);
dos, sendo função do Departamento de Tec- Escolha a opção para fazer a instalação
nologia em Informática (ou equivalente) forne- via .EXE. Clique na opção Pick a mirror.
cer esses dados, ou o acesso aos mesmos.
A geração de arquivos texto para expor- Teremos a seguinte tela:
tação dos dados é geralmente uma atividade
muito custosa e desgastante para o desenvol- Clique em Next, e você verá a tela de licen-
vedor. Há também o fato de que as informa- ça. Nela, os desenvolvedores do driver ODBC
ções geradas nos arquivos geralmente ficam para MySQL citam que o uso desse driver se-
desatualizadas em questão de horas após a gue as determinações GNU de licenciamen-
geração do arquivo. to. Se quiser maiores informações à respeito,
A necessidade de ter acesso padronizado, visite o link www.gnu.org/philosophy. Em re-
fácil e rápido às informações em bases de sumo, o software é free (gratuito), desde que
dados provocou o surgimento de um padrão mudanças não sejam feitas nele.
de drivers, comumente chamados de ODBC Após selecionar o ítem “I accept the license
(Opened DataBase Conectivity). agreement”, clique no botão Next. A tela apre-
Geralmente os principais bancos de dados sentada agora resume o que a instalação faz,
disponibilizam gratuitamente se os drivers e alerta para que antigas versões de drivers
Se você é usuário de banda larga, opte ODBC para MySQL sejam removidos antes
ODBC. Nesse artigo, estaremos citando um
pelo protocolo HTTP, pois desta forma o de instalar essa nova versão.
passo-a-passo de como instalar e configurar
download será mais veloz. Salve o arquivo no Clique novamente em Next. Após clicar no
um driver ODBC para acessar uma base de
HD, para ser instalado depois. próximo botão Next, a instalação continuará
dados MySQL.
Obs: O arquivo que efetuamos download é de forma ininterrupta até o fim. Portanto, aten-
O MySQL é gratuito quando utilizado em
Página 12
Índice Usando ODBC com MySQL
Saindo do Forno... Indexação Textual com o PostgreSQL
Entrevista com Nickolay Samofatov Calendário de eventos
Entendendo o gStat - parte 1

ção nesse passo. até mesmo bases Oracle. Por exemplo, pode-
Se tudo correu bem, a tela final de instala- mos criar uma aplicação (em Delphi, VB ou
ção será exibida: outra linguagem qualquer que utilize ODBC)
que abra uma tabela que está em uma base
MySQL, ligando-a dinamicamente com da-
dos que estão em um Arquivo Texto e salve
o resultado em uma tabela ORACLE. Sendo

MySQL
o acesso a todas as bases citadas através
do ODBC. Essa facilidade de intercâmbio de
informações entre diferentes bancos e bases
de dados torna o acesso via ODBC bastante
atraente.
Clicando no botão Concluir, veremos a se-
guinte tela:

Para criarmos esse objeto, basta clicar em


Adicionar e teremos a seguinte tela:

Pronto! A instalação está concluída. A par-


tir de agora, iremos efetuar as configurações
do objeto de dados para disponibilizarmos o
acesso aos aplicativos.
É necessário criar um objeto Fonte de Da-
dos. Isso é feito no Fonte de dados ODBC,
que se encontra dentro do ítem “Ferramentas
administrativas” no Painel de Controle do MS-
Windows XP, indicado pelo ícone abaixo:

Nessa tela podemos verificar todos os dri-


vers de ODBC disponíveis em seu computa- Preencha os campos da aba LOGIN da se-
dor. Usaremos a opção MySQL ODBC 3.51 guinte maneira:
Ao acessar o ícone, a seguinte tela será
Driver, que é o driver ODBC para o MySQL
apresentada: DATA SOURCE NAME: Nome do ob-
que instalamos.
Obs: Através do ODBC é possível criar- jeto de dados. Esse é o nome pelo qual os
mos objetos de dados para acessar Arquivos aplicativos irão enxergar o banco de da-
Texto, bases DBF (X-Base), bases MySQL e dos. No Delphi, esse nome aparecerá em
DATABASENAME nos objetos de acesso de
Página 13
Índice Usando ODBC com MySQL
Saindo do Forno... Indexação Textual com o PostgreSQL
Entrevista com Nickolay Samofatov Calendário de eventos
Entendendo o gStat - parte 1

dados, como o TTable por exemplo. configurações informadas devem ser revistas. manutenção, buscas/relatórios e acesso da
DESCRIPTION: É uma descrição do ob- Após isso, basta clicar no botão OK e o objeto base de dados. Provavelmente o usuário já
jeto. Geralmente alguns aplicativos exibem aparecerá na janela do Administrador de Fon- está acostumado com outra ferramenta para
essa descrição além do DATA SOURCE te Dados. acesso e navegação em bases de dados ge-
NAME, para que possamos escolher o banco Uma vez configurado, podemos usar essa néricas. Muitos dos usuários são familiariza-
correto. fonte de dados em diversos aplicativos Win- dos com o MS-Access ou outros sistemas ge-
SERVER: O número IP ou o nome do dows, em nosso exemplo a fonte de dados renciadores, e por isso são muito produtivos

MySQL
equipamento (nome registrado em DNS) que FreeDB do tipo ODBC, bastando escolher de- com esses aplicativos. Logo, o ODBC serve
está executando o MySQL Server. Cuidado pois qual é a tabela e campos que se deseja como ponte para que esses usuários espe-
com Proxies e Firewalls que podem impedir utilizar. cializados possam acessar as informações
o acesso ao banco de dados. Pode ser um Há também uma aba Connect Options e armazenadas no banco através de uma apli-
IP ou nome de um servidor fora de sua rede. outra Advanced. Pela aba Connect Options cação cliente de sua escolha.
Vários provedores de hospedagem disponibi- pode-se configurar a porta TCP/IP utilizada
lizam base MySQL. para acesso ao banco. Em algumas redes, o Nota Importante: Os direitos do usuário
USER: Nome do usuário do banco (não administrador de banco de dados necessita vão depender unicamente dos direitos atribuí-
do equipamento ou rede). O administrador do trocar a porta padrão do MySQl, logo as esta- dos ao usuário do banco MySQL. No exemplo
banco é quem cria os usuários. Em um próxi- ções devem ter essa informação, do contrário citado anteriormente, temos um user lpsantos.
mo artigo estaremos descrevendo como ad- não conseguirão acessar o servidor mySQL. Cabe ao administrador da rede ou do banco
ministrar o MySQL. Na aba Advanced, podemos configurar de dados MySQL atribuir direitos de consul-
SENHA: Senha do USER do banco. como os dados recebidos serão exibidos ao ta e atualização, e definir em quais tabelas o
DATABASE: É o banco do MySQL que usuário e aplicativos, bem como informa- usuário pode trabalhar. Em caso de ausência
desejamos gerenciar. Não confundir banco ções de debug como, por exemplo, gravar as de um user criado, o user padrão é root (ge-
com tabela. O MySQL é capaz de gerenciar queries geradas na estação em arquivos tex- ralmente bloqueado por razões de segurança)
vários bancos simultaneamente. É nessa op- to. e, se nenhuma senha foi atribuída pelo admi-
ção devemos informar qual banco desejamos Discutiremos melhor essas duas abas nistrador, a mesma permanece em branco.
acessar. Note que os bancos disponíveis nes- em um artigo futuro de Tuning em Clientes Porém, muito cuidado! Abrir a base de dados
se servidor aparecerão em um combo. Obs: MySQL. para GRAVAÇÃO e ALTERAÇÃO dessa ma-
Para cada banco de dados devemos criar um neira pode permitir ao usuário provocar uma
DATA SOURCE NAME. Exemplo prático bagunça generalizada, ou mesmo danificar a
A figura anterior mostra os campos preen- integridade lógica dos dados. Sugestão: Uso
chidos com alguns dados de exemplo. Um exemplo bastante comum é disponi- de ODBC em Cliente/Servidor apenas para
Com os campos já preenchidos, podemos bilizar o acesso a um banco ou tabela, para consulta!
efetuar um teste de conexão. Para isso, bas- funcionários(as) que necessitem efetuar bus-
ta clicar no botão Test, e se tudo der certo, cas ou alterações em dados. Quando imple- Em nosso exemplo, vamos mostrar um
uma janela aparecerá com um aviso de su- mentamos aplicações baseadas em banco objeto de dados ODBC devidamente configu-
cesso. Nesse teste, todos os dados de cone- de dados cliente/servidor, grande parte dos rado e testado de acordo com o exemplo an-
xão previamente informados são utilizados. problemas aparece no lado cliente, pois ge- terior. O nome do objeto de dados é FreeDB.
Caso alguma mensagem de erro apareça, as ralmente tem-se uma aplicação que faz toda Supondo que desejamos efetuar uma con-

Página 14
Índice Usando ODBC com MySQL
Saindo do Forno... Indexação Textual com o PostgreSQL
Entrevista com Nickolay Samofatov Calendário de eventos
Entendendo o gStat - parte 1

sulta a uma tabela de dados do FreeDB que uma tela na qual devemos indicar qual é o ar- dos no MySQL. No banco .MDB não ficarão
está no MySQL, utilizando como cliente o MS- quivo .MDB a ser criado. É nesse arquivo que armazenados os dados, somente um elo com
Access. A partir dele, qualquer usuário pode criaremos o elo entre o usuário e o MySQL. O a tabela armazenada fisicamente no MySQL.
gerar desde simples consultas, até poderosos Nome do banco .MDB será MyAccess.MDB. Na tela apresentada que foi aberta, selecio-
mecanismos de busca e publicação. O MS- Logo após informarmos o nome do .MDB, te- ne “Vinculação de tabela” e clique OK. Agora
Access pode gerar relatórios e listagens, im- remos a seguinte tela: selecione como na opção “Arquivos do tipo” a
primir etiquetas e gerar mala direta. opção Banco de dados ODBC, conforme tela

MySQL
Ao Carregar o MS-Access, devemos criar abaixo:
um novo banco de dados. Caso o usuário de-
seje anexar a tabela do MySQL a um banco
(.MDB) já existente, é perfeitamente possível,
mas sugerimos gerar uma cópia de seguran-
ça de seu banco antes de efetuar a operação.
A tela que teremos é a seguinte:

Nesse momento, devemos acessar o Menu


e selecionar a Opção Inserir, indicando a op-
Na tela seguinte, mude para a aba Fonte
ção Tabela, conforme tela abaixo:
de dados de máquina e selecione FreeDB,
que é o objeto de dados que acabamos de
criar para acessar o MySQL. Ao clicar no bo-
tão OK, as tabelas contidas no banco e dispo-
níveis ao usuário serão listadas, como mostra
figura abaixo.

Após selecionar a tabela (no exemplo é a


Após isso, devemos selecionar a opção de tabela PESSOAS, mas pode ser qualquer ta-
vinculação de tabela ao banco .MDB, ou seja, bela que desejarem vincular ao MS-Access) e
Uma vez selecionado o botão OK, teremos o MS-Access criará um link lógico com os da- clicarmos no botão OK, teremos que respon-
der qual é a chave primária da tabela:
Página 15
Índice Usando ODBC com MySQL
Saindo do Forno... Indexação Textual com o PostgreSQL
Entrevista com Nickolay Samofatov Calendário de eventos
Entendendo o gStat - parte 1

MySQL
Nela podemos navegar pelos dados, e de
acordo com os direitos do usuário determina-
No exemplo, selecionaremos o campo
dos no banco MySQL, alterar, inserir e excluir
NOME e clicaremos no botão. A seguinte tela
informações. A partir daí, a tabela está dispo-
será exibida:
nível para qualquer atividade no MS-Access.
Pode-se utilizar as informações de acordo
com a necessidade de cada um.
Espero ter sido útil nesse artigo e gostaria
de receber um retorno de vocês com dicas,
sugestões e críticas construtivas. Um abraço
e até o próximo artigo.

Avalie esse artigo

ÓTIMO BOM RUIM


A partir de agora, podemos utilizar a tabe-
la pessoa como se ela fosse uma tabela do
MS-Access. Após efetuarmos um duplo clique
na tabela PESSOAS, teremos um browse da Autor:
tabela, proporcionado pelo MS-Access, em Luiz Paulo de Oliveira Santos
uma tabela MySQL. A tela a seguir demonstra Mini-curriculo
isso:
Luiz Paulo de Oliveira Santos é formado em
Tecnologia de Processamento de Dados, es-
pecialista em Análise de Sistemas e Redes de
Computadores. É analista de suporte de re-
des na Universidade Metodista de Piracicaba
e diretor da JobVox Sistemas Informatizados.
lpaulo@jobvox.com.br

Página 16
Índice Usando ODBC com MySQL
Saindo do Forno... Indexação Textual com o PostgreSQL
Entrevista com Nickolay Samofatov Calendário de eventos
Entendendo o gStat - parte 1

Indexação
Tsearch2 vidor tenha sido instalado à partir dos fontes.
Nesse caso, você terá que compilar o paco-

textual no
O Tsearch2 (http://www.sai.msu.su/ te do tsearch2: entre no diretório dos fontes
~megera/postgres/gist/tsearch/V2/) é a se- e depois em contrib\tsearch2, e digite make

PostgresSQL
gunda geração das ferramentas de indexação install.
de texto para o PostgreSQL. Ele é composto Estando instalada corretamente a bibliote-
por uma série de funções, operadores e tipos ca dinâmica, basta encontrar o arquivo tsear-
Diogo de Oliveira Biazus adicionais que podem ser instalados em uma ch2.sql, também presente no diretório contrib,
base de dados a partir do módulo presente no e executar os comandos contidos nele na
As vezes é necessário criar aplicações diretório contrib. Existem várias ferramentas base de dados destino.
que buscam dados de acordo com palavras livres para esse mesmo fim disponíveis na in-
contidas em textos extensos. No entanto, a ternet, mas nem todas são integradas à um Configuração

PostgreSQL
procura de padrões em grandes cadeias de SGBD relacional.
caracteres (strings) é extremamente custo- O Tsearch2 parte do princípio que pode- Depois de instalado, o tsearch2 cria quatro
sa em termos computacionais/performance. mos dividir um texto qualquer em unidades tabelas de configuração no banco de dados.
Uma das soluções para esse problema é que- atômicas (palavras-chave), e dispor essas Elas são: pg_ts_cfg, pg_ts_cfgmap, pg_ts_
brar os textos em átomos maiores que um ca- unidades em vetores que serão indexados dict e pg_ts_parser. A configuração geralmen-
ractere, ou seja, utilizar palavras-chave para em árvores de busca genéricas (GIST - gist. te só é feita nas três primeiras tabelas, sendo
indexar. O uso de palavras-chave reduz con- cs.berkeley.edu). O Tsearch2 é desenvolvido que a última serve para configurar interpreta-
sideravelmente o número de elementos dis- por Oleg Bartunov e Teodor Sigaev, e faz par- dores, algo que dificilmente faremos, pois o
tintos à serem indexados, além de possibilitar te do pacote oficial do PostgreSQL desde a interpretador padrão é suficiente para a maio-
algoritmos muito mais eficientes para a bus- versão 7.4, podendo ser instalado também na ria dos casos.
ca. Torna-se possível utilizar uma estrutura de 7.3. Na tabela pg_ts_cfg encontram-se as con-
dados que organize todas as palavras conti- figurações do indexador. Normalmente usa-
das em um texto em um formato que possa Instalação remos apenas uma configuração por idioma.
ser facilmente percorrido: uma árvore. Outra No entanto, é comum usarmos mais de uma
vantagem na utilização de palavras-chave é Para instalar o tsearch2 em uma base de configuração para um mesmo idioma, geran-
que elas possuem um significado, o que não dados, o primeiro passo é obter a biblioteca do tipos de indexação distintas. Poderia ser
acontece com meras cadeias de caracteres. dinâmica com as funções necessárias. Caso interessante, por exemplo, criar duas configu-
Isso pode ser utilizado para criar ordenações você esteja utilizando pacotes pré-compilados rações para o português: uma utilizando um
baseadas em relevâncias de palavras em um em qualquer distribuição de Linux, provavel- algorítmo de redução de palavras ao radical,
determinado contexto. mente existe um pacote separado para os e outra indexando as palavras exatamente
Um ótimo exemplo de pesquisa textual rá- itens do contrib que necessita ser instalado. como foram encontradas no texto, e talvez um
pida são os sites de busca na web (google, No Debian, por exemplo, o nome do pacote terceiro método, usando um dicionário ispell.
Yahoo, etc), que procuram por palavras-chave é postgresql-contrib. Se servidor for o Post- Na próxima seção explicarei melhor o sistema
presentes em documentos armazenados em greSQL 8.0 para Windows, o tsearch2 já está de dicionários do tsearch2.
imensas bases de dados. disponível no diretório: INSTALACAO\8.0\lib. A estrutura da pg_ts_cfg está descrita
Ainda existe a possibilidade de que o seu ser- abaixo:

Página 17
Índice Usando ODBC com MySQL
Saindo do Forno... Indexação Textual com o PostgreSQL
Entrevista com Nickolay Samofatov Calendário de eventos
Entendendo o gStat - parte 1

na ordem de inserção. elementos diferentes uniformizando as pala-


create table pg_ts_cfg ( Finalmente, a tabela pg_ts_dict é onde vras, removendo sufixos, e em alguns casos,
id int not null primary key, se encontram os dicionários, sendo uma das eliminando palavras irrelevantes.
ts_name text not null, grandes vantagens do tsearch2, pois permite Em segundo lugar, para melhorar a usabili-
prs_name text not null,
uma flexibilidade na utilização de vários algo- dade de um sistema - muitas vezes é interes-
locale text );
ritmos para indexar os textos. A estrutura da sante para o usuário obter no retorno de suas
tabela é a seguinte: consultas documentos com palavras seme-
Onde id e ts_name são identificadores da
lhantes, mas não exatamente iguais àquelas
configuração, prs_name é o interpretador a CREATE TABLE pg_ts_dict ( utilizadas por ele.
ser usado, e locale indica qual configuração dict_name text not null, Existem basicamente dois tipos de dicio-
de localização do sistema define automatica- dict_init oid, nários para cada idioma, um baseado no
mente essa configuração para a indexação. dict_initoption text,
ispell (http://www.gnu.org/software/ispell/is-

PostgreSQL
A tabela pg_ts_cfgmap mapeia os tipos de dict_lexize oid not null,
dict_comment text);
pell.html), e outro que usa um algorítmo de
palavras encontradas para os dicionários que
stemm (redução de palavras ao radical). O
serão responsáveis pela indexação. Cada
Onde: dict_name é o nome do dicionário, dicionário ispell usa uma lista de palavras
registro na pg_ts_cfgmap pertence à uma
dict_init é o oid de uma função do banco de pré-catalogadas em um formato especial para
configuração na pg_ts_cfg. Por exemplo, se
dados para iniciar o dicionário, dict_initoption remover os sufixos. Ele funciona de forma
você tem uma configuração chamada “por-
são parâmetros passados para essa função, extremamente precisa, mas indexa somen-
tuguês” cadastrada na pg_ts_cfg, ela deve
dict_lexize é o oid de uma função que vai re- te palavras encontradas na listagem (o que
estar mapeada na pg_ts_cfgmap, para que o
tornar a unidade a ser indexada à partir das eventualmente pode ser indesejável). Po-
PostgreSQL saiba como indexar as palavras
palavras encontradas, e o dict_comment é demos encontrar arquivos com palavras do
quando ela for utilizada.
apenas um comentário sobre o dicionário. português brasileiro no formato ispell graças
A estrutura da tabela pg_ts_cfgmap é:
à um projeto hospedado na USP (http://www.
ime.usp.br/~ueda/br.ispell/).
create table pg_ts_cfgmap ( Dicionários customizados
ts_name text not null, Já o stemm é um procedimento que tenta
tok_alias text not null, reduzir as palavras através de regras gerais, o
Podemos usar vários tipos de dicionários
dict_name text[], que pode gerar várias imprecisões em termos
para controlar o processo de indexação de
primary key (ts_name,tok_alias)); lingüísticos, mas funciona de forma satisfa-
palavras-chave. O termo “dicionário” aqui não
tória, sendo mais flexível, principalmente em
está sendo usado no seu sentido convencio-
Onde: ts_name é o nome da configuração textos cheios de “estrangeirismos” ou neolo-
nal, pois ele pode ser apenas um algorítmo, ao
pai, tok_alias é o nome dado ao tipo de pala- gismos.
invés de uma listagem estática de palavras.
vra, como lword para “latin word” ou email para Para configurar um dicionário de stemm
Qual o motivo para usar tal recurso? Em
endereços de email. Dict_name é a lista de di- em português, por exemplo, devemos seguir
primeiro lugar: performance. A velocidade de
cionários que podem ser usados para indexar os seguintes passos, no linux:
busca nos índices é determinada pela quan-
esse tipo de palavra. Note que dict_name é
tidade de palavras-chave distintas presentes cd PGSQL_SRC/contrib/tsearch2/gendict
um arranjo, e que os seus elementos devem
em toda a árvore, quanto menor for esse nú-
estar em ordem de prioridade. O tsearch vai
mero, maior será a performance das pesqui- Depois baixe os arquivos stem.{c,h} para
tentar usar todos os dicionários cadastrados
sas. Os dicionários diminuem o número de o português:
Página 18
Índice Usando ODBC com MySQL
Saindo do Forno... Indexação Textual com o PostgreSQL
Entrevista com Nickolay Samofatov Calendário de eventos
Entendendo o gStat - parte 1

em um dicionário de stemm, como por exem- default_portuguese email {simple}


wget http://snowball.tartarus.org/ plo o que foi criado no exemplo acima, usa- default_portuguese url {simple}
portuguese/stem.c mos um SQL como o seguinte: default_portuguese host {simple}
wget http://snowball.tartarus.org/ default_portuguese sfloat {simple}
portuguese/stem.h default_portuguese version {simple}
INSERT INTO pg_ts_dict SELECT
default_portuguese part_hword
‘pt_stem’,
Crie arquivos de modelo para português: {simple}
(select oid
default_portuguese nlpart_hword
from pg_proc
./config.sh -n pt -s -p portuguese -v {simple}
where proname=’snb_pt_init’),
-C’Snowball stemmer para português’ default_portuguese lpart_hword
‘/var/lib/postgres/data/portugues.
{simple}
txt’,
Vários arquivos vão ser criados em PGS- default_portuguese hword {simple}
(select oid
QL_SRC/contrib/dict_pt. default_portuguese lhword {pt_stem}
from pg_proc

PostgreSQL
default_portuguese nlhword {simple}
where proname=’snb_lexize’),
default_portuguese uri {simple}
Compile e instale o dicionário: ‘Stemmer Snowball de Português.’;
default_portuguese file {simple}
default_portuguese float {simple}
cd PGSQL_SRC/contrib/dict_pt Para usar o dicionário acima, precisamos default_portuguese int {simple}
make install de registros correspondentes nas tabelas default_portuguese uint {simple}
psql base_de_dados < dict_pt.sql pg_ts_cfg e pg_ts_cfgmap. Vou exemplificar \.
a criação de uma configuração que utilize o
Também existem dicionários específicos dicionário que acabamos de inserir na base: No exemplo acima, escolhemos o dicioná-
para tratamento de números, pois eles são rio pt_stem para palavras do tipo lword (Latin
identificados de forma diferente das palavras, INSERT INTO pg_ts_cfg VALUES (‘de- Word), lhword (Latin Hyphenated Word). O “h”
e podem ter um tratamento especial. Por fault_portuguese’, ‘default’, ‘pt_ antes da palavra word, indica que a palavra
exemplo, podemos eliminar números muito BR.ISO8859-1’); contém hífem, o “l” é para palavras latinas e o
grandes usando um dicionário para inteiros. “nl” para palavras não latinas. Existem tipos de
Para mais informações, consulte: http://www. No comando acima, criamos uma configu- termos específicos, como email (endereços
sai.msu.su/~megera/postgres/gist/tsearch/ ração chamada default_portuguese que usa o de email), url (endereços URL), int (inteiros),
V2/dicts/README.intdict (em inglês). interpretador (parser) padrão do tsearch, e é float (números em ponto flutuante), etc...
Podemos configurar um arquivo de pala- acionada automaticamente quando utilizamos
vras irrelevantes a serem descartadas duran- o locale pt_BR.ISO8859-1. Agora, vamos
Criando os índices
te a indexação. Esse arquivo deve conter uma mapear os tipos de palavras para os dicioná-
lista de palavras (uma palavra por linha), e rios na nossa configuração. Para isso, usarei
Primeiro é necessário saber que os índi-
estar em um diretório acessível pelo usuário o comando copy para inserir os registros ade-
ces de palavra-chave não serão criados dire-
postgres. Então, podemos colocar na tabela quados em pg_ts_cfgmap:
tamente sobre o campo com o conteúdo dos
de configuração pg_ts_dict o parâmetro de
textos. É necessário criar um campo com um
inicialização de dicionário dict_initoption. COPY pg_ts_cfgmap FROM stdin;
default_portuguese lword {pt_stem} estrutura própria para indexação, o tipo des-
Por exemplo, se temos um arquivo de pa-
default_portuguese nlword {simple} se campo é tsvector, podendo ser facilmente
lavras irrelevantes em /var/lib/postgres/data/
default_portuguese word {simple} gerado a partir de campos texto com a função
portugues.txt e desejamos usar esse arquivo
Página 19
Índice Usando ODBC com MySQL
Saindo do Forno... Indexação Textual com o PostgreSQL
Entrevista com Nickolay Samofatov Calendário de eventos
Entendendo o gStat - parte 1

to_tsvector. Para adicionar um campo desse O índice gist é um dos tipos de índice su- campo_texto);
tipo basta usar o comando: portados pelo PostgreSQL. É uma espécie de
B-Tree mais flexível, projetado para aceitar vá- Nosso trigger teria que ser personalizado,
ALTER tabela ADD campo_indice tsvec- rios tipos de dados, inclusive tipos compostos. para isso basta criar uma função simples em
tor; Para mais informações, visitem o site sobre linguagem procedural. Se a PL/pgSQL esti-
indexação GIST: http://gist.cs.berkeley.edu/ ver instalada no banco, basta criar uma fun-
Caso você já tenha linhas na tabela de Para criar mais de um índice na mesma ção como a mostrada na listagem 1.
documentos, use um update com a função tabela usando configurações de indexação E adaptarmos o nosso trigger com a nova
ts_vector para criar os valores iniciais do cam- diferentes, precisaremos criar um campo de função:
po_indice: índice para cada configuração. Por exemplo,
digamos que temos uma base com duas con- CREATE TRIGGER tsvector_update
UPDATE tabela SET campo_indice = figurações na pg_ts_cfg: default_portugue- BEFORE UPDATE OR INSERT

PostgreSQL
to_tsvector(campo_texto); ON tabela
se para indexar palavras em português com
FOR EACH ROW EXECUTE PROCEDURE
stemm, e simple para indexar palavras exata- tsearch2_estendida();
Em seguida, é necessário manter sempre o mente como foram encontradas.
campo_indice sincronizado com as suas fon- Para isso criaríamos um segundo campo
tes, no nosso exemplo o campo_texto. Para Realizando consultas
de indexação:
isso, convém criarmos um trigger que atribua
e mantenha atualizado o campo_indice usan- ALTER tabela ADD campo_indice_stemm Tendo o campo tsvector e o seu respecti-
do to_tsvector(campo_texto). Já existe uma tsvector; vo índice você já pode iniciar as buscas. Po-
função pronta para isso, basta criarmos então rém, para fazer consultas é necessário utilizar
o trigger na tabela desejada com o seguinte E indicaríamos nas funções de atualiza- mais um tipo especial: o tsquery, pois o ope-
comando: ção, qual função estamos usando para cada rador que usaremos para fazer as consultas
campo: é o @@, que opera um tipo tsquery com um
CREATE TRIGGER tsvector_update tsvector. É muito simples gerar um tipo ts-
BEFORE UPDATE OR INSERT UPDATE tabela SET campo_indice = to_ query à partir de um texto, bastando usar a
ON tabela tsvector(‘simple’, campo_texto); função to_tsquery, como em:
FOR EACH ROW EXECUTE PROCEDURE
tsearch2(campo_indice, campo_texto); UPDATE tabela SET campo_indice_stem SELECT titulo, corpo FROM docs WHERE
= to_tsvector(‘default_portuguese’, campo_indice @@ to_tsquery(‘brasil’);
Agora você tem um campo do tipo tsvector
sendo atualizado e pronto para ser indexado. CREATE FUNCTION tsearch2_estendida() RETURNS TRIGGER AS ‘
Basta criar o índice gist sobre o campo_indi- NEW.campo_indice := to_tsvector(\’simple\’, NEW.campo_texto);
ce:. NEW.campo_indice_stem := to_tsvector(\’default_portuguese\’, NEW.
campo_texto);
CREATE INDEX nome ON tabela USING RETURN NEW;
gist (campo_indice); ‘ LANGUAGE ‘plpgsql’;

Listagem 1. Versão estendida da função

Página 20
Índice Usando ODBC com MySQL
Saindo do Forno... Indexação Textual com o PostgreSQL
Entrevista com Nickolay Samofatov Calendário de eventos
Entendendo o gStat - parte 1

de de busca vai ser bem superior ao de uma ca utilizada. Pode ser utilizada no ORDER BY
No exemplo acima, usamos apenas uma consulta similar usando operadores LIKE ou da consulta para dar o ordenação adequada
palavra-chave para a busca (brasil), mas po- de expressões regulares. ao número de ocorrências dos termos nos
deríamos ter usado várias palavras concate- O resultado pode ser observado usando o textos.
nadas com operadores lógicos & (para e), | comando explain, que mostra o plano de exe- Também podemos definir pesos distintos
(para ou), ou ! (para negação). Por exemplo: cução estimado para uma consulta SQL. Na para as palavras contidas no vetor, depen-
figura 1, podemos ver que após a criação do dendo da sua posição. Para isso, podemos
SELECT titulo, corpo FROM docs índice gist a pesquisa com o operador @@ se executar a função setweight, que recebe um
WHERE campo_indice @@ to_tsquery(‘(br beneficia dele para acelerar a busca. tsvector e um peso que pode ser D, C, B ou A,
asil|brasileiro)&presidente’); sendo D o peso padrão atribuído a todas as
posições pela função to_tsvector, e A o maior
A consulta acima procura qualquer docu- Recursos avançados peso possível. Supondo que a nossa tabela

PostgreSQL
mento onde exitam as palavras (presidente e de exemplo agora também vai ter o título inde-
brasil) ou (presidente e brasileiro). O tsearch2 é uma ferramenta bem com- xado, podemos usar uma função mais sofisti-
Notem que os exemplos dados até agora pleta para manipulação de textos, possuindo cada para fazer a indexação, como mostrada
utilizam apenas um parâmetro para as fun- rotinas para indexar e buscar, bem como algu- na listagem 2.
ções de conversão (to_tsquery e to_tsvec- mas rotinas adicionais para facilitar o desen- Agora o nosso trigger de indexação inclui
tor). Porém, essa função possui uma versão volvimento de aplicações. o campo título no vetor de índice, mudando o
sobrecarregada (overloaded) para usar dois Uma das funções disponíveis é a rank(), peso das suas palavras para A.
parâmetros, onde o primeiro é a configura- que utiliza as posições das palavras no tex- Outra opção para o programador é remo-
ção de dicionário e o segundo é o objeto a to para gerar um ranking de relevância para ver as informações sobre posição e peso das
ser convertido. A configuração são aquelas ordenar os resultados da consulta. A função palavras, diminuindo o espaço ocupado pelo
encontradas na tabela pg_ts_cfg. Assim, em rank recebe dois argumentos: o primeiro é o campo e pelo índice, e acelerando um pouco
uma aplicação que usa diferentes tipos de tsvector alvo, e o segundo é a tsquery de bus- a busca. Isso pode ser feito com a operação
configuração para indexar os textos, podería-
mos usar os seguintes comandos:
CREATE FUNCTION tsearch2_estendida() RETURNS TRIGGER AS ‘
SELECT titulo, corpo NEW.campo_indice :=
FROM docs setweight(to_ tsvector(\’simple\’, NEW.titulo), ‘A’) ||
WHERE campo_indice @@ to_tsquery to_tsvector(\’simple\’, NEW.campo_texto);
(‘default_portuguese’, ‘brasil’);
NEW.campo_indice_stem :=
SELECT titulo, corpo setweight(to_tsvector(\’default_portuguese\’, NEW.titulo), ‘A’) ||
FROM docs to_tsvector(\’default_portuguese\’, NEW.campo_texto);
WHERE campo_indice @@ to_tsquery
(‘simple’, ‘brasil’); RETURN NEW;
‘ LANGUAGE ‘plpgsql’;
Se tudo for feito corretamente, a consulta
usando o operador @@ vai utilizar o índice Listagem 2. Função alterada para incluir a indexação da coluna título
gist criado sobre o campo_indice,e a velocida-
Página 21
Índice Usando ODBC com MySQL
Saindo do Forno... Indexação Textual com o PostgreSQL
Entrevista com Nickolay Samofatov Calendário de eventos
Entendendo o gStat - parte 1

strip, que recebe como parâmetro um tsvec-


tor. Mas note que qualquer tipo de ranking
terá que ser feito manualmente depois disso.
Um exemplo de como ficaria o trigger de in-
dexação usando a strip pode ser visto na lis-
tagem 3.
Outra funcionalidade interessante é a hea-
dline, que mostra apenas um extrato do texto
original contendo as palavras usadas na bus-
ca, já acrescentando uma marcação html para
destaque. Para chamar a headline é necessá-
rio passar como parâmetro o texto, a tsquery

PostgreSQL
usada na busca e por último o texto que deve
ser usado como marcador de destaque. Caso
o terceiro parâmetro não seja definido, o pa-
drão é usar as tags <b> e </b>. Figura 1. Plan de utilização com consulta otimizada

Conclusão essa é a solução ideal para você. Caso ainda


esteja avaliando opções de indexadores inde- Avalie esse artigo

O tsearch2 é uma poderosa ferramenta pendentes de SGBD, considere as vantagens ÓTIMO BOM RUIM
para construção de diversos tipos de ferra- de ter o mecanismo de busca integrado a uma
mentas de busca. Podendo ser usada em si- poderosa base de dados relacional.
tes, programas de catalogação eletrônica, da-
tawarehouse e várias outras aplicações. Caso
você já tenha uma grande base de documen-
tos dentro de um banco de dados PostgreSQL, Autor:
Diogo de Oliveira Biazus
CREATE FUNCTION tsearch2_estendida() RETURNS TRIGGER Mini-curriculo
AS ‘ Diogo de Oliveira Biazus está cursando Ciên-
NEW.campo_indice := strip(to_tsvector(\’simple\’, NEW.titulo || ‘ ‘ cia da Computação no Instituto de Informáti-
|| NEW.campo_texto)); ca da UFRGS. É membro do Grupo Global de
Desenvolvimento do PostgreSQL como contato
NEW.campo_indice_stem := strip(to_tsvector(\’default_portuguese\’, e tradutor no Brasil e co-mantenedor do projeto
NEW.titulo || ‘ ‘ || NEW.campo_texto)); PostgreSQL BR (http://www.postgresql.org.br).
Atualmente trabalha como instrutor e consultor
RETURN NEW; de PostgreSQL na TargetTrust em Porto Alegre.
‘ LANGUAGE ‘plpgsql’; Blog do autor: http://fumadordetabaco.blogspot.
com/
Listagem 3. Usando a função strip

Página 22
Índice Usando ODBC com MySQL
Saindo do Forno... Indexação Textual com o PostgreSQL
Entrevista com Nickolay Samofatov Calendário de eventos
Entendendo o gStat - parte 1

Calendário de Eventos
Data Evento Site
7 a 9 Abril Encontro Mineiro de Software Livre 2005 http://psl-mg.softwarelivre.org/tiki-index.
Local: Belo Horizonte - MG - Brasil php?page=EMSL2005

8 a 10 Abril II Festival Software Livre da Bahia http://twiki.im.ufba.br/bin/view/Festival


Local: Bahia - SA - Brasil

18 a 21 Abril MySQL Users Conference 2005 http://www.mysqluc.com/?r=d1


Local: Califórnia - Santa Clara – USA

1 a 4 Junho 6º Forum Internacional de Software Livre http://www.softwarelivre.org


Local: Porto Alegre - RS - Brasil
16 Julho 2º FireBird Developers Day http://www.FirebirdDevelopersDay.com.br
Local: Piracicaba - SP - Brasil

Se você sabe de algum evento focando em Banco de Dados ou em Software Livre que não esteja listado aqui, envie-nos um
email com os dados do evento para que possamos incluí-lo.

Página 23