[firebase-br] otimizador de consultas do firebird

Eduardo Jedliczka eduardo em gerasoftinfo.com.br
Sex Nov 19 08:22:23 -03 2004


Maglan,

Cada caso é um caso, Sem dúvidas, dentro destas opções o segundo select será
mais rápido... (mas não muito mais rápido, então não invente moda!!!)

Ao fazer um join implicito, o banco cria um produto cartesiano entre os
"ranges" das tabelas filtradas pelo where.

Se você diz que quer um join de apenas um registro de cidade (com código 10)
e meia dúzia de clientes (que sejam da cidade 10), seu produto serja 6 x 1 =
6.

Mas no primeiro select, você pede todos os clientes que possuam um codcidade
válido (trabalho dobrado para o banco, mas como há uma FK, é só ler o
índice), e depois filtra somente os que tem um codcidade = 10.

Só que fica dois avisos:

1º) Se você der uma bobeada nas chaves primárias e estrangeiras usando o
segundo select, você vai perceber registros duplicados (pois 6 clientes x 2
cidades = 12 linhas)

2º) Um Join deste tipo não é claro. É melhor utilizar um Inner Join
"explícito" que terá o mesmo desempenho e vai ganhar muita clareza.

[s]

=====================
Eduardo Jedliczka
GeraSoft Informática
Apucarana - PR
=====================

----- Original Message ----- 
From: "Maglan Cristiano Diemer" <maglan em univates.br>
To: "FireBase" <lista em firebase.com.br>
Sent: Thursday, November 18, 2004 6:30 PM
Subject: [firebase-br] otimizador de consultas do firebird


> Pessoal,
>
> Suponha duas tabelas relacionadas.
>
> create table PESSOAS {
>    codigopessoa integer not null, (chave primaria)
>    nome varchar(100),
>    codigocidade integer (chave estrangeira)
> }
>
> create table CIDADES {
>    codigocidade integer not null, (chave primaria)
>    nome varchar(100)
> }
>
>
> Eu quero saber se o Interbase interpreta
> os seguintes selects da mesma forma
>
> 1)
> select *
> from pessoas, cidades
> where pessoas.codigocidade = cidades.codigocidade
> and cidades.codigocidade = 10
>
> 2)
> select *
> from pessoas, cidades
> where pessoas.codigocidade = 10
> and cidades.codigocidade = 10
>
>
> Esse é um exemplo pequeno. Mas voces entenderam, né?
> Li no livro sobre otimizacoes em bancos SQL, que o
> segundo select (apesar de trazer o mesmo resultado
> do primeiro) é bem mais rapido do que o primeiro.
>
> Penso que o otimizador do banco poderia cuidar disso, não ?
>
> Ou voces ainda poderiam mostrar outra alternativa que
> seja mais rapida ainda ?
>
> O que voces tem a dizer sobre isso ?
>
> Maglan
>
>
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.bavs.com.br
> Para editar sua configuração na lista, use o endereço
http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
>





Mais detalhes sobre a lista de discussão lista