在 sql 中的多个连接中建立索引

Indexing in mutliple joins in sql

我需要开发一个搜索引擎。所有数据都保存在包含大约 300GB 数据的 Oracle 数据库中。我需要加入多个 table 来收集我需要的所有信息并从那里搜索。当我加入 4 table 时,没有索引(总是超时)它变得 super 慢。这是我的查询示例:

select distinct t1.a, t1.b, t2.c , t1.d, t3.e, t5.f, t1.g, t4.k 
from table1 t1
inner join table2 t2 on t2.a = t1.a
inner join table3 t3 on t3.l = t2.l
left outer join table4 t4 on t4.d = t1.d
inner join table5 t5 on t5.a = t1.a
where t1.a > 0 and t1.b < 2 and t2.c > 3 and t1.d > 4 
and t3.e > 5 and t5.f > 6;

我知道有一个叫做 index 的东西可以加快运行时间。问题是如何制作索引?

我应该为每个 table 中的每个连接键创建索引吗?

还有where语句,如何做交叉table索引?例如,a 列和 c 列来自不同的 tables,我如何创建一个索引来同时拥有它们?

您肯定希望在被连接到的 table 中用于连接条件的所有列上都有索引,但是您应该在键(使用的地方)之后添加范围条件:

create index table2_ac on table2(a, c);
create index table3_le on table3(l, e);
create index table4_d on table4(d);
create index table5_af on table5(a, f);

您不能创建“交叉 table”索引。

where 子句中使用的列创建索引可能会有所帮助:

create index table1_abd on table1(a, b, d);

最后,将连接的 table 的条件从 where 子句移动到连接条件中:

select distinct t1.a, t1.b, t2.c , t1.d, t3.e, t5.f, t1.g, t4.k 
from table1 t1
inner join table2 t2 on t2.a = t1.a and t2.c > 3
inner join table3 t3 on t3.l = t2.l and t3.e > 5
left outer join table4 t4 on t4.d = t1.d
left outer join table5 t5 on t5.a = t1.a and t5.f > 6
where t1.a > 0 and t1.b < 2 and t1.d > 4

这也解决了您的查询的细微问题,即通过将条件放在 where 子句中的左连接 table 上,连接类型从 外部内部