SlideShare uma empresa Scribd logo
1 de 35
Baixar para ler offline
Afinação da Aplicação
(versão 2015)
Administração de Bases de Dados
Carlos Pampulim Caldeira
http://www.di.uevora.pt/~ccaldeira
http://www.linkedin.com/in/carlospampulimcaldeira
Optimizador Relacional
Permite a adaptação do SQL ao ambiente
dinâmico da base de dados:
Tabelas crescem / diminuem
Índices adicionados / removidos
Base dados fragmentada / desfragmentada
Optimizador Relacional
Ver Is de um índice
CREATE INDEX "idx_nome" on "Terrorista
Actos"("Nome");
Log: Index idx_nome created.
____________ “ ___________
EXEC DBMS_STATS.GATHER_TABLE_STATS
('ccaldeira', 'Terrorista Actos', cascade => TRUE);
Ver Is de um índice
Ver Is de um índice
SELECT distinct_keys FROM user_indexes
WHERE table_name = 'Terrorista Actos'
AND index_name = 'idx_nome';
Resultado da query:
SELECT num_rows FROM user_tables
WHERE table_name = 'Terrorista Actos';
Ver Is de um índice
SELECT (SELECT distinct_keys FROM
user_indexes WHERE table_name = 'Terrorista
Actos'
AND index_name = 'idx_nome') AS distintos,
(SELECT num_rows FROM user_tables
WHERE table_name = 'Terrorista Actos') AS
linhas FROM lamy;
Ver Is de um índice
Ver Is de um índice
SELECT (SELECT distinct_keys FROM
user_indexes WHERE table_name = 'Terrorista
Actos'
AND index_name = 'idx_nome') AS distintos,
(SELECT num_rows FROM user_tables
WHERE table_name = 'Terrorista Actos') AS
linhas FROM lamy;
Selectividade do Índice
Taxa de duplicação numa coluna indexada. Selectividade
ideal é 1, apenas alcançável em índices únicos.
Is = total valores distintos / número de linhas da tabela
Ex. Boa selectividade: 88 000 /100 000 = 0.88
Is < 0,1
Medição: Selectividade do Índice
SELECT COUNT (DISTINCT “Disciplina”)
“Valores distintos” FROM disciplina;
Valores distintos
---------------
              5
SELECT COUNT(*) “Nº Total Linhas” FROM disciplina;
Nº Total Linhas
-----------------
               14
Is = 5 / 14
= 0,35(714…)
Cardinalidade
[Código Postal] Quantos distintos haverá em PT?
Valores distintos
---------------
      1000?
Se tiver uma tabela com registo de 10 milhões de licenças
de condução?
Selectividade = 1000 / 10 000 000
Is = 0,0001 (=0,01%)
Medição: Selectividade do Índice
Ajuda a decidir entre:
• B*Tree
• Bitmap
1.Se SELECTIVIDADE > 4% é B*Tree
2.Se SELECTIVIDADE < 4% é Bitmap
Os índices, com uma selectividade inferior a 0,1%, devem ser do tipo Bitmap pois
caso contrário nem serão levados em consideração pelo optimizador relacional.
Medição: Selectividade do Índice
Auditoria aos índices em uso (Oracle)
SELECT
INDEX_NAME "Nome",
DISTINCT_KEYS / NUM_ROWS * 100
"SELECTIVITY %",
NUM_ROWS,
DISTINCT_KEYS "DISTINCT",
LEAF_BLOCKS,
CLUSTERING_FACTOR,
BLEVEL "LEVEL",
AVG_LEAF_BLOCKS_PER_KEY "ALFBPKEY"
FROM
DBA_INDEXES
WHERE
DISTINCT_KEYS / NUM_ROWS < .1 AND
NUM_ROWS > 0
ORDER BY "SELECTIVITY %" DESC;
Medição: Selectividade do Índice
Densidade do Índice
Percentagem de duplicados numa coluna indexada
Nº médio linhas = Total linhas x Densidade
Nº médio linhas = 1000 x 0,5 = 500
SELECT column_name, num_distinct, density
FROM dba_tab_col_statistics
WHERE table_name = 'Terrorista Actos';
Densidade do Índice
Joins
Dois métodos de join:
Join em ciclo (nested-loop join)
uma linha é identificada na tabela outer e em seguida a tabela inner é varrida à
procura de uma ligação e, assim sucessivamente até à última ocorrência na
tabela outer.
Join combinado (merge-scan join)
as linhas das tabelas são ordenadas e depois cada uma das tabelas é lida
sequencialmente e as colunas coincidentes são assinaladas e as linhas
devolvidas.
Joins
Nº de tabelas na junção Nº de possíveis (ordens) de junções
1 1
2 2
3 6
4 24
5 120
6 720
7 5040
8 40320
9 363880
10 3628800
11 39916800
12 479001600
13 6227020800
14 87178291200
15 1307674368000
16 20922789888000
Caminho de acesso aos dados
• não existe(m) índice(s) ou as condições
[WHERE] excluem o(s) índice(s)
• grande número de linhas que satisfazem as
condições
• índices com baixo clustering (index page cluster ratio)
• a tabela é demasiado pequena(poucas linhas)
Varrimento das tabelas:
Acesso directo pelo índice (direct index lookup)
cargo função departamento
Caminho de acesso aos dados
SELECT número, apelido, nome
FROM empregado
WHERE cargo = “Gerente”
AND função = 1
AND departamento = “D01” ;
Varrimento por comparação exacta
(matching index scan)
Caminho de acesso aos dados
Varrimento do índice:
SELECT número, apelido, nome
FROM empregado
WHERE cargo = “Gerente”
AND função = 1
AND departamento = “D01” ;
Varrimento por comparação exacta
(matching index scan)
Caminho de acesso aos dados
Varrimento do índice:
Varrimento pela posição relativa
(nonmatching index scan)
Caminho de acesso aos dados
Não há predicado de
entrada no índice,
logo a estrutura do
índice não pode ser
utilizada.
SELECT número, apelido, nome
FROM empregado
WHERE função = 1
AND departamento = “D01” ;
Varrimento do índice:
Varrimento pela posição relativa
(nonmatching index scan)
Caminho de acesso aos dados
Varrimento do índice:
Caminho de acesso aos dados
Varrimento do índice:
• varrimento do índice > varrimento da tabela
Caminho de acesso aos dados
Clustered (agrupado) ou unclustered:
• Índice agrupado: lê pág. dados uma única
• Índice não agrupado: múltiplas leituras mesma pág. de
dados
A CP não é uma boa opção para ser um índice clustered pois além de por
definição ser única, o acesso aos seus valores é aleatório enquanto que o
clustered favorece o acesso sequencial.
Os índices agrupados ao lerem as páginas das folhas nunca lêm a mesma duas
vezes. Já os índices não agrupados fazem múltiplos pedidos pois os dados
estão dispersos.
cargo função departamento salário
Caminho de acesso aos dados
Index screening:
matching
pos. relativo
SELECT número, apelido
FROM empregado
WHERE cargo = “Gerente”
AND função = 1
AND salário > 40000 ;
Acesso restrito aos índices (index covering)
Caminho de acesso aos dados
cargo função departamento salário apelido número
SELECT número, apelido
FROM empregado
WHERE cargo = “Gerente”
AND função = 1
AND salário > 40000 ;
Acesso restrito aos índices (index covering)
Caminho de acesso aos dados
• Não há I/O adicional à tabela
• “Encorajar” o acesso index-only
• Sobrecarga de colunas indexadas
Acesso múltiplo/combinado (multi-index access):
Caminho de acesso aos dados
cargo função
SELECT número, apelido
FROM empregado
WHERE cargo = “Gerente”
AND função = 1 ;
A utilização de índices para evitar SORT's:
Distinct
Union
Group by
Order by
Ordenação de dados
O optimizador não utiliza o índice:
Desprezo pelo índice
• Sem predicados
• Join com várias/muitas tabelas
• Estatísticas desactualizadas
Dois métodos:
Views: acesso
• View merging
• View materialization
O view merging é o método mais eficiente. O SQL aplicado no DDL da view é
aglutinado (merged) com o SQL que refere a view. O SQL resultante é então
utilizado para determinar o caminho de acesso aos dados.
Quando não é possível combinar o SQL da view com o SQL que acede à view é
criada uma tabela temporária que armazena os resultados da view. O SQL que
acede à view é depois aplicado aos resultados guardados na tabela temporária. Daí
a relativa ineficiência da view materialization.
Alguns optimizadores:
Re(escrita) de queries
WHERE coluna1 >= 1 AND coluna1 <= 100 , podem transformar esta
cláusula nesta:
WHERE coluna1 BETWEEN 1 AND 100
Re(escrita) de queries
transitividade do predicado (predicate transitive closure)
SELECT d."Nome do Departamento", e."Nome", e."Número de Funcionário"
FROM empregado e, departamento d
WHERE e."Código do Departamento" = d."Código do Departamento"
AND d."Código do Departamento" = "DO59";
SELECT d."Nome do Departamento", e."Nome", e."Número de Funcionário"
FROM empregado e, departamento d
WHERE e."Código do Departamento" = d."Código do Departamento"
AND e."Código do Departamento" = "DO59";

Mais conteúdo relacionado

Semelhante a Afinação da Aplicação | Caminho de Acesso aos Dados

Modulo-02-Aula-03-conteudo-para-cer.pptx
Modulo-02-Aula-03-conteudo-para-cer.pptxModulo-02-Aula-03-conteudo-para-cer.pptx
Modulo-02-Aula-03-conteudo-para-cer.pptxAugustoNicolau2
 
04 - Acesso e Manipulação de Dados através de Controles
04 - Acesso e Manipulação de Dados através de Controles04 - Acesso e Manipulação de Dados através de Controles
04 - Acesso e Manipulação de Dados através de Controlesfilipe-lemos
 
Workshop google analytics
Workshop google analyticsWorkshop google analytics
Workshop google analyticsEricson Mattoso
 
Arquitetura e sgbd de um banco de dados
Arquitetura e sgbd de um banco de dadosArquitetura e sgbd de um banco de dados
Arquitetura e sgbd de um banco de dadosdiogocbj
 
T@rget Trust - Formação: Administrador e Desenvolvedor PostgreSQL
T@rget Trust - Formação: Administrador e Desenvolvedor PostgreSQLT@rget Trust - Formação: Administrador e Desenvolvedor PostgreSQL
T@rget Trust - Formação: Administrador e Desenvolvedor PostgreSQLTargettrust
 
Banco dados i prof ivan (acesse www.portalgsti.com.br)
Banco dados i prof ivan (acesse  www.portalgsti.com.br)Banco dados i prof ivan (acesse  www.portalgsti.com.br)
Banco dados i prof ivan (acesse www.portalgsti.com.br)Andre Sidou
 
Fazendo Um Elefante Passar Debaixo da Porta - FISL
Fazendo Um Elefante Passar Debaixo da Porta - FISLFazendo Um Elefante Passar Debaixo da Porta - FISL
Fazendo Um Elefante Passar Debaixo da Porta - FISLFabio Telles Rodriguez
 
Fazendo Um Elefante Passar Debaixo da Porta - CONSEGI
Fazendo Um Elefante Passar Debaixo da Porta - CONSEGIFazendo Um Elefante Passar Debaixo da Porta - CONSEGI
Fazendo Um Elefante Passar Debaixo da Porta - CONSEGIFabio Telles Rodriguez
 
Webcast: 5 coisas que todo desenvolvedor deveria saber sobre sql server
Webcast: 5 coisas que todo desenvolvedor deveria saber sobre sql server Webcast: 5 coisas que todo desenvolvedor deveria saber sobre sql server
Webcast: 5 coisas que todo desenvolvedor deveria saber sobre sql server Marcos Freccia
 
SQL Server ES - Escrevendo queries rápidas (Performance/Query Tuning)
SQL Server ES - Escrevendo queries rápidas (Performance/Query Tuning)SQL Server ES - Escrevendo queries rápidas (Performance/Query Tuning)
SQL Server ES - Escrevendo queries rápidas (Performance/Query Tuning)Dirceu Resende
 
01 banco de dados-basico
01 banco de dados-basico01 banco de dados-basico
01 banco de dados-basicoAmadeo Santos
 

Semelhante a Afinação da Aplicação | Caminho de Acesso aos Dados (20)

Modulo-02-Aula-03-conteudo-para-cer.pptx
Modulo-02-Aula-03-conteudo-para-cer.pptxModulo-02-Aula-03-conteudo-para-cer.pptx
Modulo-02-Aula-03-conteudo-para-cer.pptx
 
Sql
SqlSql
Sql
 
04 - Acesso e Manipulação de Dados através de Controles
04 - Acesso e Manipulação de Dados através de Controles04 - Acesso e Manipulação de Dados através de Controles
04 - Acesso e Manipulação de Dados através de Controles
 
Web App Flaws - SQL Injection
Web App Flaws - SQL InjectionWeb App Flaws - SQL Injection
Web App Flaws - SQL Injection
 
Workshop google analytics
Workshop google analyticsWorkshop google analytics
Workshop google analytics
 
Web app flaws
Web app flawsWeb app flaws
Web app flaws
 
SQL Oracle
SQL OracleSQL Oracle
SQL Oracle
 
Arquitetura e sgbd de um banco de dados
Arquitetura e sgbd de um banco de dadosArquitetura e sgbd de um banco de dados
Arquitetura e sgbd de um banco de dados
 
T@rget Trust - Formação: Administrador e Desenvolvedor PostgreSQL
T@rget Trust - Formação: Administrador e Desenvolvedor PostgreSQLT@rget Trust - Formação: Administrador e Desenvolvedor PostgreSQL
T@rget Trust - Formação: Administrador e Desenvolvedor PostgreSQL
 
2006 - ADONET.ppt
2006 - ADONET.ppt2006 - ADONET.ppt
2006 - ADONET.ppt
 
Consultas SQL
Consultas SQLConsultas SQL
Consultas SQL
 
Banco dados i prof ivan (acesse www.portalgsti.com.br)
Banco dados i prof ivan (acesse  www.portalgsti.com.br)Banco dados i prof ivan (acesse  www.portalgsti.com.br)
Banco dados i prof ivan (acesse www.portalgsti.com.br)
 
Fazendo Um Elefante Passar Debaixo da Porta - FISL
Fazendo Um Elefante Passar Debaixo da Porta - FISLFazendo Um Elefante Passar Debaixo da Porta - FISL
Fazendo Um Elefante Passar Debaixo da Porta - FISL
 
Fazendo Um Elefante Passar Debaixo da Porta - CONSEGI
Fazendo Um Elefante Passar Debaixo da Porta - CONSEGIFazendo Um Elefante Passar Debaixo da Porta - CONSEGI
Fazendo Um Elefante Passar Debaixo da Porta - CONSEGI
 
Webcast: 5 coisas que todo desenvolvedor deveria saber sobre sql server
Webcast: 5 coisas que todo desenvolvedor deveria saber sobre sql server Webcast: 5 coisas que todo desenvolvedor deveria saber sobre sql server
Webcast: 5 coisas que todo desenvolvedor deveria saber sobre sql server
 
SQL Server ES - Escrevendo queries rápidas (Performance/Query Tuning)
SQL Server ES - Escrevendo queries rápidas (Performance/Query Tuning)SQL Server ES - Escrevendo queries rápidas (Performance/Query Tuning)
SQL Server ES - Escrevendo queries rápidas (Performance/Query Tuning)
 
Views Oracle Database
Views Oracle DatabaseViews Oracle Database
Views Oracle Database
 
01 banco de dados-basico
01 banco de dados-basico01 banco de dados-basico
01 banco de dados-basico
 
Php Básico - Parte 2
Php Básico - Parte 2Php Básico - Parte 2
Php Básico - Parte 2
 
Aula1
Aula1Aula1
Aula1
 

Mais de Carlos Pampulim Caldeira

Administração de Bases de Dados - Introdução
Administração de Bases de Dados - IntroduçãoAdministração de Bases de Dados - Introdução
Administração de Bases de Dados - IntroduçãoCarlos Pampulim Caldeira
 
Revisão do Desenho da Base de Dados | 2015
Revisão do Desenho da Base de Dados | 2015Revisão do Desenho da Base de Dados | 2015
Revisão do Desenho da Base de Dados | 2015Carlos Pampulim Caldeira
 
Salvaguarda e Recuperação da Base de Dados | Oracle
Salvaguarda e Recuperação da Base de Dados | OracleSalvaguarda e Recuperação da Base de Dados | Oracle
Salvaguarda e Recuperação da Base de Dados | OracleCarlos Pampulim Caldeira
 
Administração de bases de dados introdução
Administração de bases de dados   introduçãoAdministração de bases de dados   introdução
Administração de bases de dados introduçãoCarlos Pampulim Caldeira
 
Revisão do Desenho da Base de Dados - Design Review
Revisão do Desenho da Base de Dados - Design ReviewRevisão do Desenho da Base de Dados - Design Review
Revisão do Desenho da Base de Dados - Design ReviewCarlos Pampulim Caldeira
 

Mais de Carlos Pampulim Caldeira (20)

Administração de Bases de Dados - Introdução
Administração de Bases de Dados - IntroduçãoAdministração de Bases de Dados - Introdução
Administração de Bases de Dados - Introdução
 
Custo Execução Queries | Oracle | 2015
Custo Execução Queries | Oracle | 2015Custo Execução Queries | Oracle | 2015
Custo Execução Queries | Oracle | 2015
 
Estatísticas | Oracle | 2015
Estatísticas | Oracle | 2015Estatísticas | Oracle | 2015
Estatísticas | Oracle | 2015
 
Revisão do Desenho da Base de Dados | 2015
Revisão do Desenho da Base de Dados | 2015Revisão do Desenho da Base de Dados | 2015
Revisão do Desenho da Base de Dados | 2015
 
Disponibilidade da Base de Dados
Disponibilidade da Base de DadosDisponibilidade da Base de Dados
Disponibilidade da Base de Dados
 
Salvaguarda e Recuperação da Base de Dados | Oracle
Salvaguarda e Recuperação da Base de Dados | OracleSalvaguarda e Recuperação da Base de Dados | Oracle
Salvaguarda e Recuperação da Base de Dados | Oracle
 
Views | Controlo de acesso aos dados
Views | Controlo de acesso aos dadosViews | Controlo de acesso aos dados
Views | Controlo de acesso aos dados
 
SQL e Transações
SQL e TransaçõesSQL e Transações
SQL e Transações
 
DBA | Tabelas de teste
DBA | Tabelas de testeDBA | Tabelas de teste
DBA | Tabelas de teste
 
Google BigQuery
Google BigQueryGoogle BigQuery
Google BigQuery
 
Administração de bases de dados introdução
Administração de bases de dados   introduçãoAdministração de bases de dados   introdução
Administração de bases de dados introdução
 
Ambiente de exploração oracle
Ambiente de exploração oracleAmbiente de exploração oracle
Ambiente de exploração oracle
 
Oracle | Estatísticas
Oracle | EstatísticasOracle | Estatísticas
Oracle | Estatísticas
 
Custo Execução de Queries
Custo Execução de QueriesCusto Execução de Queries
Custo Execução de Queries
 
User Management
User ManagementUser Management
User Management
 
Database Performance
Database PerformanceDatabase Performance
Database Performance
 
Data Availability
Data AvailabilityData Availability
Data Availability
 
Alterações na Base de Dados
Alterações na Base de DadosAlterações na Base de Dados
Alterações na Base de Dados
 
Revisão do Desenho da Base de Dados - Design Review
Revisão do Desenho da Base de Dados - Design ReviewRevisão do Desenho da Base de Dados - Design Review
Revisão do Desenho da Base de Dados - Design Review
 
Sistema Spares
Sistema SparesSistema Spares
Sistema Spares
 

Afinação da Aplicação | Caminho de Acesso aos Dados

  • 1. Afinação da Aplicação (versão 2015) Administração de Bases de Dados Carlos Pampulim Caldeira http://www.di.uevora.pt/~ccaldeira http://www.linkedin.com/in/carlospampulimcaldeira
  • 2. Optimizador Relacional Permite a adaptação do SQL ao ambiente dinâmico da base de dados: Tabelas crescem / diminuem Índices adicionados / removidos Base dados fragmentada / desfragmentada
  • 4. Ver Is de um índice CREATE INDEX "idx_nome" on "Terrorista Actos"("Nome"); Log: Index idx_nome created. ____________ “ ___________ EXEC DBMS_STATS.GATHER_TABLE_STATS ('ccaldeira', 'Terrorista Actos', cascade => TRUE);
  • 5. Ver Is de um índice
  • 6. Ver Is de um índice SELECT distinct_keys FROM user_indexes WHERE table_name = 'Terrorista Actos' AND index_name = 'idx_nome'; Resultado da query: SELECT num_rows FROM user_tables WHERE table_name = 'Terrorista Actos';
  • 7. Ver Is de um índice SELECT (SELECT distinct_keys FROM user_indexes WHERE table_name = 'Terrorista Actos' AND index_name = 'idx_nome') AS distintos, (SELECT num_rows FROM user_tables WHERE table_name = 'Terrorista Actos') AS linhas FROM lamy;
  • 8. Ver Is de um índice
  • 9. Ver Is de um índice SELECT (SELECT distinct_keys FROM user_indexes WHERE table_name = 'Terrorista Actos' AND index_name = 'idx_nome') AS distintos, (SELECT num_rows FROM user_tables WHERE table_name = 'Terrorista Actos') AS linhas FROM lamy;
  • 10. Selectividade do Índice Taxa de duplicação numa coluna indexada. Selectividade ideal é 1, apenas alcançável em índices únicos. Is = total valores distintos / número de linhas da tabela Ex. Boa selectividade: 88 000 /100 000 = 0.88 Is < 0,1
  • 11. Medição: Selectividade do Índice SELECT COUNT (DISTINCT “Disciplina”) “Valores distintos” FROM disciplina; Valores distintos ---------------               5 SELECT COUNT(*) “Nº Total Linhas” FROM disciplina; Nº Total Linhas -----------------                14 Is = 5 / 14 = 0,35(714…)
  • 12. Cardinalidade [Código Postal] Quantos distintos haverá em PT? Valores distintos ---------------       1000? Se tiver uma tabela com registo de 10 milhões de licenças de condução? Selectividade = 1000 / 10 000 000 Is = 0,0001 (=0,01%) Medição: Selectividade do Índice
  • 13. Ajuda a decidir entre: • B*Tree • Bitmap 1.Se SELECTIVIDADE > 4% é B*Tree 2.Se SELECTIVIDADE < 4% é Bitmap Os índices, com uma selectividade inferior a 0,1%, devem ser do tipo Bitmap pois caso contrário nem serão levados em consideração pelo optimizador relacional. Medição: Selectividade do Índice
  • 14. Auditoria aos índices em uso (Oracle) SELECT INDEX_NAME "Nome", DISTINCT_KEYS / NUM_ROWS * 100 "SELECTIVITY %", NUM_ROWS, DISTINCT_KEYS "DISTINCT", LEAF_BLOCKS, CLUSTERING_FACTOR, BLEVEL "LEVEL", AVG_LEAF_BLOCKS_PER_KEY "ALFBPKEY" FROM DBA_INDEXES WHERE DISTINCT_KEYS / NUM_ROWS < .1 AND NUM_ROWS > 0 ORDER BY "SELECTIVITY %" DESC; Medição: Selectividade do Índice
  • 15. Densidade do Índice Percentagem de duplicados numa coluna indexada Nº médio linhas = Total linhas x Densidade Nº médio linhas = 1000 x 0,5 = 500 SELECT column_name, num_distinct, density FROM dba_tab_col_statistics WHERE table_name = 'Terrorista Actos';
  • 17. Joins Dois métodos de join: Join em ciclo (nested-loop join) uma linha é identificada na tabela outer e em seguida a tabela inner é varrida à procura de uma ligação e, assim sucessivamente até à última ocorrência na tabela outer. Join combinado (merge-scan join) as linhas das tabelas são ordenadas e depois cada uma das tabelas é lida sequencialmente e as colunas coincidentes são assinaladas e as linhas devolvidas.
  • 18. Joins Nº de tabelas na junção Nº de possíveis (ordens) de junções 1 1 2 2 3 6 4 24 5 120 6 720 7 5040 8 40320 9 363880 10 3628800 11 39916800 12 479001600 13 6227020800 14 87178291200 15 1307674368000 16 20922789888000
  • 19. Caminho de acesso aos dados • não existe(m) índice(s) ou as condições [WHERE] excluem o(s) índice(s) • grande número de linhas que satisfazem as condições • índices com baixo clustering (index page cluster ratio) • a tabela é demasiado pequena(poucas linhas) Varrimento das tabelas:
  • 20. Acesso directo pelo índice (direct index lookup) cargo função departamento Caminho de acesso aos dados SELECT número, apelido, nome FROM empregado WHERE cargo = “Gerente” AND função = 1 AND departamento = “D01” ;
  • 21. Varrimento por comparação exacta (matching index scan) Caminho de acesso aos dados Varrimento do índice: SELECT número, apelido, nome FROM empregado WHERE cargo = “Gerente” AND função = 1 AND departamento = “D01” ;
  • 22. Varrimento por comparação exacta (matching index scan) Caminho de acesso aos dados Varrimento do índice:
  • 23. Varrimento pela posição relativa (nonmatching index scan) Caminho de acesso aos dados Não há predicado de entrada no índice, logo a estrutura do índice não pode ser utilizada. SELECT número, apelido, nome FROM empregado WHERE função = 1 AND departamento = “D01” ; Varrimento do índice:
  • 24. Varrimento pela posição relativa (nonmatching index scan) Caminho de acesso aos dados Varrimento do índice:
  • 25. Caminho de acesso aos dados Varrimento do índice: • varrimento do índice > varrimento da tabela
  • 26. Caminho de acesso aos dados Clustered (agrupado) ou unclustered: • Índice agrupado: lê pág. dados uma única • Índice não agrupado: múltiplas leituras mesma pág. de dados A CP não é uma boa opção para ser um índice clustered pois além de por definição ser única, o acesso aos seus valores é aleatório enquanto que o clustered favorece o acesso sequencial. Os índices agrupados ao lerem as páginas das folhas nunca lêm a mesma duas vezes. Já os índices não agrupados fazem múltiplos pedidos pois os dados estão dispersos.
  • 27. cargo função departamento salário Caminho de acesso aos dados Index screening: matching pos. relativo SELECT número, apelido FROM empregado WHERE cargo = “Gerente” AND função = 1 AND salário > 40000 ;
  • 28. Acesso restrito aos índices (index covering) Caminho de acesso aos dados cargo função departamento salário apelido número SELECT número, apelido FROM empregado WHERE cargo = “Gerente” AND função = 1 AND salário > 40000 ;
  • 29. Acesso restrito aos índices (index covering) Caminho de acesso aos dados • Não há I/O adicional à tabela • “Encorajar” o acesso index-only • Sobrecarga de colunas indexadas
  • 30. Acesso múltiplo/combinado (multi-index access): Caminho de acesso aos dados cargo função SELECT número, apelido FROM empregado WHERE cargo = “Gerente” AND função = 1 ;
  • 31. A utilização de índices para evitar SORT's: Distinct Union Group by Order by Ordenação de dados
  • 32. O optimizador não utiliza o índice: Desprezo pelo índice • Sem predicados • Join com várias/muitas tabelas • Estatísticas desactualizadas
  • 33. Dois métodos: Views: acesso • View merging • View materialization O view merging é o método mais eficiente. O SQL aplicado no DDL da view é aglutinado (merged) com o SQL que refere a view. O SQL resultante é então utilizado para determinar o caminho de acesso aos dados. Quando não é possível combinar o SQL da view com o SQL que acede à view é criada uma tabela temporária que armazena os resultados da view. O SQL que acede à view é depois aplicado aos resultados guardados na tabela temporária. Daí a relativa ineficiência da view materialization.
  • 34. Alguns optimizadores: Re(escrita) de queries WHERE coluna1 >= 1 AND coluna1 <= 100 , podem transformar esta cláusula nesta: WHERE coluna1 BETWEEN 1 AND 100
  • 35. Re(escrita) de queries transitividade do predicado (predicate transitive closure) SELECT d."Nome do Departamento", e."Nome", e."Número de Funcionário" FROM empregado e, departamento d WHERE e."Código do Departamento" = d."Código do Departamento" AND d."Código do Departamento" = "DO59"; SELECT d."Nome do Departamento", e."Nome", e."Número de Funcionário" FROM empregado e, departamento d WHERE e."Código do Departamento" = d."Código do Departamento" AND e."Código do Departamento" = "DO59";