0

我有一个查询,它使用如下视图 a 并且查询非常慢。

select *
from a
where a.id = 1 and a.name = 'Ann';

视图 a 由另外四个视图 b、c、d、e 组成。

select b.id, c.name, c.age, e.town
from b,c,d,e
where c.name = b.name AND c.id = d.id AND d.name = e.name;

我在名为 c_test 的 c 表上创建了一个索引,我需要在执行第一个查询时使用它。

这可能吗?

4

1 回答 1

0

您真的在使用这种已弃用的 1980 年代连接语法吗?你不应该。使用正确的显式连接(INNER JOIN在您的情况下)。

您将在其 ID 上加入两个表 C 和 D。这应该意味着它们是 1:1 相关的。如果不是,“ID”是用词不当,因为 ID 应该标识一行。

现在让我们看看访问路径:您有来自表 B 的 ID 和来自表 B 和 C 的名称。我们可以从列名中看出 b.id 是唯一的,如果数据库是正确设置。

这意味着 DBMS 将查找 ID 为 1 的 B 行,立即在索引中找到它,立即在表中找到该行,查看名称并查看它是否与“Ann”匹配。

因此,唯一可能会变慢的是加入 C、D 和 E。加入唯一 ID 非常快。如果您在名称上提供索引,则加入(非唯一?)名称只会很快。我会相应地推荐以下索引:

create index idx_c on c (name);
create index idx_e on e (name);

为了更快地做到这一点,请改用覆盖索引:

create index idx_b on b (id, name);
create index idx_c on c (name, id, age);
create index idx_d on d (id, name);
create index idx_e on e (name, town);
于 2022-01-19T12:53:00.640 回答