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. No documento TARCIZIO ALEXANDRE BINI APLICAC¸ ˜AO DO ALGORITMO DE KRUSKAL NA OTIMIZAC¸ ˜AO DE CONSULTAS COM M ´ULTIPLAS JUNC¸ ˜OES RELACIONAIS (páginas 34-37)