Sistemas de Informação e Bases de Dados 2012/2013 Índices Alberto Sardinha
Sumário Índices Criação de Índices em SQL Exemplos 2012 Ins)tuto Superior Técnico 1
Bibliografia Raghu Ramakrishnan, Database Management Systems, 3ª edição. Cap 8 2012 Ins)tuto Superior Técnico 2
Problema BD com muitos registos precisa de espaço! BD com muitos registos pode demorar muito tempo para achar uma resposta! Resposta de uma consulta SQL 2012 Ins)tuto Superior Técnico 3
Discos (HD) transferência lenta transferência rápida e em blocos (512B ~ 4KB) e aos bytes memória disco BD / aplicação IST DEI Bases de Dados
Armazenar tudo em memória: porque não? Memória RAM É volátil É limitado Tempo de acesso muito mais rápido que um HD Discos (HD) É persistente Há mais espaço Tempo de acesso é mais lento que a memória RAM Preços (p.e. dados Nov 2011, obtidos numa loja de componentes PC) 4 GB RAM: 20 = 5 /Gb 2 TB HD SATA: 100 = 0.05 /Gb HD ~ 100 x mais barato 2012 Ins)tuto Superior Técnico 5
Acesso aos dados Os dados são transferidos entre o disco e a memória em blocos É objectivo de qualquer SGBD minimizar o número de transferências de blocos entre disco e memória IST DEI Bases de Dados
Índices Muitas vezes, pretendemos chegar aos registos pelos valores de um ou mais campos Procurar todos os alunos do IST do DEI Procurar todos os alunos de média superior a 14 no DEG Índices: estruturas de dados alternativas que nos permitem responder a estes pedidos de forma eficiente. 2012 Ins)tuto Superior Técnico 7
Formato registo índice Índices permitem acelerar o acesso aos dados p.ex. índice remissivo de um livro assunto é a chave de procura (search key) nº da página é o apontador Um índice contém registos na forma chave de procura! apontador(es) para registo(s)" em geral é muito mais pequeno que a tabela indexada 2012 Ins)tuto Superior Técnico 8
Consulta sem Índice Implica pesquisa sequencial ou varrimento (scan) pode ser muito lenta para tabelas grandes 9
Consulta com Índice Pesquisa no índice é muito rápida, mesmo para tabelas grandes Índice 2012 Ins)tuto Superior Técnico 10
Índices ordenados Numa tabela pode haver 2 tipos de índices Índice agrupado (clustered) indexa a coluna pela qual os dados estão ordenados normalmente é a chave primária, mas pode não ser Índice desagrupado (non-clustered) indexa uma coluna que não aquela pela qual os dados estão ordenados este índice especifica uma ordem diferente da tabela IST DEI Bases de Dados
Índices Agrupados (clustered) Índice Índice 2012 Ins)tuto Superior Técnico 12
Índices Desagrupados (non-clustered) Tabela Tabela Índice Índice 2012 Instituto Superior Técnico 13
Escolha de Índice Agrupado Podemos ter os índices não agrupados que quisermos sobre um ficheiro, mas apenas podemos ter um índice agrupado por ficheiro apenas uma organização de cada ficheiro permite um índice agrupado. Manter um índice agrupado tem custos quase como um ficheiro ordenado. Apenas se justifica em geral se várias interrogações tiram partido dele. 2012 Ins)tuto Superior Técnico 14
Exemplos Referência: http://www.mssqltips.com/sqlservertip/1206/ understanding-sql-server-indexing/ 2012 Ins)tuto Superior Técnico 15
Exemplo Tabela dbo.contact 20.000 registos Execution Plan do SQL Server Selecionar a consulta SQL + Control-L 2012 Ins)tuto Superior Técnico 16
Exemplo Sem índice 2012 Ins)tuto Superior Técnico 17
Exemplo Índice desagrupado na coluna lastname 2012 Ins)tuto Superior Técnico 18
Exemplo Índice agrupado na coluna lastname 2012 Ins)tuto Superior Técnico 19
Exemplo Índice desagrupado na coluna lastname, mas só selecionando lastname 2012 Ins)tuto Superior Técnico 20
Definição de índices em SQL Criação de um índice create index index_name on table_name(column_list) Exemplo create index branch_index on branch(branch_name) Para eliminar o índice: drop index branch_index IST DEI Bases de Dados
Definição de índices em SQL Criação de um índice create [clustered nonclustered] index index_name on table_name(column_list) Exemplo create clustered index branch_index on branch(branch_name) IST DEI Bases de Dados
Índices com múltiplas chaves de procura Certas perguntas exigem múltiplos índices select account_number from account where branch_name = Perryridge and balance = 1000 estratégias possíveis usar índice para branch_name e testar valor de balance usar índice para balance e testar valor de branch_name usar índice para branch_name e outro para balance e intersectar os resultados IST DEI Bases de Dados
Chaves de procura compostas Chaves de procura compostas chaves de procura com mais de um atributo p.ex. create index branch_balance_index on account (branch_name, balance) São pesquisados por ordem lexicográfica (branch 1, balance 1 ) < (branch 2, balance 2 ) se (branch 1 < branch 2 ) ou (branch 1 = branch 2 ) e (balance 1 < balance 2 ) IST DEI Bases de Dados
Chaves de procura compostas where branch_name = "Perryridge" and balance = 1000 Um índice composto pode ser usado para obter os registos que satisfazem as duas condições mais eficiente do que usar índices separados também é eficiente noutros casos, p.ex. where branch_name = "Perryridge" and balance > 1000 pode não ser eficiente em where branch_name > "Perryridge" and balance = 1000 obtém registos que satisfazem a primeira mas não a segunda condição IST DEI Bases de Dados
Exemplos Como escolher um índice? 2012 Ins)tuto Superior Técnico 26
Exemplo 1 SELECT E.dno FROM Employees E WHERE E.age > 40 2012 Ins)tuto Superior Técnico 27
Exemplo 1 SELECT E.dno FROM Employees E WHERE E.age > 40 Índice em age. Utilidade do índice depende da seletividade da condição (nº tuplos que satisfazem a condição) Se 90% tem idade superior a 40, índice é inútil Se apenas 10% têm idade superior a 40, é útil apenas se estiver agrupado 2012 Ins)tuto Superior Técnico 28
Exemplo 2 SELECT E.dno, COUNT(*) FROM Employees E WHERE E.age > 10 GROUP BY E.dno 2012 Ins)tuto Superior Técnico 29
Exemplo 2 SELECT E.dno, COUNT(*) FROM Employees E WHERE E.age > 10 GROUP BY E.dno Melhor opção seria ter índice em dno se condição em age é pouco seletiva. Se condição em age é muito seletiva, melhor seria um índice agrupado sobre age 2012 Ins)tuto Superior Técnico 30
Exemplo 3 SELECT E.dno FROM Employees E WHERE E.hobby = stamps 2012 Ins)tuto Superior Técnico 31
Exemplo 3 SELECT E.dno FROM Employees E WHERE E.hobby = stamps Se condição em hobby é pouco selectiva e consulta frequente então criar índice em hobby! 2012 Ins)tuto Superior Técnico 32
Exemplo 4 SELECT E.eid FROM Employees E WHERE E.age BETWEEN 20 and 30 AND E.sal BETWEEN 3000 and 5000 Índice composto <age,sal> se condições forem selectivas. Agrupado é melhor Ordem do índice composto indiferente se atributos igualmente seletivos 2012 Ins)tuto Superior Técnico 33
Sumário Índices Próxima aula: Transações 34