【问题标题】:how can I access large object store on foreign table如何访问外部表上的大型对象存储
【发布时间】:2018-06-11 19:05:29
【问题描述】:

我已经设置了 postgres_fdw 来访问一个“远程”数据库(实际上它在同一台服务器上)。工作正常。除了其中一列是大对象的 oid 之外,我如何读取该数据?

【问题讨论】:

  • 您可以使用将大对象转换为bytea 的视图,但这可能不是您想要的。我认为没有其他解决方案。

标签: postgresql postgres-fdw


【解决方案1】:

我想出了如何做到这一点。大型对象存储也可以通过 pg_largeobject 表访问。所以我做到了

create foreign table if not exists global_lo (
    loid oid not null,
    pageno integer not null,
    data bytea 
)
server glob_serv options(table_name 'pg_largeobject', schema_name 'pg_catalog');

现在我可以用

读取一个大对象(全部,我无法流式传输等)
select data from global_lo where loid = 1234

【讨论】:

    【解决方案2】:

    如果您可以访问外部数据库,则可以在其上创建一个视图,将lobs 转换为byteatext,以便本地数据库可以使用它们。

    在外部数据库上,您将创建视图:

    drop view if exists tmp_view_produto_descricao;
    
    create view tmp_view_produto_descricao as
    select * from (
        select dado.*, lo_get(dado.descricaoExtendida_oid) as descricaoEstendida
        from (
            select 
                itm.id as item_id, 
                case when itm.descricaoExtendida is Null then null else Cast(itm.descricaoExtendida as oid) end descricaoExtendida_oid
            from Item itm
            where itm.descricaoExtendida is Not Null
            and   Cast(itm.descricaoExtendida as Text) != ''
        ) dado
    ) dado
    where Cast(descricaoEstendida as Text) != '';
    

    在本地数据库中,您可以声明外部视图以便使用它:

    create foreign table tmp_origem.tmp_view_produto_descricao (
        item_id bigint,
        descricaoExtendida_oid oid,
        descricaoEstendida bytea
    ) server tmp_origem options (schema_name 'public');
    

    这有点混乱和冗长,但会比直接访问pg_largeobject 获得更好的性能。

    【讨论】:

      猜你喜欢
      • 2021-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-17
      • 1970-01-01
      • 2021-08-18
      相关资源
      最近更新 更多