correcção do 4º mini-projecto aobd 2007-2008. pergunta 1 /* t1: 1 transacção por hora */ begin...

23
Correcção do 4º Mini- Projecto AOBD 2007-2008

Upload: renato-thomaz-sa-cerveira

Post on 07-Apr-2016

212 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Correcção do 4º Mini-Projecto AOBD 2007-2008. Pergunta 1 /* T1: 1 transacção por hora */ BEGIN TRANSACTION select avg(lugares_disponíveis) from ( select

Correcção do 4º Mini-Projecto AOBD

2007-2008

Page 2: Correcção do 4º Mini-Projecto AOBD 2007-2008. Pergunta 1 /* T1: 1 transacção por hora */ BEGIN TRANSACTION select avg(lugares_disponíveis) from ( select

Pergunta 1

/* T1: 1 transacção por hora */BEGIN TRANSACTIONselect avg(lugares_disponíveis) from ( select

numero_espetaculo, count(numero_lugar) as lugares_disponíveis from SalaEspetaculos where lugar_ocupado = false group by numero_espetaculo );

COMMIT

/* T2: 100 transacções por segundo */BEGIN TRANSACTIONselect numero_lugar from SalaEspetaculos where

lugar_ocupado = false and numero_espetaculo = ‘ABC123’;

/* código para interagir com utilizador por forma a ele escolher um lugar (@lugar) */

update SalaEspetaculos set lugar_ocupado = true where numero_espetaculo = ‘ABC123’ and numero_lugar = @lugar;

COMMIT

• Considere o SGBD SQL Server 2005, embora limitado à utilização dos níveis de isolamento serializable e snapshot. Considere ainda o seguinte esquema relacional:

SalaEspetaculos(numero_espetaculo, localidade, numero_lugar, lugar_ocupado)

• A tabela contém cerca de 1,000,000 tuplos, correspondendo a cerca de 500 espetáculos com 2,000 lugares para cada. Considere ainda as seguintes transacções sobre o sistema:

• Descreva em Português, por palavras suas, o que se pretende obter com a transacção T1

Page 3: Correcção do 4º Mini-Projecto AOBD 2007-2008. Pergunta 1 /* T1: 1 transacção por hora */ BEGIN TRANSACTION select avg(lugares_disponíveis) from ( select

Resposta para pergunta 1

• A transacção T1 vai consultar o conjunto de todos os concertos e retornar o número médio de lugares ainda disponíveis.

Page 4: Correcção do 4º Mini-Projecto AOBD 2007-2008. Pergunta 1 /* T1: 1 transacção por hora */ BEGIN TRANSACTION select avg(lugares_disponíveis) from ( select

Pergunta 2.1

• Em termos de controlo de concorrência, qual o problema existente com a transacção T2?

Page 5: Correcção do 4º Mini-Projecto AOBD 2007-2008. Pergunta 1 /* T1: 1 transacção por hora */ BEGIN TRANSACTION select avg(lugares_disponíveis) from ( select

Resposta para pergunta 2.1

• O problema existente relaciona-se com a interacção com o utilizador realizada a meio da transacção, que introduz contenção no acesso à tabela.

Page 6: Correcção do 4º Mini-Projecto AOBD 2007-2008. Pergunta 1 /* T1: 1 transacção por hora */ BEGIN TRANSACTION select avg(lugares_disponíveis) from ( select

Pergunta 2.2

• Em termos do isolamento e da contenção no acesso aos dados, este problema manifesta-se de forma igualmente importante nos dois níveis de isolamento suportados pelo SGBD (i.e. serializable e snapshot)? Justifique a sua resposta.

Page 7: Correcção do 4º Mini-Projecto AOBD 2007-2008. Pergunta 1 /* T1: 1 transacção por hora */ BEGIN TRANSACTION select avg(lugares_disponíveis) from ( select

Resposta para pergunta 2.2• No nível de isolamento "serializable" os locks são mantidos

até ao fim da transacção. A interacção com o utilizador pode demorar um periodo arbitrário de tempo, durante o qual existem recursos que se encontram "locked".

• Com o nível de isolamento "snapshot," cada transacção vai executar as suas alterações numa cópia local dos dados. O problema da contenção não se manifesta, mas por outro lado existe uma forte probabilidade de termos reservas efectuadas em duplicado (i.e. durante o período de interacção com o utilizador, outra transacção faz a reserva para o mesmo lugar).

Page 8: Correcção do 4º Mini-Projecto AOBD 2007-2008. Pergunta 1 /* T1: 1 transacção por hora */ BEGIN TRANSACTION select avg(lugares_disponíveis) from ( select

Pergunta 2.3

• Como se poderia resolver o problema? Descreva potenciais problemas introduzidos pela solução proposta.

Page 9: Correcção do 4º Mini-Projecto AOBD 2007-2008. Pergunta 1 /* T1: 1 transacção por hora */ BEGIN TRANSACTION select avg(lugares_disponíveis) from ( select

Resposta para pergunta 2.3• Uma forma de resolver o problema seria deixar na

transacção T2 apenas o código responsável pela reserva do lugar, retirando-se a interacção com o utilizador. Contudo, isto pode trazer o problema de se fazerem reservas para lugares que já não se encontram disponíveis. A aplicação teria de verificar, aquando da reserva do lugar, que o mesmo continua disponível, havendo a possibilidade de ocorrerem rollbacks.

• Outra solução possível seria atribuir o lugar automaticamente, em lugar de permitir que seja o utilizador a fazer a escolha (semelhante à transacção T2' apresentada no enunciado).

Page 10: Correcção do 4º Mini-Projecto AOBD 2007-2008. Pergunta 1 /* T1: 1 transacção por hora */ BEGIN TRANSACTION select avg(lugares_disponíveis) from ( select

Pergunta 3.1

• Que indice(s) seria(m) apropriado(s) para a execução eficiente da transação T1? E para a transacção T2? O(s) mesmo(s) indice(s) seria(m) vantajoso(s) para a execução das duas transacções? Justifique a sua resposta.

Page 11: Correcção do 4º Mini-Projecto AOBD 2007-2008. Pergunta 1 /* T1: 1 transacção por hora */ BEGIN TRANSACTION select avg(lugares_disponíveis) from ( select

Resposta para pergunta 3.1

• Um índice clustered na coluna numero_espetaculo, o qual seria simultaneamente útil para a querie na transacção T1 e para a querie/update realizado em T2.

• Outra resposta possível seria um índice clustered nas colunas (lugar_ocupado, numero_espetaculo), ainda que esta não seja tão interessante devido à manutenção acrescida.

Page 12: Correcção do 4º Mini-Projecto AOBD 2007-2008. Pergunta 1 /* T1: 1 transacção por hora */ BEGIN TRANSACTION select avg(lugares_disponíveis) from ( select

Pergunta 3.2

• Considere o nível de isolamento serializable e assuma que não existem indices que possam ajudar à execução da transacção T1 (i.e. a query é sempre executada com base num table scan). Indique qual dos 3 query hints relativos à colocação de locks (i.e. NOLOCK, ROWLOCK ou TABLOCK) faria sentido usar para optimizar a performance do sistema. Justifique a sua resposta e indique potenciais problemas com a utilização do query hint sugerido.

Page 13: Correcção do 4º Mini-Projecto AOBD 2007-2008. Pergunta 1 /* T1: 1 transacção por hora */ BEGIN TRANSACTION select avg(lugares_disponíveis) from ( select

Resposta para pergunta 3.2• Pode fazer sentido utilizar-se um hint TABLOCK,

eliminando-se assim o custo de manutenção relacionado com a gestão de locks de uma granularidade menor (e.g. tuplos ou páginas) ou o “escalamento” dos locks para um nível de granularidade superior.

• Outra resposta possível seria a utilização do hint NOLOCK, se assumirmos que a interrogação envolvida na transacção T1 teria apenas de retornar um valor aproximado (i.e. não é crítico que T1 faça a leitura de valores ainda não "commited" para o calculo da média).

Page 14: Correcção do 4º Mini-Projecto AOBD 2007-2008. Pergunta 1 /* T1: 1 transacção por hora */ BEGIN TRANSACTION select avg(lugares_disponíveis) from ( select

Pergunta 3.3

• Considere que a frequência das transacções associada aos espetáculos localizados em Lisboa é muito superior à das restantes regiões do país. Apresente uma proposta para optimizar a execução de transacções relativamente aos espetáculos em Lisboa. Justifique a sua resposta.

Page 15: Correcção do 4º Mini-Projecto AOBD 2007-2008. Pergunta 1 /* T1: 1 transacção por hora */ BEGIN TRANSACTION select avg(lugares_disponíveis) from ( select

Resposta para pergunta 3.3• Podemos considerar um esquema de particionamento

horizontal, por exemplo através de uma partição na tabela, colocando os tuplos associados aos espectáculos em Lisboa numa estrutura de dados separada (e.g. fisicamente noutro local). Desta forma, a "tabela" contendo estes tuplos seria mais pequena e as operações relacionadas especificamente com estes tuplos iriam ter um custo de processamento menor. Também o acesso aos restantes tuplos seria optimizado, visto existir menos contenção relacionada com as transacções frequentes para os tuplos de Lisboa.

Page 16: Correcção do 4º Mini-Projecto AOBD 2007-2008. Pergunta 1 /* T1: 1 transacção por hora */ BEGIN TRANSACTION select avg(lugares_disponíveis) from ( select

Pergunta 4• Considere que a transacção T2 é substítuida pela transacção T2’ que se

apresenta abaixo, eliminando a interacção com o utilizador:

/* T2’: Executam-se 100 transacções por segundo */ BEGIN TRANSACTION

select @lugar = min(numero_lugar) from SalaEspetaculos where lugar_ocupado = false and numero_espetaculo = ‘ABC123’; if (@lugar != NULL) { update SalaEspetaculos set lugar_ocupado = true where numero_espetaculo = ‘ABC123’ and numero_lugar =

@lugar; } else display(“não existem lugares disponíveis”); COMMIT

• Descreva vantagens e desvantagens na utilização de cada um dos dois níveis de isolamento suportados pelo SGBD, aquando da execução da nova transacção T2’ (i.e. apenas a transacção T2’ é executada). Indique qual dos níveis de isolamento lhe parece ser o mais indicado.

Page 17: Correcção do 4º Mini-Projecto AOBD 2007-2008. Pergunta 1 /* T1: 1 transacção por hora */ BEGIN TRANSACTION select avg(lugares_disponíveis) from ( select

Resposta para pergunta 4• A nível de isolamento SERIALIZABLE garante o isolamento correcto

das transacções, à custa de um decréscimo na concorrência.• O nível de isolamento SNAPSHOT leva a uma maior concorrência, à

custa da potencial utilização de mais recursos (i.e. os muitos snapshots para transacções frequentes).

• O nível de isolamento SNAPSHOT pode levar a anomalias write-skew (ou non-repetable reads/phantoms se considerarmos o nível de isolamento READ_COMMITTED_SNAPSHOT do SQL Server 2005)

• Assumindo que nunca podem existir reservas para espectáculos em duplicado, o nível de isolamento mais indicado seria o SERIALIZABLE.

Page 18: Correcção do 4º Mini-Projecto AOBD 2007-2008. Pergunta 1 /* T1: 1 transacção por hora */ BEGIN TRANSACTION select avg(lugares_disponíveis) from ( select

Pergunta 5.1• Supondo que a BD já se encontra

optimizada em termos de locking e de indices, mas que se chega à conclusão que a performance ainda não é satisfatória.

• Indique duas hipóteses para este problema de performance.

Page 19: Correcção do 4º Mini-Projecto AOBD 2007-2008. Pergunta 1 /* T1: 1 transacção por hora */ BEGIN TRANSACTION select avg(lugares_disponíveis) from ( select

Resposta para pergunta 5.1

• Duas hipóteses possíveis seriam pouca memória disponível na cache do SGBD ou planos de execução pouco eficientes (i.e. não utilizando os índices criados).

Page 20: Correcção do 4º Mini-Projecto AOBD 2007-2008. Pergunta 1 /* T1: 1 transacção por hora */ BEGIN TRANSACTION select avg(lugares_disponíveis) from ( select

Pergunta 5.2

• Para uma das razões apresentadas, descreva como poderia verificar que é essa efectivamente a causa do baixo desempenho. Indique que indicadores de performance iria observar e que valores esperaria para esses indicadores.

Page 21: Correcção do 4º Mini-Projecto AOBD 2007-2008. Pergunta 1 /* T1: 1 transacção por hora */ BEGIN TRANSACTION select avg(lugares_disponíveis) from ( select

Resposta para pergunta 5.2• Para testar a hipótese da cache insuficiente, podia-se

usar o comando SET STATISTICS IO ON por forma a verificar, para cada querie, o número de acessos efectuados ao disco, o número de acessos efectuado à cache, e o número de "pre-fetches". Seria de esperar que uma percentagem significativa de acessos feitos à cache (i.e. logical reads).

• Para testar a hipótese do plano de execução pouco eficiente, pode-se fazer a análise do plano de execução produzido para a querie. Seria de esperar que os índices criados sobre as tabelas fossem usados.

Page 22: Correcção do 4º Mini-Projecto AOBD 2007-2008. Pergunta 1 /* T1: 1 transacção por hora */ BEGIN TRANSACTION select avg(lugares_disponíveis) from ( select

Pergunta 5.3

• Suponha que a razão que indicou na alínea anterior é, de facto a causa do problema de performance. Como o poderia então resolver?

Page 23: Correcção do 4º Mini-Projecto AOBD 2007-2008. Pergunta 1 /* T1: 1 transacção por hora */ BEGIN TRANSACTION select avg(lugares_disponíveis) from ( select

Resposta para pergunta 5.3• Assumindo que a memória no SGBD é insuficiente, pode-se

configurar o SGBD por forma a reservar para sí uma quantidade de memória superior. Pode-se ainda aumentar a quantidade de memória atribuída ao processamento de cada querie e, numa solução extrema, forçar a tabela SalaEspetaculos a permanecer em cache.

• Assumindo que o problema é um plano de execução pouco eficiente, podem-se fornecer hints na querie por forma a forçar determinado plano de execução. Actualizar as estatísticas associadas aos índices também pode ser uma estratégia a seguir, levando a que o optimizador possa escolher informadamente o melhor plano de execução.