Número:_________________ Nome: _________________________________________ 1 -------------------------------------------------------------------------------------------------------------- INSTITUTO SUPERIOR TÉCNICO Administração e Optimização de Bases de Dados Exame 1 - Solução 21 Junho 2008 -------------------------------------------------------------------------------------------------------------- A duração deste exame é de 2 Horas. É um exame com consulta. O número total de pontos é 20. Marque as suas respostas NA FOLHA DE EXAME. Escreva o seu número e nome no topo de cada página. Escreva todas as fórmulas. Para o uso oficial somente 1 2 2 2 3 4 4 4 5 4 6 4 SUM 20 Número:_________________ Nome: _________________________________________ 2 1. (2v) Miscelânia 1.1 (1v) Relativamente ao SQL Server 2005, indique nas alíneas seguintes quais as verdadeiras e as falsas. a) A opção QUERY GOVERNOR do SQL Server 2005 permite influenciar optimizador de queries no sentido de escolher determinado plano de execução. F b) O comando SET STATISTICS IO do SQL Server 2005 indica ao sistema que este deve actualizar a informação estatística sobre o número de acessos efectuado aos objectos da base de dados. F c) O SQL Server 2005 permite a utlização de um query hint HASH GROUP que força a utilização de um algoritmo de join para o cálculo de agrupamentos. V d) O SQL Server 2005 armazena planos de execução em cache. V 1.2.(1v) Indique se as seguintes afirmações são verdadeiras ou falsas. Justifique as falsas. a) O protocolo strict-2PL não dá garantias sobre a possível ocorrência de deadlocks. V b) O nível de isolamento REPETABLE READ está sujeito a anomalias do tipo dirty reads. F c) Se duas expressões de algebra relacional são equivalentes, então têm o mesmo custo associado ao seu processamento.. F d) Para executar uma selecção com apenas uma condição do tipo a<>b, é mais eficiente usar um índice do tipo hash do que uma árvore B+. F Número:_________________ Nome: _________________________________________ 3 2. (2v) Sistema de Ficheiros 2.1. (1v) Cada base de dados do SQL Server 2005 pode conter vários datafiles. Estes datafiles podem ainda estar organizadas em um ou vários filegroups. Indique os benefícios envolvidos em: a) Ter uma base de dados com dois datafiles, ambos num único filegroup primário. b) Ter uma base de dados com dois datafiles, cada um deles num filegroup separado. Solução: a) Tendo dois datafiles, a base de dados pode ser particionada, possibilitando por exemplo a criação de bases de dados com um volume de dados superior ao espaço de armazenamento disponível num único disco rígido, ou a execução em paralelo de algumas operações. Cabe no entanto ao SGBD decidir pela melhor forma de parcicionar os dados, tipicamente com vista a equilibrar o espaço utilizado nas duas datafiles. b) Tendo dois filegroups, o administrador da base de dados tem mais flexibilidade na gestão do particionamento da base de dados. Torna-se possível colocar explicitamente particções de uma tabela ou de um índice num dado filegroup. 2.2. (1v) Considere a seguinte BD relacional com duas relações: disciplina(nome-disc, sala, docente) inscricao(nome-disc, nome-aluno, nota) Defina instâncias destas relações para três disciplinas, em que cada uma tem inscritos cinco alunos. Apresente uma estrutura de ficheiros dessas relações que utilize clustering. Solução: relação Disciplina ================== nome-disc | sala | docente --------------------------------------------------Pascal | CS-101 | Calvin, B C | CS-102 | Calvin, B LISP | CS-102 | Kess, J relação Inscricao ================= nome-disc | nome-aluno | nota | --------------------------------------------Pascal | Carper, D |A | e1 Pascal | Merrick, L | A | e2 Pascal | Mitchell, N | B | e3 Pascal | Bliss, A |C | e4 | | c1 | c2 | c3 Número:_________________ Nome: _________________________________________ Pascal C C C C C Lisp Lisp Lisp Lisp Lisp | Hames, G | Nile, M | Mitchell, N | Carper, D | Hurly, I | Hames, G | Bliss, A | Hurly, I | Nile, M | Stars, R | Carper, D |C |A |B |A |B |A |C |B |D |A |A | e5 | e6 | e7 | e8 | e9 | e10 | e11 | e12 | e13 | e14 | e15 Página 0 contém: c1, e1, e2, e3, e4, and e5 Página 1 contém: c2, e6, e7, e8, e9 and e10 Página 2 contém: c3, e11, e12, e13, e14, and e15 4 Número:_________________ Nome: _________________________________________ 5 3. (4v) Índices 3.1. (3v) Considere um índice hash do tipo extendable hashing, onde cada bucket armazena 2 valores. Considere que é usada a função de dispersão: h(x) = x mod 3 Mostre a estrutura obtida pela inserção dos valores 3, 8, 15, 17, 19 e 5 Deve apresentar a estrutura após a inserção de cada elemento, e não apenas o resultado final. Em cada passo, não é necessário repetir os buckets que não mudaram. Solução: a) 3.2. (1v) Explique porque é que uma estrutura de índice baseada em hash não é a melhor escolha para uma chave de procura sobre a qual são executadas interrogações de intervalo (range queries)? Solução: Uma interrogação com intervalo não pode ser respondida de forma eficiente usando um índice baseado em hash porque teria que ler todos os buckets. Isto acontece porque os valores da chave de procura no intervalo não ocupam posições contíguas nos buckets. Em vez disso, os valores estão distribuídos uniformemente e aleatoriamente por todos os buckets. Número:_________________ Nome: _________________________________________ 6 4. (4v) Processamento e optimização de interrogações 4.1. (3v) Considere duas relações R1(A,B) e R2(A,C) em que A é chave primária em R1 e C é a chave primária em R2. Considere também que * a relação R1 contém 20000 tuplos, em 300 blocos * a relação R2 contém 10000 tuplos, em 100 blocos a) Estime, justificando, o tamanho máximo em tuplos da relação resultante da operação: R1 |x| R2. b) Assuma que apenas a relação R2 está ordenada pelo atributo A. Assuma também que apenas cabem 3 blocos de cada vez em memória. Calcule o custo, em termos de I/O, de realizar um merge join para R1 |x| R2. c) Assuma que o atributo B é chave primária em R1 e que o atributo C é chave primária em R2. Neste caso, qual seria o tamanho máximo da relação resultante? Justifique. Solução: a) Como A é chave primária em R1, para cada tuplo em R2 vai haver no máximo um tuplo em R1. O resultado terá, portanto, no máximo 10000 tuplos. b) Custo de ordenar a relação R1 = br*(2*ceil(log_{M-1}(br/M))+1) = 300*(2*ceil(log_{2}(300/3))+1) = 300*(2*ceil(log_{2}(100))+1) = 300*(2*7+1) = 300*15 = 4500 Custo do merge-sort = br + bs = 400 Custo total = br + bs + ordenar R2 = 400 + 4500 = 4900 c) No pior caso, cada tuplo de R1 corresponderia a todos os tuplos de R2 e, portanto, a relação final teria 20000x10000 = 200.000.000 tuplos. Isto aconteceria se todos os tuplos de R1 e de R2 tivessem o mesmo valor no atributo A. Número:_________________ Nome: _________________________________________ 7 4.2. (1v) Indique duas possíveis heurísticas para a selecção de planos de execução. Para cada uma explique a sua utilidade e em que casos, se existirem, ela pode não ser útil. Solução: 1. Executar selecções o mais cedo possível. Diminui o tamanho das tabelas o mais cedo possível, para diminuir a complexidade das operações seguintes. Não é útil se a selecção é pouco específica (i.e., se escolhe quase todos os tuplos da relação). Pode piorar o resultado se tivermos uma selecção sobre um join, em que se o join for executado primeiro, a tabela resultante é muito menor (assumindo que o join pode ser feito com eficiência). 2. Executar as projecções o mais cedo possível. Diminui o tamanho das tabelas o mais cedo possível, para diminuir a quantidade de dados usada nas operações seguintes. Pode não ser útil se a projecção elimina atributos com índices que podiam ser usados em operações posteriores. Número:_________________ Nome: _________________________________________ 8 5. (4v) Transacções, controlo de concorrência e gestão de recuperação 5.1. (3v) Considere o seguinte escalonamento de transacções, o qual apresenta instruções de locking binárias (i.e. lock/unlock). Trans T1 1 Lock(X) 2 Read(X) 3 4 5 X=X+1 6 7 8 9 10 11 12 Write(X) 13 Unlock(X) 14 15 16 17 18 19 20 Lock(Z) 21 Read(Z) 22 23 24 Z=Z+3 25 26 27 28 29 Write(Z) 30 Unlock(Z) Trans T2 Trans T3 Lock(Y) Read(Y) Lock(Z) Read(Z) Y=Y-1 Write(Y) Unlock(Y) Z=Z+1 Write(Z) Unlock(Z) Lock(Y) Read(Y) Lock(X) Read(X) X=X+2 Y=Y+3 Write(X) Unlock(X) Write(Y) Unlock(Y) a) Liste três conflitos que podem surgir no escalonamento apresentado. b) Apresente o grafo de precedências para o escalonamento apresentado e indique se o escalonamento é conflict-serializable. c) O escalonamento apresentado obedece ao protocolo two-phase locking (2PL). Explique porquê. d) Apresente um escalonamento alternativo para as 3 transacções que obedeça ao protocolo 2PL e que faça uso de locks exclusivos e partilhados (i.e. lock-s/lock-x/unlock). Indique ainda, justificando, se o escalonamento apresentado seria conflict-serializable. Número:_________________ Nome: _________________________________________ 9 Solução: a) conflito entre 2:T1:Read(X) e 25:T2:Write(X) conflito entre 4:T2:Read(Y) e 27:T3:Write(Y) conflito entre 7:T3:Read(Z) e 29:T1:Write(Z) conflito entre 9:T2:Write(Y) e 17:T3:Read(Y) e 27:T3:Write(Y) conflito entre 14:T3:Write(Z) e 21:T1:Read(Z) e 29:T1:Write(Z) conflito entre 17:T3:Read(Y) e 9:T2:Write(Y) conflito entre 19:T2:Read(X) e 12:T1:Write(X) conflito entre 21:T1:Read(Z) e 15:T3:Write(Z) conflito entre 25:T2:Write(X) e 2:T1:Read(X) e 12:T1:Write(X) conflito entre 27:T3:Write(Y) e 4:T2:Read(Y) e 9:T2:Write(Y) conflito entre 29:T1:Write(Z) e 7:T3:Read(Z) e 14:T3:Write(Z) b) Grafo com arcos de t1->t2, t2->t3, t3->t1. Não é conclict-serializable, pois o grafo apresenta um ciclo. c) Não, pois as transacções libertam os locks que tinham adquirido e seguidamente tentam adquirir novos locks. d) O novo escalonamento (e.g. executar primeiro T1, depois T2 e finalmente T3) seria conflict-serializable, pois o protocolo 2PL garante esta propriedade (neste caso estamos mesmo a propor um escalonamento série, embora pudessem existir outros). T1: Lock-S(X); R(X); X=X+1; Lock-X(X); W(X); Lock-S(Z); R(Z); Z=Z+3; LockX(Z); W(Z); Unlock(Z); Unlock(X) T2: Lock-S(Y); R(Y); Y=Y-1; Lock-X(Y); W(Y); Lock-S(X); R(X); X=X+2; LockX(X); W(X); Unlock(X); Unlock(Y) T3: Lock-S(Z); R(Z); Z=Z+1; Lock-X(Z); W(Z); Lock-S(Y); R(Y); Y=Y+3; LockX(Y); W(Y); Unlock(Y); Unlock(Z) 5.2. (1v) Explique a diferença entre a técnica de escrita diferida (deferred database modification) e a técnica de escrita imediata (immediate modification) da base de dados. Qual é usada pelo algoritmo ARIES? Solução: Na técnica de escrita diferida, todas as operações são registadas no log, mas as alterações não são imediatamente propagadas para a base de dados. Assim, na ocorrência de uma falha, não é necessário desfazer nenhuma operação, mas apenas refazer as que se encontram registadas. Na técnica de escrita imediata, todas as alterações aos dados são imediatamente propagadas para a base de dados, após o seu registo no log. Assim, na ocorrência de uma falha, algumas operações terão que ser desfeitas. O algoritmo Aries usa a técnica de escrita imediata. Número:_________________ Nome: _________________________________________ 10 6. (4v) Database tuning 6.1(1v) Considere a seguinte relação normalizada, que lista os ids, tipos, e custos de várias peças, além da quantidade existente em stock: Peças(pid, tipo, custo, quantidade) Existem duas interrogações extremamente importantes: - Qual o número de peças disponíveis por tipo de peça. - Quais os identificadores de peças com o custo mais alto? a) Qual o tipo de estrutura de ficheiro que escolheria para guardar os registos de Peças e que índices criaria? b) Suponha que os clientes se queixam continuamente que o tempo de resposta às duas interrogações não é satisfatótio face à sua escolha da alínea a). Como não tem dinheiro para comprar mais HW ou SW, tem que considerar redesenhar o esquema de outra maneira. Explique como tentaria obter melhor desempenho usando outro esquema (por exemplo, outras relações), que organização de ficheiros escolheria e que índices sobre as relações. Solução: a) Pode ser usado um heap file para a relação Peças. Para responder de forma eficiente às interrogações, podem ser criados: um índice denso unclustered B+tree sobre (tipo, quantidade) e uma B+tree densa unclustered sobre (custo, pid). b) O problema pode existir porque o optimizador não está a considerar os index-only plans que podem ser obtidos usando o esquema prévio. Assim, podemos então criar índices clustered sobre (pid, custo) e (pnome, quantidade). Para fazer isso, é necessário particionar verticalmente a relação em duas: Peças1(pid, custo) Peças2(pid, tipo, quantidade). Se, mesmo assim os índices não funcionarem, pode ser usada a organização de ficheiro ordenada para estas duas relações. Número:_________________ Nome: _________________________________________ 11 6.2.(3v) Considere o seguinte esquema relacional normalizado correspondente a um subconjunto da base de dados de uma empresa: Projecto(pno, pname, pdept, pgestor, topico, orcamento) Gestor(gid, gname, gdept, salario, idade, sexo) Cada projecto tem como base um departamento, cada gestor pertence a um determinado departamento, e o gestor de um projecto não tem que pertencer ao mesmo departamento no qual o projecto tem base. Suponha que sabe que as seguintes interrogações são as mais frequentes e que são igualmente equivalentes em frequência e importância: a) Quais os nomes de todos os projectos com gestores cujas idades pertencem a uma determinada gama de valores? b) Qual o nome do projecto com orçamento mais baixo? c) Qual o orçamento total dos projectos geridos por cada gestor? d) Qual o número de gestores masculinos? e) Qual a idade média dos gestores? Assumindo que estas interrogações são mais importantes do que quaisquer actualizações, escreva as interrogações correspondentes em SQL, e diga quais os atributos que devem ser indexados, que tipo de índice deve ser usado (B+tree ou hash-based), se é clustering ou nonclustering, e se a interrogação pode ser respondida só com a informação do índice (index-only plan). Solução: a) select P.proj_name from Projecto P, Gestor G where P.pgestor =G.gid and G.idade < 30 Unclustered B+ tree sobre Gestor<idade, gid> (=> index-only plan) e Unclustered hash index sobre Projecto<pgestor> . Se index-only plan não suportado, clustered B+ tree sobre Gestor<idade> e o mesmo sobre Projecto. b) select P.pnome from Projecto P where P.orcamento = (select min(P1.orcamento) from Projecto P1) Unclustered B+tree sobre Projecto<orcamento> c) select pgestor, sum(orcamento) Número:_________________ Nome: _________________________________________ 12 from Projecto group by pgestor Unclustered B+ tree sobre Projecto<pgestor, orcamento> (=> index-only plan), Se index-only plan não é suportado, então clustered index sobre Projecto<pgestor> d) select count(*) from Gestor where sexo = ‘M’ Unclustered hash index sobre Gestor<sexo> (=>index-only scan para contar) Se index-only plan não é suportado, então nenhum índice torna esta query mais rápida. e) select avg(idade) from Gestor Unclustered hash index sobre Gestor<idade> (=> index-only scan para calcular a média). Se index-only plan não é suportado, então nenhum índice torna esta query mais rápida.