What is the lowest direct query weight or using views for a double relationship?

0

Given the following hypothetical schema:

create table cidade(
  cidade_id integer primary key not null,
  nome varchar(40)
);

create table envios(
   id integer primary key not null,
   cidade_origem_id  integer,
   cidade_destino_id integer
);
alter table envios add foreign key (cidade_origem_id) references cidade (cidade_id);
alter table envios add foreign key (cidade_destino_id) references cidade (cidade_id);

insert into cidade values (1, 'Barbacema');
insert into cidade values (2, 'Los Angeles');
insert into cidade values (3, 'São Paulo');
insert into cidade values (4, 'Porto Velho');

insert into envios values (1, 1,2);
insert into envios values (2, 2,3);
insert into envios values (3, 3,4);

create view cidade_origem as select * from cidade;
create view cidade_destino as select * from cidade;

To search for source and destination submissions I have the following query:

select co.nome origem, cd.nome destino from envios e
inner join cidade co on co.cidade_id = e.cidade_origem_id
inner join cidade cd on cd.cidade_id = e.cidade_destino_id

What would weigh more? Leave the query as is or use two views (one for home city and one for destination city), and make the joins with those views >?

select co.nome origem, cd.nome destino from envios e
inner join cidade_origem co on co.cidade_id = e.cidade_origem_id
inner join cidade_destino cd on cd.cidade_id = e.cidade_destino_id
    
asked by anonymous 07.07.2018 / 16:38

1 answer

3

I do not see the need to create any VIEW in your case. And, in fact, the creation of a% non-materialized% could further degrade performance.

For example, even specifying the VIEW clause for a query in the WHERE you called VIEW , for "under the wipes, cidade_origem is running.

My suggestion is that you continue with your SELECT * FROM envios; and create indexes in the JOINS and cidade_origem_id fields in the cidade_destino_id :

CREATE INDEX idx_envios_cidade_origem ON envios (cidade_origem_id);
CREATE INDEX idx_envios_cidade_destino ON envios (cidade_destino_id);

Attention, envios creates implicit indices in primary keys, but does not do the same in braces.

Another golden tip, is to always avoid "guessing" where there will be bottlenecks. Bottlenecks need to be detected and identified, so only think about optimizations. You did what "good practices" told you, now wait for the bottlenecks to scream.

    
07.07.2018 / 16:58