0% acharam este documento útil (0 voto)
28 visualizações42 páginas

7.6 SQL Basico - Parte 6

O documento descreve o processamento de consultas em bancos de dados, incluindo as etapas de análise e tradução, otimização e avaliação. Também discute operações como junção, subconsultas, agrupamento e ordenação.

Enviado por

Raphael Becker
Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
0% acharam este documento útil (0 voto)
28 visualizações42 páginas

7.6 SQL Basico - Parte 6

O documento descreve o processamento de consultas em bancos de dados, incluindo as etapas de análise e tradução, otimização e avaliação. Também discute operações como junção, subconsultas, agrupamento e ordenação.

Enviado por

Raphael Becker
Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
Você está na página 1/ 42

Área de Ciências Exatas e Engenharias

Cursos de Informática

SQL Básico – Parte 6

Processamento de Consultas

Prof. Daniel Luis Notari

Setembro - 2023
Processamento da Consulta

• Refere-se ao conjunto de atividades envolvidas na

extração de dados de um banco de dados.

• As atividades incluem:
– tradução de consultas em linguagens de banco de
dados de alto nível para expressões que podem ser
usadas no nível físico do sistema de arquivos,
– uma série de transformações de otimização da
consulta e a avaliação real das consultas.
Etapas no processamento
de uma consulta

1) Analise e Tradução 2) Otimização 3) Avaliação


Análise e Tradução

• Traduzir a consulta para uma forma utilizável;

• uma linguagem como SQL é adequada para o uso


humano, mas não para a representação interna do
sistema de uma consulta (baseada em álgebra
relacional)

• semelhante ao realizado pelo analisador (parser)


de um compilador
Análise e Tradução
• Ao gerar a forma interna da consulta,
– o analisador verifica a sintaxe da consulta do usuário
e se os nomes de relação que aparecem na
consulta são nomes de relações de banco de dados
• O sistema constrói
– uma representação de árvore de análise de consulta,
que pode traduzir para uma expressão da álgebra
relacional.
• Se a consulta foi expressa em termos de um visão,
– a fase de tradução também substitui todos os usos
da visão pela a expressão da álgebra relacional
que define a visão.
Otimização
• Dada uma consulta,
– existem vários métodos para calcular a resposta.
• Existem varias expressões de álgebra relacional que
fazem a mesma coisa.
• Ex.: Considere a consulta:

Select saldo
From conta
Where saldo < 2500
Otimização
• Podemos traduzi-las para as seguintes expressões
relacionais:

• É responsabilidade do sistema construir um plano de


avaliação de consulta que minimize o custo da avaliação da
consulta. MAS O PROGRAMADOR DEVE AJUDAR TAMBÉM.
Avaliação

• Para especificar totalmente como avaliar uma


consulta, precisamos não apenas oferecer a expressão
da álgebra relacional mas também anotá-la como
instruções especificando como avaliar cada operação.

• As anotações podem indicar o algoritmo a ser usado


para uma operação especifica, ou o índice especifico ou
índices a serem utilizados.
Avaliação
• Plano de Execução de consulta
– Sequencia de operações primitivas que podem ser
usadas para avaliar uma consulta

•Quando o plano de consulta for escolhido, a consulta


será avaliada com esse plano, e o resultado da
consulta será gerado.
Algoritmos básicos
• Busca linear
– o sistema varre cada bloco do arquivo e testa todos os
registros para ver se satisfazem a condição de seleção.
Uma busca inicial é necessária para acessar o primeiro
bloco.

• Para uma seleção sobre um atributo chave,



o sistema pode terminar a varredura se o registro
exigido for encontrado, sem examinar os outros
registros da relação.
Análise de expressões SQL
• Tipos de operações que podem ser realizadas,
dependendo do tipo de consulta utilizada:
• Seq Scan
– Indica que a operação utiliza a leitura sequencial de
todos os registros da tabela (não otimizada).

• Index Scan
– Indica que a operação utiliza algum índice da tabela
para localizar o resultado.
Análise de expressões SQL

• Sort
– Informa que alguma operação de ordenação
(clausula ORDER BY) é utilizada para gerar o
resultado

• Unique
– Indica que a operação utiliza uma estrutura de
coluna únicas ou consultas que utilizam o
parâmetro DISTINCT
Análise de expressões SQL

• Nested Loop
– Indica que uma operação utiliza uma operação de
JOIN para unir duas ou mais tabelas.

• HASH ou HASH JOIN


– Similar a anterior, com os benefícios da busca HASH
para encontrar registros entre as tabelas
Estatísticas de cada tabela
• Sempre que uma consulta é executada,
– o processador de consultas analisa o melhor plano
de execução com base no conjunto de estatísticas
existentes para as tabelas envolvidas.
• Comando Analyse [tabela [coluna]] (postgres)
– Atualiza o conjunto de estatística de uma tabela
• Exemplo:
– analyze corrida;
– analyze corrida(id);
Análise de expressões SQL
• Comando explain sql (postgres):
– Analisa a provável execução de um comando SQL

– Apresenta o plano de execução

• Executa uma análise para cada expressão ou união


encontrada na consulta, retornando uma linha
correspondente a sua análise.
• Retorna informações a respeito sobre filtros de
consulta na clausula WHERE, índices (se houver).
Banco de Dados Ambulatórios
Ambulatorios Médicos

Pacientes Consultas

Funcionarios
Qual é a diferença entre as
consultas abaixo?
1) select m.nome, c.data 3) select m.nome, c.data
from medicos as m cross from medicos as m inner
join consultas as c join consultas as c
where m.codm = c.codm on m.codm = c.codm

2) select m.nome, c.data 4) select m.nome, c.data


from medicos as m, from medicos as m natural
consultas as c inner join consultas as c
where m.codm = c.codm Consulta: Selecionar a data e o nome
dos médicos que tem consulta marcada
Resultado: nenhuma diferença

Todas as consultas quando executadas retornam
o mesmo conjunto de dados:
Resultado: nenhuma diferença

Todas as consultas quando executadas
executam o mesmo plano de consulta:
Uso de subconsultas
select nroa
from ambulatorios
where capacidade >
(select capacidade
from ambulatorios
where nroa = 100)

Consulta: retornar o número dos ambulatórios


com capacidade superior à capacidade
do ambulatório de número 100
Distinct
select distinct m.nome, m1. nome, c.data
from medicos as m, medicos as m1, consultas as
c, consultas as c1
where m.codm <> m1.codm
and m.codm = c.codm
and m1.codm = c1.codm
and c.data = c1.data
Consulta: retornar pares de nomes de
médicos diferentes que têm consultas
marcadas nas mesmas datas
Distinct

O que é isto?
União
(select nome, cpf
from medicos)
union
(select nome, cpf
from pacientes)

Consulta: Selecionar o nome e o cpf


dos médicos e dos pacientes
União

O que é isto?
Intersecção
(select nome, cpf
from medicos) Consulta: Selecionar o nome e o cpf
dos médicos internados
intersect como pacientes

(select nome, cpf


from pacientes)

O que é isto?
Diferença
(select nome, cpf
from medicos)
except
(select nome, cpf
from pacientes)

Consulta: Selecionar o nome e


o cpf dos médicos que não
estão internados
como pacientes O que é isto?
Ordenação
select a.nroa, m.codm, m.nome
from ambulatorios as a inner join medicos as m
on a.nroa = m.nroa
order by m.codm desc

Consulta: Selecionar número do andar,


código e o nome dos médicos que
possuem um ambulatório.
Ordenação
Agrupamento
select a.nroa, m.codm, m.nome
from ambulatorios as a inner join medicos as m
on a.nroa = m.nroa
group by a.nroa, m.codm, m.nome
having m.nome = 'daniel'

Consulta: Selecionar número do andar,


código e o nome dos médicos chamados
Daniel que
possuem um ambulatório.
Agrupamento
IN
select nome
from medicos
where nroa in
(select nroa
from ambulatorios )

Consulta: Selecionar o nome dos


médicos que
possuem um ambulatório.
IN

O que é isto?
Exists
select nome
from medicos as m
where exists
(select nroa
from ambulatorios as a)

Consulta: Selecionar o nome dos


médicos que
possuem um ambulatório.
Divisão
select distinct c.codp
from consultas as c
where not exists
(select m.codm
from medicos as m
where not exists
(select c1.codp
from consultas as c1
where m.codm = c1.codm
and c.codp = c1.codp O que é isto?

))
Exercícios

Para resolver estes exercícios, utilize o esquema
abaixo:
Ambulatórios(nroa, andar, capacidade)
Médicos(codm, CPF, nome, idade, cidade, especialidade,
#nroa)
Pacientes(codp, CPF, nome, idade, cidade, doença)
Consultas(#codm, #codp, data, hora)
Funcionários(codf, CPF, nome, idade, cidade, salário)
Exercícios

1. Explique quando o comando IS NULL/IS NOT NULL


deve ser utilizado. Crie um exemplo usando o esquema
apresentado.

2. Explique quando o comando IN deve ser utilizado.


Crie um exemplo usando o esquema da apresentado.

3. Explique quando o comando EXISTS/NOT EXISTS


deve ser utilizado. Crie um exemplo usando o esquema
apresentado.
Exercícios

4. Explique qual é a diferença entre produto


cartesiano, junção natural, junção interna e
junção externa. Diga quando deve se usar um ou
outro. Crie um exemplo e resolve ele com as
quatro operações no intuito de obter a mesma
resposta. Verifique se o plano de execução da
consulta é o mesmo.
Exercícios
5. Explique qual é a diferença entre ordenação
(order by) e agrupamento (group by). Crie um
exemplo usando o esquema apresentado.

6. Quando usamos a clausula having do group by,


esta é executada antes ou depois das condições
especificadas na clausula where. Justifique a sua
resposta e crie um exemplo usando o esquema
apresentado.
Exercícios
7. Crie um exemplo de consultas aninhadas na
clausula from usando o esquema apresentado.

8. Crie um exemplo de consulta aninhada usando


com comando EXISTS/NOT EXISTS usando o
esquema apresentado.

9. Explique como funciona uma visão. Crie uma


visão para as consultas produzidas nos exercícios
3, 4 e 5.
Exercícios
10. Gere a consulta em álgebra relacional para o sql abaixo.
Após, compare o plano de execução com a consulta e diga o
que aconteceu e porque.
select distinct m.nome, m1. nome, c.data
from medicos as m, medicos as m1, consultas as c,
consultas as c1
where m.codm <> m1.codm
and m.codm = c.codm
and m1.codm = c1.codm
and c.data = c1.data
Exercícios

11. Gere a consulta em SQL para a álgebra


relacional abaixo. Após, compare o plano de
execução com a consulta e diga o que aconteceu
e porque.
R1 <--- codm, nome, cpf (Médicos)
 R1.nome, R1.cpf (R1 / Consultas )

Você também pode gostar