我有一个应用程序,当它第一次连接时,它会创建一个长的表列表。
性能在公司局域网上是可以接受的,因为它在重启之间保持连接的时间很长,但是由于广域网上增加了延迟,因此速度非常慢。
我不想遍历单个创建的循环,而是希望发出一个SQL查询,该查询将有效地告诉我是否存在所有必需的表,这样我就可以绕过可选的设置步骤。
我在StackOverflow上找到了许多关于如何处理单个表的答案,但是我不知道如何扩展这些示例以使用表名列表。
有人能建议如何有效地告诉我列表中所有命名的表是否都存在吗?(如果列出的表不存在,则查询将失败,否则将失败。)
(请不要讨论在每个连接上创建/检查表是否是一个好主意,我无法控制设计的这一部分。)

最佳答案

现有表的名称存储在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

如果您可以创建一个包含所需名称的表,那么查询可能会更干净,因为您不必跟踪计数。
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'
    )
)

关于sql - 如何有效地测试Postgresql中表列表的存在,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31816349/

10-16 21:46