我有一个DBlink,它对远程数据库中的特定表执行选择。由于此远程表非常大,因此我需要进行过滤(使用where)以将很少的行带入本地数据库。本地数据库和远程数据库之间的连接是通过4G数据链路建立的,该链路具有每月数据流量限制。我一直在消耗大量数据,却不明白为什么。
昨天我决定做一个测试。我在远程数据库中仅使用必要的数据创建了一个View(已经应用了以前在DBLink中应用的位置)。我通过DbLink重新编写了查询,这一次指向远程View,没有任何位置。
结果是减少了数据消耗。
它给人的印象是,通过Dblink进行选择会在远程表上执行select *,带走所有数据,然后将其应用于本地数据库中的where,从而导致消耗过多。当我在视图中分割数据时,这种情况不再发生。有人对此案件有任何解释吗?
下面是我执行的选择:
SELECT *
FROM dblink('cloud',
select field1,
field2,
field3
from my_table
where field1 = 2
order by field1
limit 50
)
AS rep( field1 int4,
field2 int4,
field3 int4
);
我做的另一项测试是对远程表中的数据进行备份,并删除大多数数据,仅保留DBlink中使用的数据。消耗量也再次下降,证实了我的理论,即Postgres带来所有数据并且仅对本地数据库执行过滤。
dblink只是将查询传递给另一端。它当然不会删除WHERE或LIMIT。我不知道实际发生了什么,但是您在这里提出的理论无法解释它。
为了验证我的断言,您可以在外部设置log_statement ='all'并观察实际正在运行的查询。