2

我有一张表,里面有很多外键,我需要进行内部连接,以便进行搜索。其中可能有 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=?);
4

1 回答 1

2

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

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

  • 对于当前查询,由于主表中的所有 fk 列都可以是NULL,因此您必须使用LEFT JOINnot ,JOIN否则您将排除具有NULLfk 列中的值的行。

  • name查找表中的列当然应该被定义NOT NULL。而且我不会使用非描述性的列名"name",这是一个无用的命名约定。我也会使用text而不是varchar(32).

于 2014-04-20T03:12:12.037 回答