Extension扩展

Hologres中支持加载扩展(Extension)以实现更丰富的功能,本文为您介绍Hologres中支持的Extension扩展以及如何加载、查看、卸载Extension。

使用限制

  • 一个数据库只能在一个Schema下加载一次Extension。例如在某数据库的默认Schema下加载了Extension,则此数据库下其他的Schema不能再加载Extension。

  • 可以将extension加载在全局空间pg_catalog系统Schema下,默认该数据库的所有Schema都能访问该Extension的功能;如果不指定Schema,则会默认加载在public Schema下。

  • 账号具有Superuser权限才能加载、卸载Extension。

  • 目前仅支持加载系统内置Extension,不支持加载自定义及外部Extension。

Extension扩展

Extension名称

适用场景

相关文档

使用说明

spm、slpm

开启权限模型调用函数的开关。

简单权限模型的使用基于Schema级别的简单权限模型的使用

默认加载到hologres Schema下,不能指定Schema。

hive_compatible

使用get_json_object()函数。

GET_JSON_OBJECT

建议加载到pg_catalog Schema下。

hologres_fdw

Hologres跨库查询。

跨库查询(Beta)

  • 仅独享实例支持,共享集群不支持。

  • 建议加载到pg_catalog Schema下。

dlf_fdw

通过DLF读取OSS数据。

OSS数据湖加速

建议加载到pg_catalog Schema下。

proxima

使用Proxima进行向量计算。

Proxima向量计算

  • 仅独享实例支持,共享集群不支持。

  • 建议加载到pg_catalog Schema下。

flow_analysis

使用明细圈人、漏斗分析函数。

漏斗和留存函数明细圈人函数

默认加载到public Schema下,且只能加载到public Schema下,不能加载到其他Schema。

roaringbitmap

使用Roaring Bitmap函数。

Roaring Bitmap函数

  • 仅独享实例支持,共享集群不支持。

  • 默认加载到public Schema下,且只能加载到public Schema下,不能加载到其他Schema。

hg_binlog

消费Hologres Binlog。

通过JDBC消费Hologres Binlog

  • 仅独享实例支持,共享集群不支持。

  • 默认加载到hologres Schema下,不能指定Schema。

foreign_table_exposer

针对特定BI工具优化访问外表。

Power BI

建议加载到pg_catalog Schema下。

postgis

使用空间函数。

PostGIS地理信息分析

  • 仅独享实例支持,共享集群不支持。

  • 建议加载到pg_catalog Schema下。

clickhouse

兼容ClickHouse迁移函数。

迁移ClickHouse至Hologres

  • 仅独享实例支持,共享集群不支持。

  • 默认加载到public Schema下,且只能加载到public Schema下,不能加载到其他Schema。

pgcrypto

GEN_RANDOM_UUID函数使用。

GEN_RANDOM_UUID

建议加载到pg_catalog Schema下。

bsi

BSI函数使用。

BSI函数(Beta)

默认加载到public Schema下,且只能加载到public Schema下,不能加载到其他Schema。

hg_anon

数据脱敏使用。

数据脱敏

只能加载到pg_catalog Schema下。

mysql_compatible

MySQL兼容函数

MySQL兼容函数

默认加载到hologres Schema下,不能指定Schema。

加载Extension

加载Extension时,建议将Extension直接加载到pg_catalog系统Schema下,默认所有Schema都能使用该Extension,加载语法及示例如下:

说明

如果未指定Schema,则Extension会被默认加载到public Schema下。但需注意,部分Extension只能加载到指定的Schema下,详情请参见Extension扩展

  • 语法示例

    加载Extension的SQL命令如下。

    -- 需Superuser权限执行
    CREATE extension IF NOT EXISTS <extension_name> SCHEMA <schema_name>;

    参数

    说明

    extension_name

    需要加载的extension名称,Hologres支持的部分Extension参见本文上述列表。

    schema_name

    加载Extension所在的schema名称。如果不指定schema,则会默认在public下加载Extension,建议加载在pg_catalog下,数据库级别可用。

  • 使用示例

    在pg_catalog下加载postgis扩展示例如下。

    CREATE extension if not exists postgis schema pg_catalog;

查看当前数据库已加载Extension

通过如下SQL命令可以查看当前数据库下已加载的Extension,包括系统默认加载的Extension。

SELECT
    e.extname AS "Name",
    e.extversion AS "Version",
    n.nspname AS "Schema",
    c.description AS "Description"
FROM
    pg_catalog.pg_extension e
    LEFT JOIN pg_catalog.pg_namespace n ON n.oid = e.extnamespace
    LEFT JOIN pg_catalog.pg_description c ON c.objoid = e.oid
        AND c.classoid = 'pg_catalog.pg_extension'::pg_catalog.regclass
    ORDER BY        1;

卸载Extension

卸载Extension的SQL命令如下。

重要

不推荐使用DROP EXTENSION <extension_name> CASCADE;命令级联卸载Extension。CASCADE(级联)删除命令不仅会删除指定扩展本身,还会一并清除扩展数据(例如PostGIS数据、RoaringBitmap数据、Proxima数据、Binlog数据、BSI数据等)以及依赖该扩展的对象(包括元数据、表、视图、Server数据等)。

-- 需Superuser权限执行
DROP extension <extension_name>;

参数

说明

extension_name

需要卸载的Extension名称,Hologres支持的部分Extension参见本文上述列表。

跨Schema查询Extension示例

部分Extension只能被加载到指定的Schema下,不能被加载到pg_catalog,例如roaringbitmap extension只能被加载到public Schema下,当表存在于非public Schema时,使用RB函数查询会报错function xxx does not exist,因此在使用函数时需要加上函数的默认Schema名称。roaringbitmap Extension的使用示例如下。

  1. 数据准备。

    创建非public Schema的表并导入数据。

    CREATE EXTENSION roaringbitmap;
    
    CREATE SCHEMA test;
    
    --创建表在指定Schema下
    CREATE TABLE test.t1 (
        id integer,
        bitmap roaringbitmap
    );
    
    --数组位置对应的BIT值为1
    INSERT INTO test.t1
    SELECT
        1,
        RB_BUILD (ARRAY[1, 2, 3, 4, 5, 6, 7, 8, 9, 200]);
    
    --将输入的多条记录的值对应位置的BIT值设置为1,最后聚合为一个roaringbitmap
    INSERT INTO test.t1
    SELECT
        2,
        RB_BUILD_AGG (e)
    FROM
        GENERATE_SERIES(1, 100) e;
    
  2. public Schema下使用RB函数查询,成功执行。

    SELECT
        RB_OR (a.bitmap, b.bitmap)
    FROM (
        SELECT
            bitmap
        FROM
            test.t1
        WHERE
            id = 1) AS a,
        (
            SELECT
                bitmap
            FROM
                test.t1
            WHERE
                id = 2) AS b;
  3. 切换到指定Schema使用RB函数查询,报错。

    set search_path to test;
    SELECT
        RB_OR (a.bitmap, b.bitmap)
    FROM (
        SELECT
            bitmap
        FROM
            test.t1
        WHERE
            id = 1) AS a,
        (
            SELECT
                bitmap
            FROM
                test.t1
            WHERE
                id = 2) AS b;
    RROR:  function rb_or(public.roaringbitmap, public.roaringbitmap) does not exist
  4. 解决方法:在RB函数前加public Schema,将函数放入public Schema执行。

    SELECT
        public.RB_OR (a.bitmap, b.bitmap)
    FROM (
        SELECT
            bitmap
        FROM
            test.t1
        WHERE
            id = 1) AS a,
        (
            SELECT
                bitmap
            FROM
                test.t1
            WHERE
                id = 2) AS b;

常见问题

Extension被加载到了错误的Schema下,导致切换Schema后无法访问对应的函数或语法,报错function xxx does not exist

  • 问题原因:通常是因为Extension被加载到了public Schema下,切换Schema后,无法访问。

  • 解决方法:卸载Extension,并将Extension重新加载到pg_catalog Schema下,这样所有的Schema都能访问。示例如下:

    重要

    卸载Extension时,不建议使用DROP EXTENSION  <extension_name> CASCADE;的语法,否则会将该Extension依赖的相关对象全部删除,容易对业务产生影响。

    drop extension hologres_fdw;
    
    create extension if not exists hologres_fdw schema pg_catalog;