PostgresSQL Optimização de Interrogações Francisco Santos
Agenda Introdução Processamento Interrogações Query Tree Reescrita de Interrogações Optimização do Plano Modelo de Custo Bibliografia
Introdução O que é o PostgresSQL? É um sistema de gestão de base de dados, com suporte para o modelo de dados objecto-relacional. Surgiu como evolução do SGBD Postgres, desenvolvido pelo Dep. Eng. Inf. da Universidade da California, em Berkley. Este projecto foi apresentado, pela primeira vez, na conferência ACM SIGMOD de É extensível, permitindo que o utilizador defina: Tipos de dados Funções Operadores Funções de Agregação Novos tipos de índices
Processamento Interrogações Análise Léxica, Sintáctica Análise Semântica Reescrita Interrogações Optimização Plano Execução Plano
Processamento Interrogações Análise Léxica, Sintáctica Análise Semântica Reescrita Interrogações Optimização Plano Execução Plano Análise léxica: leitura sequencial dos caracteres que constituem a interrogação, separação dos caracteres em palavras e o reconhecimento dos vocábulos representados por cada palavra (ex.: cláusulas SELECT, FROM, nomes de tabelas, colunas, …). Análise sintáctica: agrupamento dos vocábulos, verificando se formam uma frase sintacticamente correcta, isto é, composta de acordo com as regras sintácticas da linguagem (ex.: formulação completa de uma interrogação). Resultado: árvore de derivação. Análise léxica: leitura sequencial dos caracteres que constituem a interrogação, separação dos caracteres em palavras e o reconhecimento dos vocábulos representados por cada palavra (ex.: cláusulas SELECT, FROM, nomes de tabelas, colunas, …). Análise sintáctica: agrupamento dos vocábulos, verificando se formam uma frase sintacticamente correcta, isto é, composta de acordo com as regras sintácticas da linguagem (ex.: formulação completa de uma interrogação). Resultado: árvore de derivação. Árvore derivação
Processamento Interrogações Análise Léxica, Sintáctica Análise Semântica Reescrita Interrogações Optimização Plano Execução Plano Análise semântica: verificar se os nomes alternativos (aliases) das tabelas (inclui vistas) e colunas correspondem a objectos existentes na BD, verificar se os operadores são aplicados aos operandos do tipo adequado. Resultado: árvore da interrogação (sintáctica- e semanticamente correcta). Análise semântica: verificar se os nomes alternativos (aliases) das tabelas (inclui vistas) e colunas correspondem a objectos existentes na BD, verificar se os operadores são aplicados aos operandos do tipo adequado. Resultado: árvore da interrogação (sintáctica- e semanticamente correcta). Árvore derivação Árvore interrogação
Processamento Interrogações Análise Léxica, Sintáctica Análise Semântica Reescrita Interrogações Optimização Plano Execução Plano Reescrita interrogações: aplicação das regras definidas pelos utilizadores, para as operações: UPDATE, INSERT, DELETE; as operações anteriores também podem utilizar operações SELECT. Subsequentemente, todas as regras relacionadas com operações SELECT são aplicadas. Resultado: árvore da interrogação Reescrita interrogações: aplicação das regras definidas pelos utilizadores, para as operações: UPDATE, INSERT, DELETE; as operações anteriores também podem utilizar operações SELECT. Subsequentemente, todas as regras relacionadas com operações SELECT são aplicadas. Resultado: árvore da interrogação Árvore derivação Árvore interrogação
Processamento Interrogações Análise Léxica, Sintáctica Análise Semântica Reescrita Interrogações Optimização Plano Execução Plano Árvore derivação Árvore interrogação Optimização Plano: geração do método de obtenção dos registos para satisfazer a interrogação; geração de baixo para cima (i.e. parte da sub- interrogação interior para a exterior); escolha do melhor plano é feita com base no custo (inclui CPU e I/O); duas formas de determinar a melhor ordem de junção: algoritmo padrão (Sistema R), algoritmo genético. Resultado: plano de menor custo Optimização Plano: geração do método de obtenção dos registos para satisfazer a interrogação; geração de baixo para cima (i.e. parte da sub- interrogação interior para a exterior); escolha do melhor plano é feita com base no custo (inclui CPU e I/O); duas formas de determinar a melhor ordem de junção: algoritmo padrão (Sistema R), algoritmo genético. Resultado: plano de menor custo Plano
Árvore da Interrogação Exemplo: alunos( aid:string, nome:string, idade:integer, string, media:real ) inscricoes( aid:string, cid:string, nota:integer ) aid FK Alunos Q: “Quais são os alunos: aid e nome, cuja nota no TFC é superior à sua média de curso?” SELECT Q1.aid, Q1.nome FROM alunos Q1 WHERE Q1.aid IN ( SELECT Q3.aid FROM inscricoes Q3 WHERE Q3.nota > Q1.media AND Q3.cid = ‘TFC’ )
Árvore da Interrogação Tipo da operação: SELECT, INSERT, UPDATE ou DELETE Lista das tabelas: Na operação SELECT, representa todas as tabelas da cláusula FROM Tabelas são referenciadas por um identificador numérico Tabela do resultado: Nas operações INSERT, UPDATE e DELETE, representa a tabela onde vai ser colocado o resultado Este campo não é usado na operação SELECT Lista das colunas: Na operação SELECT: colunas a partir das quais é feita a projecção Na operação INSERT: expressões contidas na cláusula VALUES Na operação UPDATE: descreve as novas linhas que substituem as existentes (SET col = expr) Na operação DELETE: não é usada uma vez que esta operação não produz resultados Expressão de qualificação: Corresponde à cláusula WHERE de uma operação Árvore da junção: Mostra a estrutura da cláusula FROM
Reescrita de Interrogações Os utilizadores podem definir que regras devem ser usadas consoante a operação que for aplicada a uma tabela: CREATE RULE nome_regra AS ON { SELECT | INSERT | UPDATE | DELETE } TO tabela [ WHERE condicao_aplicacao ] DO [ INSTEAD ] { NOTHING | comando | ( comando; comando … )} As regras de reescrita são aplicadas entre a fase da análise semântica e da optimização do plano.
Reescrita de Interrogações As vistas sobre as tabelas base são definidas através do sistema de regras. CREATE VIEW v_alunos_cadeiras (aid, nome, cid) AS SELECT a.aid, a.nome, i.cid FROM alunos a, inscricoes i WHERE a.aid = i.aid; Esta operação é desdobrada em duas operações: CREATE TABLE v_alunos_cadeiras (aid, nome, cid); CREATE RULE _RETURN AS ON SELECT TO v_alunos_cadeiras DO INSTEAD SELECT a.aid, a.nome, i.cid FROM alunos a, inscricoes i WHERE a.aid = i.aid;
Reescrita de Interrogações SELECT aid,nome,cid FROM v_alunos_cadeiras; Resultado da aplicação da regra de reescrita: SELECT aid,nome,cid FROM ( SELECT a.aid, a.nome, i.cid FROM alunos a, inscricoes i WHERE a.aid = i.aid ) v_alunos_cadeiras; A redefinição da interrogação aninhada através de uma só operação SELECT é feita durante a fase da optimização do plano
Optimização do Plano Cada bloco da interrogação é processado isoladamente (bloco = sub-interrogação) Geração do plano é feita de baixo para cima: Optimizador parte da sub-interrogação interior para a exterior Permite aplicar optimizações durante a geração, ex.: transformar sub-interrogação numa junção Escolha do melhor plano é feita com base no custo, inclui custo de processamento (CPU) e transferência de páginas de disco para memória (I/O) Duas formas de determinar a melhor ordem de junção: algoritmo padrão (Sistema R): programação dinâmica algoritmo genético: usado quando o número de tabelas na cláusula FROM é muito elevado (>= 12)
Optimização do Plano Alg. Programação Dinâmica (clássico): Para cada par de sub-conjuntos complementares de ‘S’: ‘S1’ e ‘S - S1’, onde ‘S’ é o conjunto das relações a juntar: Encontrar o melhor plano para juntar as tabelas contidas em ‘S1’, designado P1, e o melhor plano para juntar as tabelas contidas no conjunto complementar, designado P2. A = Melhor algoritmo para juntar P1 e P2. Custo = Custo(P1) + Custo(P2) + Custo(A) Se o novo custo for inferior ao anteriormente calculado para ‘S’, substituir o plano por: “P1, P2, juntar(P1,P2,A)”
Optimização do Plano Para uma junção n-ária, o sub-plano esquerdo é uma junção (n-1) ária e o direito é um acesso a uma tabela Os acessos podem ser feitos de forma sequencial ou através de índices primários ou secundários As junções são feitas através de um dos seguintes algoritmos: nested- loops-join, merge-join, hash-join r1r2 r3 No PostgresSQL: são considerados apenas os planos recursivos à esquerda (left-deep):
Optimização do Plano O alg. nested-loops-join é o mais simples para juntar duas tabelas. Pode ser dispendioso se não existir índice sobre os atributos da junção na tabela interior. O merge-sort-join é melhor que o método anterior quando não existe índice sobre a tabela interior. Pode ser usado quando existe uma cláusula da forma ‘col1 OPR col2’ onde ‘col1 tabela1’ e ‘col2 tabela2’ O custo de ordenação inicial das relações pode ser eliminado se existirem índices sobre os atributos da junção em cada tabela Uma segunda alt. quando não existirem índices é o hash-join: é aplicada uma função de hash para a relação interior, os atributos da junção da tabela exterior são usados para pesquisar o índice hash.
Modelo de Custo NumPaginas: número de páginas de uma tabela NumRegistos: número de registos de uma tabela IRegistos: número de registos no índice F: factor de selectividade combinado para todas as condições de selecção
Modelo de Custo C ext : custo para aceder à tabela exterior C int : custo para aceder à tabela interior C ord_ext : custo para ordenar a tabela exterior (igual a zero, caso já esteja ordenada) C ord_int : custo para ordenar a tabela interior (igual a zero, caso já esteja ordenada) C const_hash : custo para construir o índice hash sobre a tabela interior C hash : custo de uma pesquisa através do índice hash N ext : tamanho da tabela exterior
Bibliografia [Post05a] – The PostgresSQL Global Development Group “PostgresSQL Documentation”, 2005 [SKS06] – Silberschatz, Korth, Sudarshan, “Database System Concepts”, Cap. 13, 14, 26, McGraw-Hill, 5 th edition, 2006 [Fong97] – Zelaine Fong, “The Design and Implementation of the Postgres Query Optimizer”, 1997 [Post05b] – The PostgresSQL Global Development Group, “PostgresSQL Online Documentation”, 2005,