Queries hierárquicas em Oracle

Um caso que ocorre com frequência é ter estruturas hierárquicas em tabelas. Um exemplo típico será uma tabela empregado, que pode ter e/ou ser um supervisor. Ou seja, temos uma chave estrangeira que aponta para a chave da própria tabela, algo tipo

ID_EMP  NOME           SUPERVISOR
------- -------------- ------------
1       João           NULL
2       Pedro          1
3       Ricardo        1
4       José           2

Em que o João é supervisor do Pedro e do Ricardo e o Pedro é supervisor do José.

Por vezes, temos uma estrutura deste tipo mais ou menos complexa, com mais ou menos níveis de profundidade e queremos saber, com base num identificador, todos os resultados hierarquicamente – neste caso, ao perguntar quais os supervisionados hierárquicos do João, teríamos o Pedro, Ricardo e José.

Tipicamente, até agora fazia uma função em pl/sql que fizesse isto pois não conhecia algumas das facilidades que o Oracle fornece para isto.

Introducing CONNECT BY

DBAs e pessoal com alguma experiência em Oracle deve conhecer isto, mas para mim foi uma novidade e foi-me imensamente útil.
Com esta directiva, consigo fazer o seguinte:

SELECT
  NOME, LEVEL
FROM
  EMPREGADO
START WITH
  NOME='João'
CONNECT BY NOCYCLE
  PRIOR ID = SUPERVISOR

O resultado desta query seria aproximado a:

NOME           LEVEL
-------------- -------
João           1
Pedro          2
Ricardo        2
José            3

O que se fez foi dizer que queríamos começam com o registo com o nome João e “ligá-lo” aos seus filhos. Isto é feito com a cláusula CONNECT BY e usando PRIOR num dos campos. Podemos pensar seguindo da raiz, de registo em registo iterativamente, sendo que na primeira iteração o PRIOR ID é o campo do registo raiz e estamos a seleccionar como próximos campos, todos os que tenham SUPERVISOR = PRIOR ID.
A palavra NOCYCLE é para não se entrarem em ciclos e a coluna LEVEL que está a ser usada é uma pseudo-coluna que indica o nível em que está o registo em relação à raiz (sendo a raiz o nível 1).

Podem encontrar uma explicação mais completa aqui.

Oracle compra Tangosol

A notícia já tem alguns dias, mas a Oracle anunciou a aquisição da Tangosol, empresa especialista em soluções data grid, nomeadamente com o seu produto Coherence que permite transacções distribuídas de alta performance. Antes de mais, aproveito para dar a conhecer um pouco este produto que já investiguei um pouco, mas que não tive oportunidade de utilizar em projectos reais em Portugal, um pouco devido à dimensão.

O Tangosol Coherence é uma solução de gestão de dados in-memory em ambientes distribuídos, integra graciosamente com a maioria dos servidores aplicacionais (p.e. OracleAS, JBoss, Weblogic e Websphere) e é independente da datasource (pode ser uma base de dados, um webservice ou um qualquer sistema legacy). Permite-nos gerir de forma transparente o acesso e gestão de dados sobre conjuntos de máquinas, garantindo alta performance – tal como clientes real-time – e integridade de dados, sem grande esforço do utilizador.

O principal ponto do produto é o mecanismo de caching distribuído. Suporta caching Read-Through, Write-Through, Refresh-Ahead e Write-Behind, sendo que as duas últimas podem ter grandes impactos de performance. Pode-se ler uma explicação destas políticas de caching aqui. Temos também sub-produtos, nomeadamento o Coherence Web, que permite fazer caching de sessões HTTP de fo

rma fácil e incrivelmente eficiente e performante.

O ponto seguinte do produto é a sua implementação de transacções distribuídas. Chama-se Extreme Transaction Processing e em conjunto com a cache write-behing, faz transacções in-memory, sendo assim mais rápido e obtendo uma menor latência.

Existem 3 edições do Coherence: Caching, Application e Data grid. O primeiro foca-se em mecanismos de cache, o segundo engloba as potencialidades do primeiro e ainda controle trasaccional e o último engloba todas as funcionalidades das outras versões, adicionando capacidades de computação, interacção realtime, sistema orientado a eventos e outras propriedades mais avançadas.

Em suma, é o produto líder nesta área, especificamente em ambientes J2EE e é aclamado como um dos poucos produtos java realmente pensados e tecnicamente a roçar a perfeição.


Coloca-se a questão de como se integrará isto tudo como os produtos middleware da oracle, nomeadamente com o Oracle TimesTen – uma base de dados in-memory adquirida pela Oracle há uns tempos atrás, altamente performante, para ser utilizada como caching local para aplicações – e com o Oracle TopLink – o Coherence integra bem com Hibernate, Toplink e pojo's mas prevê-se maior integração com o Toplink. No site da oracle dão algumas ideias sobre esta integração nos pdf's de ajuda, mas nada de muito concreto.

Fica então a esperança de poder vir a utilizar este produto cá na nossa terra, mesmo em sistemas tempo-real e de elevada garantia transaccional como sistemas bancários, de companhias aéreas,

etc.

zp8497586rq