• Nenhum resultado encontrado

otima, ou seja, determinar a seq¨uˆencia de jun¸c˜oes com menor custo ´e uma tarefa que exige

grande recurso computacional.

Neste cap´ıtulo ser˜ao abordadas diversas classes de algoritmos que apresentam solu¸c˜oes

para o problema de otimiza¸c˜ao de consultas em banco de dados relacionais, apontando

suas vantagens e desvantagens.

3.1 Algoritmos Determin´ısticos

Os algoritmos determin´ısticos apresentam como caracter´ıstica marcante a constru¸c˜ao

da solu¸c˜ao para problemas atrav´es de uma sequˆencia finita de passos. Para isso,

pode-se utilizar de buscas exaustivas ou da aplica¸c˜ao de determinada heur´ıstica [15]. Seu

tempo de execu¸c˜ao ´e fixo e apresentar´a resultados idˆenticos quando aplicado diversas vezes

sobre a mesma entrada de dados. A seguir ser´a apresentado um algoritmo determin´ıstico

cl´assico que se utiliza da tecnica de programa¸c˜ao dinˆamica, onde discutiremos aspectos

relacionados a sua utiliza¸c˜ao na otimiza¸c˜ao de consultas em bases de dados relacionais.

3.1.1 Programa¸c˜ao Dinˆamica

A t´ecnica de programa¸c˜ao dinˆamica geralmente ´e aplicada a problemas de otimiza¸c˜ao

que apresentam muitas solu¸c˜oes poss´ıveis. Sua metodologia procura dividir o problema

apresentando diversas solu¸c˜oes para os subproblemas (m´etodo de dividir e conquistar). O

objetivo ´e encontrar uma solu¸c˜ao ´otima, a qual ´e composta por um valor ´otimo (m´aximo

ou m´ınimo). Cada subproblema ´e resolvido apenas uma vez pelo algoritmo, sendo sua

resposta gravada em uma tabela, para evitar recalcular a solu¸c˜ao, cada vez que o mesmo

for encontrado [3].

Proposto pela primeira vez como estrat´egia de busca na otimiza¸c˜ao de consultas no

SYSTEM-R por Sellinger et al. [10], a programa¸c˜ao dinˆamica atualmente ´e empregada

em v´arios SGBDs. Sua execu¸c˜ao inicia-se com a gera¸c˜ao do plano de acesso, no qual

est˜ao contidos todas as formas de acesso `as rela¸c˜oes mencionadas na consulta, como por

exemplo, varredura seq¨uencial ou por meio de ´ındices presentes nas rela¸c˜oes. Em uma

segunda fase, de posse do plano de acesso, o algoritmo procura todas as formas de unir

duas rela¸c˜oes, onde o plano de menor custo ´e escolhido. A mesma fase ´e repetida, com

base em seus resultados, buscando agora, a melhor forma de efetuar a jun¸c˜ao entre trˆes

rela¸c˜oes. Esta rotina ´e executada at´e que todas as rela¸c˜oes mencionadas na consulta

sejam inclu´ıdas no plano de execu¸c˜ao. Os planos que apresentam custos elevados n˜ao s˜ao

inclu´ıdos no plano ´otimo. O mais barato ´e escolhido como o plano a ser executado.

Um algoritmo de programa¸c˜ao dinˆamica certamente ir´a apontar a solu¸c˜ao ´otima

quando empregado no processo de otimiza¸c˜ao de consultas. Por´em apresenta alto custo

computacional ao deparar-se com queries que envolvam um n´umero elevado de rela¸c˜oes,

acima de 10 a 15 mencionadas na consulta, segundo [3]. Como resultado, a utiliza¸c˜ao de

mem´oria torna-se elevada, devido `a necessidade do armazenamento de solu¸c˜oes parciais.

O processamento requerido para cria¸c˜ao e avalia¸c˜ao de todos os planos poss´ıveis aumenta

exponencialmente de acordo com o n´umero de rela¸c˜oes existentes na consulta, podendo

tornar-se impratic´avel. De acordo com [25], a escolha de planos para otimiza¸c˜ao de

per-formance de consultas em banco de dados relacional ´e um problema NP-completo. Assim,

a t´ecnica de programa¸c˜ao dinˆamica ´e restrita a determinado limite de rela¸c˜oes quando

utilizada para otimizar consultas.

Devido a estas caracter´ısticas, motivou-se o desenvolvimento de algoritmos de

otimiza¸c˜ao como forma de indicar uma solu¸c˜ao pr´oxima a ´otima em tempo polinomial.

Como exemplo, podemos citar os algoritmos heur´ısticos, gulosos e aleat´orios, os quais

s˜ao utilizados para otimizar consultas que apresentam um grande n´umero de rela¸c˜oes

encontrando solu¸c˜oes sub-´otimas em um espa¸co de tempo aceit´avel.

3.1.2 Algoritmo de Kruskal

O algoritmo de Kruskal foi apresentado em 1956 pelo pesquisador Joseph B.

Kruskal [13] como solu¸c˜ao ao problema da ´arvore de custos total m´ınima, a qual deve

ser formada pelo conjunto de arestas de peso m´ınimo de um grafo, selecionadas

sucessi-vamente a partir de seus pesos.

Tido com algoritmo guloso, a cada itera¸c˜ao busca selecionar a aresta que possuir menor

peso, adicionando-a em um subgrafo. Caso sejam encontradas arestas de mesmo custo, a

escolha ´e feita aleatoriamente. Como restri¸c˜ao imposta, tem-se a escolha de arestas que

n˜ao formem um ciclo entre os v´ertices do grafo. O algoritmo se encerra quando todos os

v´ertices que comp˜oem o grafo foram adicionados ao subgrafo, ou seja, todos os v´ertices

do grafo est˜ao presentes na ´arvore geradora m´ınima [3].

O algoritmo de Kruskal pode ser empregado na solu¸c˜ao aproximada do problema do

caixeiro viajante, no qual se busca encontrar a trajeto mais curto para a visita de todas

as cidades. Na mesma linha de racioc´ınio, o algoritmo de Kruskal pode ser aplicado

em diversas ´areas como transporte, telecomunica¸c˜oes, processamento de imagens, entre

outras, buscando a redu¸c˜ao de custos diversos.

Este algoritmo pode ser aplicado `a otimiza¸c˜ao de consultas, conforme [2], uma vez que

o plano de execu¸c˜ao ´otimo pode ser representado por uma ´arvore geradora m´ınima de um

grafo. As rela¸c˜oes mencionadas na consulta s˜ao representadas como v´ertices do grafo. As

arestas representam poss´ıveis jun¸c˜oes entre as rela¸c˜oes, sendo que seus pesos s˜ao baseados

nos custos para realiza¸c˜ao de tais jun¸c˜oes. O c´alculo dos custos leva em considera¸c˜ao

atributos como cardinalidade e seletividade, por exemplo, obtidos estatisticamente pelo

SGBD. O algoritmo de Kruskal realizar´a primeiramente as jun¸c˜oes entre rela¸c˜oes que

possuem menor custo, reduzindo desta forma o custo das jun¸c˜oes seguintes que envolvem

rela¸c˜oes mais custosas e maiores.

Documentos relacionados