我是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;
答案 0 :(得分:2)
您需要the expression abs(b)上的索引,因为b
上的简单索引不会有帮助。
t1上的索引还应包括d
,希望能帮助订购。
t1上的索引还应包括a
和c
,以使其成为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
运算符中使用。