-- 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