基于PQftable()与PQftablecol()获取查询字段元数据的最优路径
获取PostgreSQL查询结果字段的Schema、表名、列名的最高效路径
在运行任意用户查询的工具场景中,已知可通过PQftable()获取查询结果字段对应的表Oid,通过PQftablecol()获取字段对应的列号,现寻求获取每个字段的Schema名、表名、列名的最高效实现方式。
需求示例
执行查询语句:SELECT 1, table1.foo AS colAlias, table2.bar FROM table1, table2
期望得到每个字段的元数据:
- [字段0] 无Schema或表关联;
- [字段1] 对应Schema名、
table1、foo; - [字段2] 对应Schema名、
table2、bar。
当前思路
我目前想到的方案是:针对结果集中所有唯一的表Oid,执行一次查询获取该表所有列的Schema名、表名、列名列表,再通过字段的列号匹配对应元数据。查询语句如下:
SELECT pg_namespace.nspname AS schema_name, pg_class.relname AS table_name, pg_attribute.attname AS column_name FROM pg_attribute, pg_namespace JOIN pg_class ON pg_namespace.oid = pg_class.relnamespace WHERE pg_attribute.attrelid = %u AND pg_attribute.attnum > 0 AND NOT pg_attribute.attisdropped AND pg_class.oid = pg_attribute.attrelid ORDER BY pg_attribute.attnum
注:原语句中tbl.oid为笔误,已修正为pg_class.oid
该方案虽会存在传输冗余数据(获取了未被查询用到的列)的问题,但平均效率比逐字段单独查询要高。目前未找到能让PostgreSQL服务器直接返回这些元数据的API函数,请问是否存在比此更高效的实现路径?
内容的提问来源于stack exchange,提问作者seth
相关产品推荐
相关产品推荐

