2016-05-17 72 views
3

我通过一组FDW表从键/值存储中公开数据。这一切都工作正常,除了Postgres经常被迫扫描整个表,当我只需要一个小子集。在外部数据包装中访问WHERE子句条件

例如:

SELECT * FROM人WHERE为person_id = 'WLW001';

除非我将LIMIT 1添加到最后,它将搜索所有人行。

在我的键/值存储中,我只需要将“WLW001”作为键的一部分直接找到正确的记录。

换句话说,我需要找到WHERE子句的条件来优化我的查询到键/值存储。我浏览了许多FDW和文档的示例,并且找不到描述使用RelOptInfo或scan_clauses列表或帮助程序函数来获取此信息的任何内容。

此外,如果SELECT语句包含参数标记,则看起来我需要替换标记的值。我在哪里可以找到价值?

+0

您使用哪个键/值存储数据包装?一些数据包装器可以在远程服务器上处理WHERE条件以减少发送的行数。如果它是文件存储的fdw,那么它可能会检索整个文件并完全扫描它;另一种方法是创建自己的存储过程,通过'plperlu'用适合您需求的逻辑来检索数据。 –

+0

关键/值存储是我们自己的,用于访问千兆字节的数据。关键是多部分。所以如果我可以将WHERE条件插入密钥中,我可以直接找到感兴趣的记录。 –

+0

数据存储的格式是什么?您使用哪种外部数据包装? –

回答

0

我在名为deparse.c的文件中找到了我需要的mysql_fdw项目(https://github.com/EnterpriseDB/mysql_fdw)。 PostgreSQL将解析一个查询并将其转换为单独的表查询。然后它会为每个不同的表调用FDW回调函数,每个表都有自己的一组WHERE条件。可以在PostgreSQL数据结构中遍历一棵树,以获取它在该表内搜索的确切条件。