我是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;发布于 2017-12-14 04:57:49
您需要在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用户,我也没有测试过它。
发布于 2017-12-14 05:18:00
CREATE TABLE t2 (
e char(10) Primary Key
);e列是一个主键,所以您不需要在这里创建任何索引,因为根据the documentation:,索引已经存在
为表定义唯一约束或主键时,
PostgreSQL会自动创建唯一索引。索引涵盖构成主键或唯一约束(如果适用,则为多列索引)的列,并且是强制实施约束的机制。
对于查询中的这两个条件:
ON c = e
WHERE abs(b)>50在表t1中的c列上创建索引。
您也可以在( c, abs(b) )上尝试多列函数索引,但前者应该足够了。如果您决定尝试一下,那么请记住c列必须是索引中的第一列,因为这一列在=运算符中使用。
https://stackoverflow.com/questions/47801897
复制相似问题