我通过一组FDW表公开键/值存储中的数据。这一切都很好,除了Postgres经常被迫扫描整个表,而我只需要一个子集。
例如:
从person中选择*,其中person_id='LW001';
除非我在末尾添加LIMIT 1,否则它将搜索所有的人物行。
在我的密钥/值存储中,我只需要将"WLW001"作为密钥的一部分传递,就可以直接找到正确的记录。
换句话说,我需要找到WHERE子句条件来优化对键/值存储的查询。我已经查看了许多示例FDW的和和文档,找不到任何描述使用RelOptInfo或scan_clauses列表或辅助函数来获取此信息的内容。
此外,如果SELECT语句包含参数标记,那么我似乎需要用该值替换标记。我在哪里找到价值?
我在mysql_fdw项目中找到了我需要的东西(https://github.com/EnterpriseDB/mysql_fdw)在一个名为deprase.c.的文件中,PostgreSQL将解析一个查询并将其转换为单独的表查询。然后,它将为每个不同的表调用FDW回调,每个表都有自己的WHERE条件集。可以在PostgreSQL数据结构中遍历一棵树,以获得它在该表中搜索的确切条件。