添加两个简单索引来优化查询

时间:2017-12-13 20:50:04

标签: sql postgresql query-optimization

我是SQL表优化的新手,所以我有一个简单/基本的问题; 我在下面有两个SQL表t1和t2。如果我必须添加两个简单的索引来优化查询,我应该选择哪个?为什么? (请详细说明)

CREATE TABLE t1 (
    a int Primary Key,
    b int NOT NULL, 
    c char(10) references t2(e),
    d char(5)
);

CREATE TABLE t2 (
    e char(10) Primary Key
);

SELECT a
FROM t1 JOIN
     t2 
     ON c = e
WHERE abs(b)>50
ORDER BY d;

2 个答案:

答案 0 :(得分:2)

您需要the expression abs(b)上的索引,因为b上的简单索引不会有帮助。

t1上的索引还应包括d,希望能帮助订购。

t1上的索引还应包括ac,以使其成为index-only scan

t2上的索引应该包含e1以帮助加入,并且应该通过其主键来满足。

CREATE INDEX bk ON t1 (abs(b), d, a, c);

这是我的尝试,但我不是常规的PostgreSQL用户,我还没有测试过它。

答案 1 :(得分:1)

CREATE TABLE t2 (
    e char(10) Primary Key
);

e colum是主键,因此您不需要在此处创建任何索引,因为根据the documentation:索引已经存在

  

PostgreSQL在唯一时自动创建唯一索引   为表定义约束或主键。该指数涵盖了   构成主键或唯一约束的列(a   多列索引(如果适用),并且是强制执行的机制   约束。

对于查询中的这两个条件:

     ON c = e
WHERE abs(b)>50

在表格c的{​​{1}}列上创建索引。

您也可以在t1上尝试多列功能索引,但前者应该足够了。 Hovewer如果您决定尝试一下,请记住( c, abs(b) )列必须是索引中的第一列,因为此列在c运算符中使用。