内连接性能

时间:2014-04-19 20:16:23

标签: sql postgresql join database-design postgresql-performance

我有一个包含很多外键的表,我需要内连接才能搜索。可能有超过10个,这意味着我必须做10个内连接。与我加入的大量(数百万行)表相比,每个连接的表可能只有几行。

我只需要知道连接是否是一种快速方式(仅使用Postgres)来执行此操作,或者如果可能有更聪明的方法,我可以使用子查询或其他方式来执行此操作。

以下是一些组成数据的例子:

create table a (
   a_id serial primary key,
   name character varying(32)
);
create table b (
   b_id serial primary key,
   name character varying(32)
);

--just 2 tables for simplicity, but i really need like 10 or more

create table big_table (
   big_id serial primary key,
   a_id int references a(a_id),
   b_id int references b(b_id)
);

--filter big_table based on the name column of a and b
--big_table only contains fks to a and b, so in this example im using
--left joins so i can compare by the name column
select big_id,a.name,b.name from big_table
  left join a using (a_id)
  left join b using (b_id)
  where (? is null or a.name=?) and (? is null or b.name=?);

1 个答案:

答案 0 :(得分:2)

基本上,连接是一种快速的方式。哪种方式可能最快取决于具体要求。一些提示:

  • 您的WHERE条款的目的尚不清楚。您似乎打算加入所有查找表并为每个查找表包含一个条件,而您实际上只需要其中的一些。那效率很低。而是使用并仅在查询中包含您实际需要的内容。

  • 使用当前查询,由于主表中的所有fk列都可以是NULL,因此必须使用LEFT JOIN而不是JOIN或者您将在fk列中排除NULL个值的行。

  • 查找表中的name列当然应该定义为NOT NULL。我不会使用非描述性列名"name",这是一个无用的命名约定。 I also would use text instead of varchar(32).