Universidade Federal de Campina Grande Mestrado em Ciência da Computação Disciplina Banco de Dados Multidimensionais Otimização de Consultas em Data Warehouse (DW) Cláudio E. C. Campelo http://claudiocampelo.com Campina Grande – PB , Setembro de 2006 Roteiro • • • • • Motivação; Background; Materialized Views; Query ReWrite; Aproximações; Motivação • Grande quantidade de dados; • Urgência da Informação; • Informações de nível gerencial – agregações; • Tempo de Resposta Aceitável: Cinco Segundos! Background • Modelo Star (Estrela): existe uma tabela dominante no centro, chamada tabela de fatos, com múltiplas junções conectando-a a outras tabelas, sendo estas chamadas de tabelas de dimensão. • Modelo Snow Flake (Floco de Neve): consiste em uma extensão do modelo Estrela onde cada uma das "pontas da estrela" passa a ser o centro de outras estrelas. – Não aconselhável; – Desnormalização (~3FN); Background • OLTP X OLAP Background • Índices BITMAP – Um vetor de bits por valor de atributo; – O tamanho do BITMAP é o número de registros da relação indexada; – Por exemplo, dia da semana teria 7 vetores; – Podemos associar cada bit a faixas de valores, por exemplo 0 to 20.000 reais, 20.000,01 a 35.000 reais; Background • Índices BITMAP – Vantagem: Maior facilidade para manipulação interna de vários BITMAPs para responder uma consulta; – Eficiente em Queries com muitos predicados; – Comando CREATE BITMAP INDEX Background • Query com Índices BITMAP Materialized Views (MV) • Pode contar agregações e junções; • O otimizador decide se usa a MV; • Alterações nas consultas são transparentes ao usuário/desenvolvedor Não é necessário alterar a consulta SQL ou mesmo a aplicação; • Aplicações e ferramentas de query ad hoc podem se beneficiar. Materialized Views (MV) • Interessante quando a quantidade de dados é bem maior que o resultado; • Pode ser útil também quando envolve junções e projeções custosas! Materialized Views (MV) • Quais visões criar para ajudar o otimizador ? • Como prover atualizações eficientes nas MV se os dados base mudam? Dica: Na dúvida se seria necessário, o SQL Access Advisor (Oracle 10g) pode ajudar fazendo uma análise a partir da carga de trabalho (workload); Query ReWrite • Vários tipos possíveis; • A mais óbvia e simples: Quando os textos são iguais; • É necessário aproveitar a mesma MV para várias consultas! Dica: O Explain Plan ajuda a descobrir, através do plano de execução da consulta, os meios de acesso que o Oracle está utilizando para acessar as tabelas do banco de dados. A seguir, mostraremos o resultado exibido pelo Explain Plan, para todas as consultas exibidas como exemplo. Query ReWrite • Transparência: Nosso Exemplo • Esquema em estrela: Agregate Computation • Exemplo 1: MV que computa a soma e o total dos preços das compras por mês, por produto; • Observar a cláusula ENABLE QUERY REWRITE; Agregate Computation • Exemplo 1: CREATE MATERIALIZED VIEW monthly_sales_mv ENABLE QUERY REWRITE AS SELECT t.month, p.product_id, SUM(ps.purchase_price) as sum_of_sales, COUNT (ps.purchase_price) as total_sales FROM time t, product p, purchases ps WHERE t.time_key = ps.time_key AND ps.product_id = p.product_id GROUP BY t.month, p.product_id;uto; Observar a cláusula ENABLE QUERY REWRITE; Agregate Computation • Exemplo 2: Computa a média dos preços das compras por mês, por produto; SELECT t.month, p.product_id, AVG(ps.purchase_price) as avg_sales FROM time t, product p, purchases ps WHERE t.time_key = ps.time_key AND ps.product_id = p.product_id GROUP BY t.month, p.product_id; Agregate Computation • O otimizador pode utilizar a MV monthly_sales_mv para calcular o AVG ! • Explain Plan do Ex. 2: JoinBack • Exemplo 3: Total de compras por mês, por categoria do produto SELECT t.month, p.category, SUM(ps.purchase_price) as sum_of_sales FROM time t, product p, purchases ps WHERE t.time_key = ps.time_key AND ps.product_id = p.product_id GROUP BY t.month, p.category; JoinBack • A categoria não está na MV; • A coluna product_id, chave primária de PRODUCT, está na MV; • O otimizador faz a Junção da MV com PRODUTO para obter a categoria; • Explain Plan do Ex. 3: Query ReWrite Usando Dimensão • Um DW típico que possui hierarquias nas dimensões; • Por exemplo, dia → mês → ano… • Oracle permite criar objetos dimensões com o comando CREATE DIMENSION; • Este objeto não consome espaço além dos metadados; • Oracle assume que o DBA sabe o que está fazendo! Query ReWrite Usando Dimensão • Exemplo de Dimensão Oracle: CREATE DIMENSION time_dim LEVEL time_key IS time.time_key LEVEL month IS time.month LEVEL quarter IS time.quarter LEVEL year IS time.year HIERARCHY calendar_rollup ( time_key CHILD OF month CHILD OF quarter CHILD OF year ) ATTRIBUTE time_key determines (day_of_week, holiday) ATTRIBUTE month determines (month_name); Query ReWrite Usando Dimensão • Exemplo 4: Compras por ano SELECT t.year, p.category, SUM(ps.purchase_price) as sum_of_sales FROM time t, product p, purchases ps WHERE t.time_key = ps.time_key AND ps.product_id = p.product_id GROUP BY t.year, p.category; Query ReWrite Usando Dimensão • O otimizador pode utilizar a MV monthly_sales_mv, uma vez que possui informações sobre a hierarquia; • Utiliza ainda a técnica anterior (JoinBack) para obter os valores da coluna year a partir de month na MV; • Explain Plan do Ex. 4: • Dica: Se o resultado do ReWrite não for o esperado, use a procedure DBMS_MVIEW .EXPLAIN_REWRITE (a partir do Oracle 9i) para ajudar a diagnosticar o problema Query ReWrite Usando Dimensão • A cláusula ATTRIBUTE determina uma ralação um-para-um; • É possível determinar day_of_week a partir de time_key.; • Por exemplo (ver Exemplo 5), calculamos a soma das compras para "January" em cada ano. • Ainda é possível usar a MV monthly_sales_mv ! Query ReWrite Usando Dimensão • Exemplo 5: SELECT t.year, p.category, SUM(ps.purchase_price) as sum_of_sales FROM time t, product p, purchases ps WHERE t.time_key = ps.time_key AND ps.product_id = p.product_id AND t.month_name = 'January‘ • Note que no WHERE há atributos que não estão na MV! Query ReWrite Usando Dimensão • Explain Plan do Ex. 5: Filtered Data • Até agora, vimos exemplos contendo uma MV com todos os dados da tabela PURCHASE; • A partir do Oracle 9i, é possível utilizar reescrever a consulta a partir de uma MV contendo apenas um sobconjunto dos dados! Filtered Data • Nossa MV do Exemplo 1 foi modificada para conter apenas os dados de 1997 a 2002: CREATE MATERIALIZED VIEW five_yr_monthly_sales_mv ENABLE QUERY REWRITE AS SELECT t.month, p.product_id, SUM(ps.purchase_price) as sum_of_sales, COUNT (ps.purchase_price) as total_sales FROM time t, product p, purchases ps WHERE t.time_key = ps.time_key AND ps.product_id = p.product_id AND t.year between 1997 and 2002 GROUP BY t.month, p.product_id; Filtered Data • Agora, o otimizador utiliza esta nova MV caso a consulta seja referente a dados nesse subconjunto, por exemplo a consulta do Exemplo 6 (soma das compras em 2000): SELECT t.month, p.product_id, SUM(ps.purchase_price) as sum_of_sales FROM time t, product p, purchases ps WHERE t.time_key = ps.time_key AND ps.product_id = p.product_id AND t.year = 2000 GROUP BY t.month, p.product_id; Filtered Data • No Oracle 9i, se a condição da consulta não está na MV, ela não é utilizada; • No 10g, ele fornece uma solução híbrida; • Na consulta do Exemplo 7, deseja-se compras mensais de 2000 a 2003; • Neste exemplo, o Oracle 10g usa a MV para os dados de 2000 a 2002; Filtered Data • Explain Plan do Ex. 6: Filtered Data • Exemplo 7: Compras mensais de 2000 a 2003 SELECT t.month, p.product_id, SUM(ps.purchase_price) as sum_of_sales FROM time t, product p, purchases ps WHERE t.time_key = ps.time_key AND ps.product_id = p.product_id AND t.year BETWEEN 2000 and 2003 Filtered Data • Explain Plan do Ex. 7: Stale Materialized Views • O que acontece quando a tabela base é alterada? • A Query ReWrite continua usando a MV? • Depende do parâmetro QUERY_REWRITE_INTEGRITY Stale Materialized Views • Valores possíveis para QUERY_REWRITE_INTEGRITY: – STALE_TOLERATED: Usa a MV mesmo quando a tabela base é alterada; – TRUSTED: Assume que a MV fornecida não é “Staled”. Usado também para declarações em dimensões e constraints; – ENFORCED (Default): Garante os mesmos resultados sempre, ou seja, não usa MV “Staled” ou Relacionamentos TRUSTED; Partition Change Tracking • Oracle9i introduziu o Partition Change Tracking (PCT); • Sabe-se qual parte da MV corrsponde a parte alterada da tabela base; • MV pode continua sendo usada para outras partes! Partition Change Tracking • Exemplo 8: Nossa MV foi alterada, adicionando DBMS_MVIEW.PMARKER CREATE MATERIALIZED VIEW monthly_sales_pct_mv ENABLE QUERY REWRITE AS SELECT DBMS_MVIEW.PMARKER(ps.rowid) pm, t.month, p.product_id, SUM(ps.purchase_price) as sum_of_sales, COUNT (ps.purchase_price) as total_sales FROM time t, product p, purchases ps WHERE t.time_key = ps.time_key AND ps.product_id = p.product_id GROUP BY DBMS_MVIEW.PMARKER(ps.rowid), t.month, p.product_id; Partition Change Tracking • Com a tabela PURCHASES particionada pelo time_key, ao adicionar uma nova partição para Abril de 2003, não afetará a consulta do Exemplo 9 (para março de 2002): SELECT t.month, p.product_id, SUM(ps.purchase_price) FROM time t, product p, purchases ps WHERE t.time_key = ps.time_key AND ps.product_id = p.product_id AND ps.time_key >= TO_DATE('01-03-2002', 'DD-MM-YYYY') AND ps.time_key < TO_DATE('01-04-2002', 'DD-MM-YYYY') GROUP BY t.month, p.product_id; • Oracle 10g adiciona soluções híbridas para esta abordagem! Partition Change Tracking • Explain Plan do Ex. 9: Query Rewrite com várias MVs • Soluções híbridas do Oracle fazem uso não apenas de MV + Tabela Base, mas também de várias MV; • Exemplo: Suponha que temos diversas MVs monthly_sales_1990-1994, monthly_sales_1995_to_2000, monthly_sales_2001_to_2005, etc. Query Rewrite com várias MVs • Exemplo 10: Usa-se as 3 MVs SELECT t.month, p.product_id, SUM(ps.purchase_price) as sum_of_sales, FROM time t, product p, purchases ps WHERE t.time_key = ps.time_key AND ps.product_id = p.product_id AND t.year between 1993 and 2003 GROUP BY t.month, p.product_id; Query Rewrite com várias MVs • Explain Plan do Ex. 10: Query Rewrite com várias MVs • Exemplo 11: Usa-se monthly_sales_1990_to_1994 e monthly_sales_1995_to_2000 e obt’’em os dados de 1989 a partir da tabela base SELECT t.month, p.product_id, SUM(ps.purchase_price) as sum_of_sales FROM time t, product p, purchases ps WHERE t.time_key = ps.time_key AND ps.product_id = p.product_id AND t.year between 1989 and 1999 GROUP BY t.month, p.product_id; Query Rewrite com várias MVs • Explain Plan do Ex. 11: Aproximações • Utilização de amostras estatísticas dos dados; • Técnicas de aproximação podem promover resultados interessantes; • Atributos cuja adição de novos valores não alteram os agregados (Média Salarial); Aproximações • Suponha R sendo uma tabela de fatos e as demais de dimensão; • Colhendo uma amostra R_ de R e então fazendo joins baseados em R_ -> S _, T _; • Se a consulta envolve R, S, T então a query pode retornar bons resultados utilizando R _, S _, T _. Aproximações Aproximações Aproximações Conclusões • • • • Muitas possibilidades de melhorias; Responsabilidades ao DBA! Ferramentas são esseciais; Novas versões do Oracle têm adicionado melhorias consideráveis; Bibliografia Consultada • Oracle 9i Data Warehousing Guide. Junho/2005. • Oracle OLAP Application Developer's Guide 10g Release 2. Agosto/2005. • Oracle Database Performance Tuning Guide 10g Release 2. Junho/2005. • Hillson, Susan et Al. Improve Results with Query Rewrite. Oracle Magazine Setembro/Outubro, 2003. • Shasha, Dennis e Bonnet, Philippe. Data Warehouse Tuning: What’s Different About Data Warehouses. Dbazine, Abril/2005. A partir de Database Tuning: Principles, Experiments, and Troubleshooting Techniques, Morgan Kaufmann Publishers, 2003.