Postgresql 提高多列索引和排序的性能
Postgresql 提高多列索引和排序的性能,postgresql,indexing,query-performance,postgresql-performance,Postgresql,Indexing,Query Performance,Postgresql Performance,解释分析的输出: SELECT * FROM table1 WHERE (col1, col2) IN (($1, $2), ($3, $4)) ORDER BY col3 LIMIT 10; 但当我取消订单时: Limit (cost=59174.75..59174.77 rows=10 width=113) (actual time=3632.627..3632.661 rows=10 loops=1) -> Sort (cost=59174.75..59180.2
解释分析的输出
:
SELECT * FROM table1
WHERE (col1, col2) IN (($1, $2), ($3, $4))
ORDER BY col3
LIMIT 10;
但当我取消订单时:
Limit (cost=59174.75..59174.77 rows=10 width=113) (actual time=3632.627..3632.661 rows=10 loops=1)
-> Sort (cost=59174.75..59180.22 rows=2188 width=113) (actual time=3632.623..3632.634 rows=10 loops=1)
Sort Key: col3
Sort Method: top-N heapsort Memory: 27kB
-> Nested Loop (cost=2.62..59127.46 rows=2188 width=113) (actual time=0.234..3561.309 rows=38347 loops=1)
...........
Total runtime: 3632.818 ms
b树索引
,col3上有一个b树索引
李>
WHERE(col1,col2)IN($1,$2),($3,$4))ORDER BY col3 LIMIT 10代码>。(查找总是带有IN子句,然后是order。)
注意:是否可以在(col1、col2、col3)上创建索引?这将使用
(col1,col2)
进行查找,并且已经订购了col3
。是。你已经得到了问题的答案。对于给定的查询,on
(col1,col2,col3)
应该是完美的。试试看
有关dba.SE上此相关问题下的多列B树索引中列的顺序的更多信息:此外,如果您实际上不需要表1中的所有列,请仅将所需列放入
选择列表中,而不是*
,以获得性能
在里面
至于你的额外要求:
SELECT * FROM table1 WHERE (col1, col2) IN (($1, $2), ($3, $4)) LIMIT 10;
Limit (cost=2.62..272.85 rows=10 width=105) (actual time=0.258..1.143 rows=10 loops=1)
-> Nested Loop (cost=2.62..59127.46 rows=2188 width=105) (actual time=0.255..1.115 rows=10 loops=1)
........
Total runtime: 1.306 ms
相当于:
WHERE (col1, col2) IN (($1, $2), ($3, $4))
这降低了索引在(col1,col2,col3)
上的有效性,因为Postgres不能仅仅从索引中获取预先排序的列表。视情况而定。列表中的项越少,并且每个(col1,col2)
具有相同col3
的行越多,您可以从所述索引中获得的收益就越多
你得测试一下。另外创建索引,确保您的统计数据是最新的(),并且您的数据是合理的,然后EXPLAIN
将显示Postgres选择的内容。确保运行一组表示用例的查询。最后,删除未使用的索引
诱使博士后有效使用特殊索引
分类步骤似乎是昂贵的部分。尝试此替代查询:在
列表中的
中,每个项目有一个联合所有
分支。这为Postgres提供了一个它无法拒绝的条件:特殊索引非常适合这个查询。最后的排序步骤对于
项目中的少数项目来说是便宜的
WHERE (col1 = $1 AND col2 = $2 OR
col1 = $3 AND col2 = $4)
请注意,除了最后的orderby
和LIMIT
之外,每个分支都需要所有括号来允许orderby
和LIMIT
,我稍微修改了问题:这必须能够支持in子句的查询:WHERE(col1,col2)in($1,$2),($3,$4))col3订单限制10;。(查找总是带有IN子句,然后是order。)
在这种情况下,多列索引方法仍然有效吗?@校友:我添加了一些内容来解决您的添加。我添加了索引,没有IN子句的查找速度非常快。然而,当我开始使用IN子句时,性能会显著下降。我还可以做些什么来提高性能?似乎目的是避免昂贵的排序步骤。当IN子句不起作用时,单次查找可以避免它t@alumns例如我可能有东西给你。检查添加的段落。
(
SELECT *
FROM table1
WHERE col1 = $1 AND col2 = $3
ORDER BY col3
LIMIT 10
)
UNION ALL
(
SELECT *
FROM table1
WHERE col1 = $3 AND col2 = $4
ORDER BY col3
LIMIT 10
)
... UNION ALL ...
ORDER BY col3
LIMIT 10