Número:_________________ Nome: _________________________________________ -------------------------------------------------------------------------------------------------------------- INSTITUTO SUPERIOR TÉCNICO Administração e Optimização de Bases de Dados Exame: tipo Junho 2008 -------------------------------------------------------------------------------------------------------------- A duração deste exame é de 2Horas. É 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 1 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) Um datafile não pode simultaneamente ser usado para armazenar os dados e a informação do log de transacções. V b) O commando DBCC showcontig do SQL Server 2005 permite obter estatísticas sobre a utilização da cache. F c) O query hint NOLOCK equivale à utilização do nível de isolamento READ COMMITED. F d) O Database Tuning Advisor do SQL Server 2005 permite obter recomendações relacionadas com o modelo de dados de uma BD, incluindo a utilização de vistas e de esquemas de particionamento. V 1.2.(1v) Indique se as seguintes afirmações são verdadeiras ou falsas. Justifique as falsas. a) O desempenho de um índice do tipo árvore B+ degrada-se com o crescimento da tabela indexada. V b) Mesmo com ambas as relações ordenadas, um merge-join nem sempre é mais eficiente, em termos de I/O, do que um block nested-loop join. V c) Num sistema de recuperação que usa modificação deferida da base de dados, não é necessário guardar no log informação para fazer o undo das operações. V d) A utilização de locks exclusivos e partilhados garante a geração de escalonamentos conflict-serializable. F Número:_________________ Nome: _________________________________________ 3 2. (2v) Sistema de Ficheiros 2.1. (1v) Considere as estruturas de dados Heap File (e.g. uma lista), Sorted File (e.g. uma B+Tree) e Hashed File. Qual delas escolheria para armazenar uma tabela de uma base de dados apresentando os seguintes padrões de acesso: a) Pesquisas muito frequentes por tuplos na tabela com base num intervalo de valores dado para um atributo. b) Pesquisas muito frequentes por tuplos na tabela com base na igualdade de um atributo a um dado valor constante. c) Inserções frequentes na tabela, em conjunto com pesquisas que envolvem a consulta da totalidade dos tuplos armazenados. d) Pesquisas frequentes sobre a tabela, que envolvam cálculos sobre agrupamentos de tuplos. Solução: a) Usando o atributo em questão como chave de pesquisa, um Sorted File seria o mais indicado. b) Usando o atributo em questão como chave de pesquisa, uma Hashed File seria o mais indicado. c) Um Heap file seria o mais indicado neste caso. d) Usando o atributo sobre o qual se vão gerar os agrupamentos como chave de pesquisa, um Hashed File seria o mais indicado. 2.2. (1v) a) Explique em que difere a estratégia RAID 5 da estratégia RAID 4. b) Qual das duas estratégias (RAID 4 ou RAID 5) oferece melhor performance na execução de leituras sequenciais? Justifique a sua resposta. Solução: a) As informações sobre paridade para os dados do array são distribuídas ao longo de todos os discos do array , ao invés de serem armazenadas num disco dedicado, oferecendo assim mais desempenho nas escritas do que o RAID 4 (i.e. evita-se a contenção nas escritas dos blocos de paridade sempre no mesmo disco), e simultaneamente, tolerância a falhas. b) O desempenho geral de um array RAID 5 é equivalente ao de um RAID 4, excepto no caso de leituras sequenciais (i.e. o RAID 5 reduz a eficiência dos algoritmos de leitura sequenciais por causa da distribuição dos blocos de paridade). Número:_________________ Nome: _________________________________________ 4 3. (4v) Índices 3.1. (3v) Considere um índice do tipo árvore B+, em que o número máximo de descendentes de cada nó, N, é 3. a) Desenhe a árvore resultante da inserção dos seguintes valores, pela ordem dada 1 3 10 5 8 14 17 b) Desenhe a árvore resultante da inserção dos valores na alínea (a), mas considerando que N = 4. Em ambas as respostas, deve apresentar a árvore após a inserção de cada elemento, e não apenas a árvore final. Em cada árvore, não é necessário repetir os nós que não mudaram. Solução: 3.1. a) 3.1.b) Número:_________________ Nome: _________________________________________ 5 3.2. (1v) Explique a diferença entre as seguintes estruturas. a) Índices densos vs. indices esparsos (sparse). b) Índices clustered vs. indices unclustered. Neste caso, dê um exemplo de uma situação em que um índice unclustered pode ser preferível a um clustered. Solução: 3.2.a) Num índice denso, todas as chaves são representadas no ficheiro de índice, enquanto que um índice esparso normalmente apenas armazena uma chave por cada bloco de dados (i.e., algumas chaves não vão ser explicitamente armazenadas no ficheiro de índice). 3.2.b) Num índice clustered, os dados são fisicamente armazenados na mesma ordem que as chaves do índice. Num índice unclustered, os dados são físicamente armazenados numa ordem diferente das chaves do índice. Um indice unclustered será preferível para interrogações que se possam executar com index-only plans. Número:_________________ Nome: _________________________________________ 6 4. (4v) Processamento e optimização de interrogações 4.1. (2,5v) Considere duas relações R1(A,B,C) e R2(A,D) em que A é chave primária em ambas. Considere também que: * a relação R1 contém 20000 tuplos, em 200 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) Considerando o algoritmo block nested-loop join, seria mais eficiente, em termos de I/O, executar R1 |x| R2 ou R2 |x| R1? Justifique apresentando os cálculos. Considere o pior caso. c) É sempre mais eficiente usar um block nested-loop join do que um nested-loop join? Justifique a sua afirmação. Solução: 4.1. a) Como A é chave primária, para cada tuplo em R1 vai haver no máximo um tuplo em R2, e vice-versa. O maior resultado terá, portanto, o tamanho da menor relação, i.e., 10000 tuplos. b) Custo do BNLJ = br * bs + br R1 |x| R2 200 * 100 + 200 = 20200 R2 |x| R1 100 * 200 + 100 = 20100 Seria mais eficiente fazer R2 |x| R1 c) Não. - Se R1 e R2 couberem na memória o custo do NLJ é igual ao do BNLJ: br + bs ou - Custo do NLJ = nr * bs + br. Portanto, se nr = br, o custo do NLJ é igual ao do BNLJ. Isto pode acontecer se os tuplos de r têm o tamanho de um bloco. 4.2. (1,5v) Considere as relações r1(A,B,C), r2(C,D,E), e r3(E,F), com chaves primárias A, C, e E, respectivamente. Assuma que r1 tem 1000 tuplos, r2 tem 1500 tuplos, e r3 tem 750 tuplos. Estime o tamanho do resultado de r1 |X| r2 |X| r3, e indique uma estratégia eficiente para calcular a junção. Número:_________________ Nome: _________________________________________ 7 Solução: A relação resultante da junção de r1, r2 e r3 seria a mesma independentemente do modo como fazemos a junção, pois este operador é associativo e comutativo. Calculando o tamanho do resultado baseando-nos na estratégia ((r1 |X| r2) |X| r3): juntando r1 com r2 resulta uma relação com no máximo 1000 tuplos, porque C é chave de r2. Do mesmo modo, efectuando a junção desse resultado com r3 retornará uma relação com 1000 tuplos no máximo, porque E é chave de r3. Assim, cada tuplo de r1|X|r2 corresponde, no máximo, a um tuplo de r3. Ou seja, é o tamanho de r1|X|r2 que estabelece o limite máximo no tamanho do resultado final. Assim, a relação final terá no máximo 1000 tuplos. Uma estratégia eficiente para calcular esta junção seria criar um índice sobre o atributo C da relação r2 e sobre E da relação r3. Depois, para cada tuplo em r1, fazer o seguinte: Usar o índice sobre r2 para procurar, no máximo, um tuplo que corresponda ao valor de C de r1. Usar o índice sobre E para procurar em r3, no máximo, um tuplo que satisfaça o valor único para E em r2. 5. (4v) Transacções, controlo de concorrência e gestão de recuperação Número:_________________ Nome: _________________________________________ 8 5.1. (2v) Considere o seguinte excerto de um log do algoritmo ARIES, lido após uma falha no sistema. 100: T1, start 110: T2, start 120: T1, insert P5, 100 125: checkpoint 130: T4, start 140: T1, delete P6, 120 150: T2, delete P5, 110 170: T4, insert P5, 130 180: T1, end 190: T2, end Os registos de update do log indicam: LSN, "transacção", "operação" "página alterada", lastLSN No momento do checkpoint, foram escritas para o disco as tabelas Dirty Page Table PID PageLSN P5 120 P6 80 Transaction Table RecLSN TID LastLSN 100 T1 120 30 T2 110 O PageLSN das páginas P5 e P6, no disco é, respectivamente, 170 e 30. a) Indique uma razão para que o PageLSN em disco da página P5 seja maior que o seu RecLSN gravado aquando do checkpoint. b) Mostre, em cada passo da fase de análise, o conteúdo das tabelas Dirty Page Table, Transaction Table e Undo List. Em cada passo, indique o LSN que está a ser analisado. Solução: 5.1. a) Para que tal aconteça, deverá ter ocorrido um flush da página P5 após o checkpoint, mais precisamente, após a operação registada no LSN 170. b) 125: DPT = (P5,120,100), (P6,80,30) TT = (T1,120), (T2,110) UL = T1, T2 130: DPT = (P5,120,100), (P6,80,30) TT = (T1,120), (T2,110), *(T4, 130)* UL = T1, T2, *T4* 140: DPT = (P5,120,100), (P6,*140*,30) TT = (T1,*140*), (T2,110), (T4, 130) Número:_________________ Nome: _________________________________________ 9 UL = T1, T2, T4 150: DPT = (P5,*150*,100), (P6,140,30) TT = (T1,140), (T2,*150*), (T4, 130) UL = T1, T2, T4 170: DPT = (P5,*170*,100), (P6,140,30) TT = (T1,140), (T2,150), (T4, *170*) UL = T1, T2, T4 180: DPT = (P5,170,100), (P6,140,30) TT = (T2,150), (T4, 170) UL = T2, T4 190: DPT = (P5,170,100), (P6,140,30) TT = (T4, 170) UL = T4 5.2. (1v) Explique o que se entende por anomalias de dirty reads, non-repetable reads e phantoms. Solução: 5.2. dirty reads - leitura de dados intermédios (i.e. actualizações que ainda não foram "commited") gerados por outra transacção que se executa concorrentemente. non-repetable reads - duas interrogações executadas no contexto de uma mesma transacção devolvem resultados diferentes (i.e. dados commited por outra transacção que se executa concorrentemente). fantasmas - duas interrogações executadas no contexto de uma mesma transacção devolvem conjuntos de resultados de tamanho diferente. 5.3. (1v) Considerando que se usa o nível de isolamento REPEATABLE_READ com TABLE LOCKING, seria possível a ocorrência da anomalia Phantom reads? Justifique porquê. Solução: Os phantom reads não iriam ocorrer porque é feito o locking a toda a tabela. Assim, não é possível a uma transacção inserir novos tuplos nessa tabela sem ter adquirido inicialmente o lock. Número:_________________ Nome: _________________________________________ 10 6. (4v) Database tuning 6.1. (1v) Considere as seguintes interrogações SQL executadas sobre relações: PESSOA(nome,morada) EMPREGADO(nome,categoria,salario). a) select nome from EMPREGADO WHERE nome IN (select nome from PESSOA where morada='Lisboa') b) select nome from EMPREGADO WHERE salario*12 >= 24000 Considere ainda que existem índices clustered sobre o atributo nome nas duas tabelas. Como reescreveria as duas interrogações de a) e b) de modo a tornar a sua execução mais eficiente? Solução: a) select nome from PESSOA P, EMPREGADO E WHERE P.nome=E.nome AND P.morada='Lisboa' b) select nome from EMPREGADO WHERE salario >= 2000 6.2.(3v) Considere o seguinte esquema relacional normalizado correspondente a um subconjunto da base de dados de uma empresa: Empregado (eid, enome, morada, salario, idade, deptid) Departamento(did, dnome, andar, orcamento) 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) Qual o id, nome e morada dos empregados cuja idade pertence a uma determinada gama de valores? b) Qual o id e endereço dos empregados com um determinado nome? c) Qual a média dos salários dos empregados por idade? d) Devolva toda a informação sobre departamentos, ordenada pelos números de andar. e) Qual a soma dos orçamentos de todos os departamentos por andar? 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 non- Número:_________________ Nome: _________________________________________ 11 clustering, e se a interrogação pode ser respondida só com a informação do índice (index-only plan). Solução: a) select E.eid, E.ename, E.address from Emp E where age > k1 and age > k2 -- k1 e k2 são constantes inteiras Clustered B+ tree index sobre Emp<age> b) select E.eid, E.address from Emp E where E.ename = ‘ABC’ -- ‘ABC’ é nome de pessoa Unclustered hash index sobre Emp<ename>, Se existem muitos empregados chamados ‘ABC’, então clustered é melhor. c) select age, avg(sal) from Emp group by age Unclustered B+tree sobre Emp<age,sal> (=> index-only plan), Se index-only plans não são suportados, clustered B+tree sobre Emp<age> d) select * from Dept order by floor Clustered B+ tree sobre Dept<floor> e) select floor, sum(budget) from Dept group by floor Unclustered index sobre Dept<floor,budget> (=> index-only plan), Se index-only plans não forem suportados, clustered B+tree sobre Dept<floor>