--    Considerem as duas tabelas que seguem:

CREATE TABLE usuario
(
    usuario_cod INT,
    usuario_nome VARCHAR( 50 ),
    CONSTRAINT usuario_pk PRIMARY KEY( usuario_cod )
);

INSERT INTO usuario( usuario_cod, usuario_nome ) VALUES( 1, 'Divino André' );
INSERT INTO usuario( usuario_cod, usuario_nome ) VALUES( 2, 'Fábio Araújo' );
INSERT INTO usuario( usuario_cod, usuario_nome ) VALUES( 3, 'Mauro Sérgio' );

CREATE TABLE conta
(
    conta_cod INT,
    usuario_cod INT,
    CONSTRAINT conta_pk PRIMARY KEY( conta_cod ),
    CONSTRAINT conta_fk FOREIGN KEY( usuario_cod )
        REFERENCES usuario( usuario_cod )
);

INSERT INTO conta( conta_cod, usuario_cod ) VALUES( 1, 1 );
INSERT INTO conta( conta_cod, usuario_cod ) VALUES( 2, 1 );
INSERT INTO conta( conta_cod, usuario_cod ) VALUES( 3, 2 );
INSERT INTO conta( conta_cod, usuario_cod ) VALUES( 4, 2 );
INSERT INTO conta( conta_cod, usuario_cod ) VALUES( 5, 3 );
INSERT INTO conta( conta_cod, usuario_cod ) VALUES( 6, 3 );

--    E as duas consultas que seguem:

-- Consulta A
SELECT
  c.conta_cod,
  ( SELECT usuario_nome FROM usuario WHERE usuario_cod = c.usuario_cod )
from conta c

-- Consulta B
SELECT 
  c.conta_cod, u.usuario_nome
from conta c
  inner join usuario u on c.usuario_cod = u.usuario_cod

/*
    Ao executar o explain nas duas consultas notei que o custo e, 
aparentemente, o tempo de execução da 
consulta A são bem inferiores que os da consuta B, contrariando minhas 
espectativas. Analisando, notei que 
a consulta A faz uso do índice ( usuario_pk ) enquanto que a consulta B não faz 
uso de índice e ainda faz busca 
seuquencial em ambas as tabelas.

    Outra coisa. Sempre imaginei que consultas internas dentro da cláusula 
SELECT de uma consulta externa
seria executada o número de vezes igual ao número de registros retornados na 
consulta externa. Mas agora vejo que 
isso não é verdade.

    Pois bem, alguém poderia, por favor, me explicar porque a consulta A usa 
índice e a B não? 

    Outra perguntinha, há alguma forma de obrigar o uso do índice da chave 
primária( usuario_pk ) na consulta B ( usando INNER JOIN )?

Obrigado!

*/




      
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a