Departamento de Engenharia Informática 2007/2008 Bases de Dados 1º semestre Lab 8: Índices 1. Descarregue o ficheiro lab08.zip para este lab e descompacte para um directório local. 2. Abra uma linha de comando Postgres e entre no sistema. 3. Execute o script SQL com a instrução: \i lab08.sql 4. Ligue‐se à base de dados lab8 criada pelo script que acabou de correr. Pode usar o comando \l ('L' minúsculo) para listar todas as bases de dados existentes no sistema. Para se ligar a uma dessas bases de dados use o comando \c 5. Execute o comando \d para obter informação sobre as tabelas existentes nessa base de dados. 6. Execute o comando \d account para obter informação sobre a tabela account. Repare nos índices já existentes. Por omissão, o sistema cria um índice para a chave primária de uma tabela. Que tipo de índice se trata? 7. Execute o comando \timing para que o Postgres passe a mostrar informação sobre o tempo de execução das operações. Se executar o comando duas vezes, o sistema volta a desligar a temporização. Verifique que a temporização fica ligada. 8. Execute a seguinte consulta: SELECT * FROM account WHERE account_number='A‐012345'; Aponte o tempo que o sistema demora a executar este comando. Como explica este resultado? 9. Apague a chave primária da tabela com o comando: ALTER TABLE account DROP CONSTRAINT account_pkey; onde account_pkey é o nome que o Postgres dá à restrição de integridade representada pela chave primária. 10. Repita a alínea 8 e aponte o tempo. Como explica este resultado? 11. Volte a colocar a chave primária na tabela com o comando: ALTER TABLE account ADD PRIMARY KEY(account_number); Aponte o tempo que o sistema demora a executar este comando. Como explica este resultado? 12. Repita a alínea 8 e aponte o tempo. Como explica a eventual diferença de tempo face à alínea 10? 13. Escreva uma consulta para obter todas as contas com saldo igual a 1000 €. Execute a consulta e aponte o tempo que o sistema demora a executar este comando. IST/DEI Pág. 1 de 2 BD 14. Crie um índice para a coluna balance com o comando: CREATE INDEX balance_idx ON account (balance); Este índice é primário ou secundário? Porquê? 15. Repita a alínea 13 e aponte o tempo. Como explica a eventual diferença de tempo face à alínea 13? 16. O resultado da consulta devolve várias contas. Como é que explica que seja possível indexar vários registos de uma vez só? 17. Apague o índice criado na alínea 14: DROP INDEX balance_idx; 18. Crie um índice apenas para o conjunto de contas com saldo igual a 1000 €: CREATE INDEX balance_idx ON account (balance) WHERE balance=1000; Este índice é denso ou esparso? Porquê? 19. Repita a alínea 13 e aponte o tempo. 20. Repita a alínea 13 mas agora para contas com saldo igual a 1001 €. Como explica a eventual diferença de tempo face à alínea 19? Considere a seguinte árvore B+: 1. Desenhe o resultado após inserção do elemento 9 na árvore da figura. 2. Desenhe o resultado após inserção do elemento 3 na árvore da figura. 3. Desenhe o resultado após a remoção do elemento 8 da árvore da figura. Se necessitar de redistribuir elementos, redistribua‐os com o nó vizinho à esquerda. 4. Desenhe o resultado após a remoção do elemento 8 da árvore da figura. Se necessitar de redistribuir elementos, redistribua‐os com o nó vizinho à direita. 5. Desenhe o resultado se a partir da árvore da figura for inserido o elemento 46 e de seguida for removido o elemento 52. 6. Desenhe o resultado após a remoção do elemento 91 da árvore da figura. IST/DEI Pág. 2 de 2