【发布时间】:2018-10-12 02:55:56
【问题描述】:
我正在从本地客户端对远程 Postgres 实例运行以下查询:
select * from matches_tb1 order by match_id desc limit 10;
matches_tb1 是一个外部表,并以 match_id 作为唯一索引。查询似乎永远挂起。当我使用explain verbose 时,没有ORDER BY 附加到“远程SQL”。我猜本地服务器没有将订单下推到远程服务器。我该如何解决这个问题?
附上解释结果:
explain verbose select match_id from matches_tb1 order by match_id desc limit 10;
QUERY PLAN
---------------------------------------------------------------------------------------------------
Limit (cost=33972852.96..33972852.98 rows=10 width=8)
Output: match_id
-> Sort (cost=33972852.96..35261659.79 rows=515522734 width=8)
Output: match_id
Sort Key: matches_tb1.match_id DESC
-> Foreign Scan on public.matches_tb1 (cost=100.00..22832592.02 rows=515522734 width=8)
Output: match_id
Remote SQL: SELECT match_id FROM public.matches_tb1
(8 rows)
【问题讨论】:
-
请在您的问题中发布完整的
EXPLAIN查询计划。 -
附加解释详细结果
-
计划中提到
match_id被用作排序键,所以我看不出有什么意外。您是否可以尝试其他任何查询,以便我们查看其他情况下是否存在此延迟问题? -
sql_1 = select match_id from matches_tb1 where match_id > 4164287140 order by match_id desc limit 10; sql_2 = 从matches_tb1 中选择match_id,其中match_id > 416428 order by match_id desc limit 10;我可以很快得到 sql_1 的结果,但是 sql_2 永远挂起。如果这些 sqls 直接在远程服务器上执行(而不是通过 postgres_FDW),则两者都可以在一秒钟内结束。
-
我收回我上面说的话。
match_id索引似乎没有被使用。结果,Postgres 是手动对整个 5 亿条记录表进行排序,只为找到前 10 条记录。所以,我们需要想办法让索引生效。你确定match_id上面有一个B树索引吗?
标签: sql-order-by query-performance postgresql-10 postgres-fdw