Geração de Planos de Execução Planos para Consultas Aninhadas AULA 28 Profa. Sandra de Amo GBC053 – BCC Consultas com uma única relação no FROM Quando não se tem nenhum índice nos atributos aparecendo no WHERE SCAN para selecionar as tuplas satisfazendo a condição do WHERE Ao mesmo tempo (on the fly) aplica-se a projeção nos atributos do SELECT Grava-se o resultado Ordena-se o resultado para implementar o GROUP BY e eliminar duplicatas (caso for solicitado na consulta – DISTINCT) Consultas com uma única relação no FROM Quando se tem índices nos atributos aparecendo no WHERE (em FNC) Gera plano(s) utilizando o(s) índice(s) referente(s) ao(s) atributo(s) com maior fator de redução. Gera plano(s) utilizando os indices para cada atributo que os tenha, ordena os rids por page ids e faz-se a intersecção dos pages ids Projeções são executadas on the fly. Em caso de Group By (ou de DISTINCT) : grava-se o resultado obtido após a seleção, ordena-se as tuplas e executa o agrupamento, eliminando-se duplicatas se for o caso. Consultas com várias relações no FROM Só considera os planos com profundidade à esquerda. Planos de execução para múltiplos “Join” A B C D PLANO POR PROFUNDIDADE À ESQUERDA D A D C C A B PLANOS LINEARES A B B C PLANO BUSHY D Planos por profundidade à esquerda São os únicos a serem considerados: Quanto maior o número de joins maior o número de planos alternativos. Por isto opta-se por considerar somente os left-deep. Planos left-deep permitem utilizar estratégia pipeline à esquerda com a relação externa. A relação interna é sempre uma relação de base (materializada). Repare que não é possível utilizar pipeline à direita de um join. É sempre necessário que a relação interna esteja disponível em sua integralidade, pois é varrida diversas vezes. No caso de planos left-deep, este problema não acontece, pois o filho à direita de um Join é sempre uma relação de base (materializada). Enumeração dos planos com profundidade à esquerda Passo 1: Enumera-se todos os planos de 1 única relação Ri, considerando-se todas as possíveis seleções sobre atributos de Ri que podem ser feitas antes dos Join, além de projeções de atributos não mencionados no SELECT ou nos Joins ou no restante dos atributos do WHERE que não foram “empurrados”para dentro do Join. Escolhe-se os melhores planos de 1 única relação. Passo 2: Gera-se todos os planos de 2 relações, considerando-se todas as combinações de planos obtidos no passo 1 Sempre que o algoritmo do JOIN permitir, a relação externa não é materializada, e o JOIN é executado em pipeline Caso o método de JOIN é um INDEX NESTED LOOP JOIN, considera-se planos para a relação interna que não envolvam indices em atributos diferentes do atributo de junção. Escolhe-se os melhores planos de 2 relações. Passo 3: Gera-se todos os planos com 3 relações, combinando-se cada plano otimal obtido no passo 2 com cada plano otimal obtido no Passo 1. Passo 4: assim por diante… Planos para Consultas Aninhadas SELECT S.sname FROM Sailors S WHERE S.rating = (SELECT MAX (S2.rating) FROM Sailors S2) Subconsulta interna: SELECT MAX (S2.rating) FROM Sailors S2 Executada uma única vez, produzindo um número X SELECT S.sname FROM Sailors S WHERE S.rating = X Planos para Consultas Aninhadas SELECT S.sname FROM Sailors S WHERE S.sid IN (SELECT R.sid FROM Reserves R WHERE R.bid = 103) Estratégia de execução comum Subconsulta interna é avaliada e materializada (T) Faz-se um Join Sailors = relação externa T = relação interna (subconsulta sempre é relação interna) Alguns SGBDs têm estratégias mais sofisticadas: Pode tranformar T em relação externa do Join e Sailors na interna, caso for mais vantajoso, por exemplo, se Sailors possui indice Hash no atributo sid Planos para Consultas Aninhadas SELECT S.sname FROM Sailors S WHERE S.sid IN (SELECT R.sid FROM Reserves R WHERE R.bid = 103) O Plano de execução canônico para esta consulta é o mesmo plano (otimizado) produzido pelo otimizador para a consulta: SELECT S.sname FROM Reservas R, Sailors S WHERE R.Sid = S.Sid AND R.bid = 103) Um bom programador pode “guiar” o otimizador, dirigindo-o para o melhor plano de execução. Um bom programador pode forçar o otimizador a produzir um plano que não seria produzido automaticamente. Tratamento de Consultas Aninhadas Correlatas SELECT S.sname FROM Sailors S WHERE EXISTS (SELECT * FROM Reserves R WHERE R.bid = 103 AND S.sid = R.sid) Consulta externa e interna são correlatas: atributo sid da externa aparece na consulta interna. Não é possível avaliar a consulta interna uma única vez. Estratégia típica de execução: consulta interna é calculada para cada tupla de S Aninhadas versus não-aninhadas Uma consulta aninhada frequentemente é equivalente a uma não aninhada. Consultas aninhadas correlatas frequentemente têm uma versão sem correlação. Um otimizador tipico é capaz de encontrar um bom plano de execução se dispõe de uma versão não-aninhada ou sem correlações. Boa parte dos otimizadores não são capazes de transformar consultas aninhadas em não aninhadas ou de eliminar correlações. Assim, fica a cargo do programador formular a consulta de modo a evitar aninhamentos e/ou correlações. FIM Boa Prova Final e Boas Férias !!!