Departamento de Engenharia Informática 2010/2011 Administração e Optimização de BDs Mini-Projecto 4 A entregar a 28 de Maio de 2011 2º semestre A resolução deverá ser identificada com o número de grupo e entregue electronicamente no sistema Fénix e na aula. 1 Considere o esquema relacional da figura abaixo para uma base de dados de produtos. A figura mostra (a) o diagrama ER e (b) o esquema relacional correspondente: (a) (b) 1.1 - Para cada um dos seguintes casos, e imaginando que as interrogações correspondentes se executam com muita frequência na base de dados, indique uma possível optimização ao nível do esquema (e.g., adição de novos atributos sobre relações existentes, criação de novas relações, particionamento de relações, etc). a) Encontrar todos os fornecedores de Portugal (tabelas SUPPLIER e NATION) b) Encontrar as facturas com valor superior a 10.000 resultantes da venda de apenas um produto (tabelas LINEITEM e ORDERS) c) Apurar quais os itens (atributos PARTKEY e SUPPKEY) que demoraram mais de um mês a serem enviados (recorrendo aos atributos SHIPDATE e RECEIPTDATE na tabela LINEITEM) 1.2 Para cada um dos casos anteriores, explicite claramente qual o principal benefício obtido através da optimização de esquema sugerida. IST/DEI Pág. 1 de 2
1.3 Para cada um dos casos anteriores, explicite um potencial problema introduzido pela optimização sugerida. 2 Para cada uma das interrogações da Pergunta 1, considerando ainda as optimizações ao nível do esquema sugeridas na resolução da Pergunta 1, indique quais os mecanismos oferecidos pelo SQL Server 2008 que podem ser empregues na sua implementação. Justifique a sua resposta. 3 - Considere o esquema relacional da Pergunta 1 e a seguinte interrogação que obtém o último item facturado de cada encomenda que foi devolvida. SELECT MAX(LINENUMBER) FROM LINEITEM L2 WHERE RETURN = YES GROUP BY ORDER_KEY Indique claramente todos os índices que poderiam ser utilizados (i.e., quais os atributos chave do índice, atributos incluídos, tipo do índice, etc.) para melhorar o desempenho nesta consulta, justificando a sua resposta. Apresente ainda as instruções SQL associadas à criação do(s) índice(s) necessários. 4 Considere que após uma falha num SGBD relacional, o log de recuperação continha a seguinte informação: LSN 0 BEGIN CHECKPOINT 5 END CHECKPOINT 10 T1 UPDATE P1 (mudar valor de P1 de v1 para v2) 15 T1 UPDATE P2 (mudar valor de P2 de v3 para v4) 20 T2 UPDATE P3 (mudar valor de P3 de v5 para v6) 25 T1 COMMIT 30 T2 UPDATE P1 (mudar valor de P1 de v2 to v7) Considere ainda que, aquando do checkpoint, a dirty page table e a active transaction table se encontravam vazias. Execute os passos do algoritmo ARIES, por forma a recuperar da falha do sistema, indicando claramente quais as actualizações que são realizadas a cada passo de execução do algoritmo ARIES (i.e., a cada um dos passos envolvidos na fase de análise, redo e undo). IST/DEI Pág. 2 de 2
Abaixo encontram-se as resoluções para os problemas propostos no mini-projecto 4. Resolução do Problema 1 Pergunta 1.1 a) Encontrar todos os fornecedores de Portugal (tabelas SUPPLIER e NATION) b) Encontrar as facturas com valor superior a 10.000 resultantes da venda de apena um produto (tabelas LINEITEM e ORDER) c) Apurar quais os itens que demoraram mais de um mês a serem enviados (recorrendo aos atributos SHIPDATE e RECEIPTDATE na tabela LINEITEM) 1.1 a) Adicionar o atributo Nation à relação SUPPLIER por forma a evitar o custo associado à operação de junção (i.e., desnormalização por adição de atributo redundante) 1.1 b) Juntar as relações LINEITEM e ORDERS numa única relação, por forma a evitar o custo associado à operação de junção (i.e., desnormalização por colapsar de tabelas) 1.1 c) Particionamento vertical da relação LINEITEM, obtendo-se uma relação com a informação principal e outra com os detalhes referentes às datas. Isto corresponde a uma desnormalização por particionamento vertical de relação. Pergunta 1.2 1.2 a) A optimização 1.1 a) permite evitar o custo associado à operação de junção entre as tabelas envolvidas na interrogação. 1.2 b) Permite evitar o evitar o custo associado à operação de junção entre as tabelas envolvidas na interrogação. 1.2 c) A optimização 1.1 c) permite evitar a leitura de atributos desnecessários, diminuindo-se o número de operações de I/O. Pergunta 1.3 1.3 a) A optimização 1.1 a) envolve a alteração do esquema lógico da base de dados (algumas queries terão de ser alteradas), introduzindo ainda a possibilidade de termos informação redundante e inconsistente na base de dados. IST/DEI Pág. 3 de 2
1.3 b) A optimização 1.1 b) envolve a alteração do esquema lógico da base de dados (algumas queries terão de ser alteradas), embora não se tenham problemas de introdução de informação redundante ou potencialmente inconsistente. Existe ainda o problema de passarmos a ter tuplos maiores, o que leva a que algumas queries passem a ter um custo maior em termos de operações de I/O. 1.3 c) Queries que envolvam apenas a relação LINEITEM terão de ser re-escritas. Resolução do Problema 3 Criação de um indíce clustered sobre order_key para permitir a formação eficiente dos grupos e depois sobre line_number para permitir o cálculo eficiente do operador de agregação MAX. Finalmente deve ter cobertura do atributo return para evitar o acesso à tabela. create clustered index idx_shipmode on lineitem(order_key asc, line_number desc) include (return); Nota: Tendo em conta a errata publicada na página da cadeira, também seria aceite a solução: create clustered index idx_shipmode on lineitem(order_key asc, line_number desc) Resolução do Problema 4 Análize Analizar o log de recuperação passo a passo, com início no LSN 0. LSN 5: Inicializar a tabela XACT e a DPT como vazias. LSN 10: Adicionar (T1, LSN 10) na tabela XACT. Adicionar (P1, LSN 10) na DPT. LSN 15: Colocar LastLSN=15 para a T1 na tabela XACT. Adicionar (P2, LSN 15) na DPT. LSN 20: Adicionar (T2, LSN 20) na tabela XACT. Adicionar (P3, LSN 20) na DPT. LSN 25: Alterar o estado da T1 para "Commit" na tabela XACT LSN 30: Colocar LastLSN=30 para T2 na tabela XACT Redo: Analizar o log de recuperação passo a passo, com início no LSN 10. LSN 10: Ler a página P1 e verificar o PageLSN nela armazenado. Se PageLSN<10, redo LSN 10 (colocar valor a v2) e colocar o PageLSN=10. LSN 15: Ler a página P2 e verificar o PageLSN nela armazenado. Se PageLSN<15, redo LSN 15 (colocar valor a v4) e colocar o PageLSN=15. LSN 20: Ler a página P3 e verificar o PageLSN nela armazenado. Se PageLSN<20, redo LSN IST/DEI Pág. 4 de 2
20 (colocar valor a v6) e colocar o PageLSN=20. LSN 30: Ler a página P1 se a mesma tiver sido flushed e verificar o PageLSN na mesma, o qual será de 10. Fazer redo LSN 30 (colocar o valor a v7) e colocar o PageLSN=30. Undo: A transacção T2 deve ser desfeita. Colocar LSN 30 na lista ToUndo. Escrever um registo de Abort para T2 no log LSN 30: Fazer Undo correspondente a LSN 30 e escrever um registo CLR para P1 com "set P1=v2" e undonextlsn=20. Escrever v2 na página P1. Colocar LSN 20 na lista ToUndo. LSN 20: Fazer Undo correspondente a LSN 20 e escrever um registo CLR para P3 com "set P3=v5" e undonextlsn=null. Escrever v5 na página P3. IST/DEI Pág. 5 de 2