第一次连接时,我有一个 CREATE-IF-NOT_EXISTs 表的长列表。
企业局域网上的性能是可以接受的,因为它在重新启动之间长时间保持连接,但是由于WAN上的延迟增加,这种情况非常缓慢。
我想发布一个 SQL查询,而不是遍历单个创建的循环,而是有效地告诉我是否存在所有必需的表,因此我可以绕过可选的设置步骤。
我在StackOverflow上找到了一些关于如何处理单个表的答案,但我不知道如何扩展这些示例以使用表名列表。
有人可以建议如何有效地告诉我列表中的所有命名表是否存在? (如果任何列出的表不存在,查询应该失败,否则成功。)
(没有讨论是否在每个连接上创建/检查表是一个好主意,请 - 我无法控制设计的这一部分。)
答案 0 :(得分:1)
现有表的名称存储在relname
表的pg_class
列中。您可以为所有必需的表发出“where in”查询,并确保获得相同数量的行。
select rn = 3 from (
select count(*) rn from pg_class
where relname in ('table1','table2','tablen')
and relkind = 'r'
) t1
如果您可以创建所需名称的表格,那么not exists
查询可能会更清晰,因为您无需跟踪计数。
select exists (
select 1 from required_tables rt
where not exists (
select 1 from pg_class pc where pc.relname = rt.table_name
and relkind = 'r'
)
)
答案 1 :(得分:0)
由于您已经必须修改代码以使其跳过当前的create,因此请使用此查询来获取表列表:
SELECT schemaname||'.'||tablename FROM pg_tables
然后,您只需将此结果集与代码中已知的表列表进行比较。 (您可以使用设置差异或循环列表或应用程序的语言提供的任何内容。)我更喜欢这个,因为它使我的查询简单,这意味着我不必与ORM或其他客户端争夺正确的复杂查询。相反,我只是提取一些简单的数据,然后逻辑就在代码中。
如果需要,您可以过滤到实际使用的模式:
SELECT schemaname||'.'||tablename FROM pg_tables WHERE schemaname IN ('public', 'mycustomschema')