全部产品
Search
文档中心

Hologres:Cross-database query (Beta)

更新时间:Feb 05, 2026

Topik ini menjelaskan cara melakukan kueri data lintas database di Hologres serta menyediakan contoh penggunaannya.

Informasi latar belakang

Hologres V1.1 dan versi yang lebih baru mendukung kueri data lintas wilayah, instans, dan database melalui pembuatan tabel eksternal. Proses ini sederhana dan praktis. Karena Hologres kompatibel dengan PostgreSQL, prinsip kueri lintas database menggunakan tabel eksternal sama seperti pada PostgreSQL. Untuk informasi selengkapnya, lihat FDW.

Batasan

  • Hanya Hologres V1.1 dan versi yang lebih baru yang mendukung kueri data lintas database. Jika instans Anda menggunakan versi sebelum V1.1, lihat Kesalahan umum saat persiapan upgrade gagal atau bergabunglah dengan grup DingTalk Hologres untuk memberikan masukan. Untuk informasi selengkapnya, lihat Bagaimana cara mendapatkan dukungan online lebih lanjut?.

  • Anda hanya dapat melakukan kueri data dari instans Hologres versi V1.1 atau lebih baru. Kueri lintas database hanya didukung antar instans Hologres dengan versi utama yang sama. Kueri lintas versi utama berbeda tidak didukung. Misalnya, Anda tidak dapat melakukan kueri ke instans V1.1 dari instans V1.3.

  • Anda hanya dapat melakukan kueri pada tabel internal Hologres. Tabel eksternal atau Tampilan Hologres tidak dapat dikueri.

  • Anda hanya dapat melakukan kueri pada tabel induk partisi Hologres. Tabel anak partisi tidak dapat dikueri.

  • Hanya tipe data dasar seperti INT, BIGINT, dan DATE yang didukung. Tipe data kompleks seperti JSON tidak didukung.

  • Perintah UPDATE, DELETE, dan TRUNCATE tidak didukung untuk tabel eksternal.

  • Karena alamat IP instans Hologres tidak tetap, aksesnya mungkin dibatasi oleh Daftar putih alamat IP. Disarankan agar Anda tidak mengonfigurasi Daftar putih alamat IP saat menggunakan fitur kueri lintas database.

Kueri lintas database

Prosedur penggunaan fitur kueri lintas database adalah sebagai berikut.

  1. Buat ekstensi

    Sebelum memulai, superuser harus mengeksekusi pernyataan berikut di database untuk membuat ekstensi. Pembuatan ekstensi memerlukan hak akses superuser instans, berlaku untuk seluruh database, dan hanya perlu dilakukan sekali per database.

    --Buat ekstensi.
    CREATE EXTENSION hologres_fdw;
    Catatan

    Untuk menguninstal ekstensi, eksekusi perintah berikut.

    DROP EXTENSION hologres_fdw;
  2. Buat server

    Setelah ekstensi dibuat, eksekusi pernyataan berikut untuk membuat server guna menghubungkan ke instans tujuan kueri lintas database.

    Catatan

    Anda dapat membuat beberapa server dalam satu database yang sama.

    CREATE SERVER <server_name> FOREIGN DATA WRAPPER hologres_fdw OPTIONS (
        host '<endpoint>',
        port '<port>',
        dbname '<dbname>'
    );

    Parameter

    Deskripsi

    Contoh

    server_name

    Nama server. Anda dapat menentukan nama kustom.

    holo_fdw_server

    host

    Titik akhir jaringan klasik instans Hologres. Anda dapat membuka halaman detail instans di Hologres Management Console dan memperoleh titik akhir jaringan klasik (jaringan internal) dari tab Konfigurasi Instans.

    hgpostcn-cn-xxx-cn-hangzhou-internal.hologres.aliyuncs.com

    port

    Port instans Hologres. Anda dapat membuka halaman detail instans di Hologres Management Console dan memperoleh port instans dari tab Konfigurasi Instans.

    80

    dbname

    Nama database sumber yang akan dikueri.

    testdb

  3. Buat pemetaan pengguna

    Setelah membuat server, eksekusi pernyataan berikut untuk membuat pemetaan pengguna guna melakukan kueri data. Pastikan pemetaan pengguna memiliki izin yang diperlukan untuk mengakses data sumber.

    Catatan

    Anda dapat membuat beberapa pemetaan pengguna dalam satu database yang sama.

    CREATE USER MAPPING FOR <account_uid> SERVER <server_name> 
    OPTIONS (
      access_id '<access_id>', 
      access_key '<access_key>'
    );

    Parameter

    Deskripsi

    server_name

    Nama server yang Anda tentukan pada langkah sebelumnya.

    access_id

    ID AccessKey akun saat ini. Anda dapat membuka Konsol RAM untuk memperoleh ID AccessKey.

    access_key

    Rahasia AccessKey akun saat ini.

    Contoh penggunaan

    -- Buat pemetaan pengguna untuk pengguna saat ini.
    CREATE USER MAPPING FOR CURRENT_USER SERVER holo_fdw_server OPTIONS
    (
        access_id 'yourAccessKeyId', access_key 'yourAccessKeySecret'
    );
    
    -- Buat pemetaan pengguna untuk RAM user 123xxx.
    CREATE USER MAPPING FOR "p4_123xxx" SERVER holo_fdw_server OPTIONS
    (
        access_id 'yourAccessKeyId', access_key 'yourAccessKeySecret'
    );
    
    -- Hapus pemetaan pengguna.
    Drop USER MAPPING FOR CURRENT_USER SERVER holo_fdw_server;
    Drop USER MAPPING FOR "p4_123xxx" SERVER holo_fdw_server;
  4. Buat tabel eksternal

    Anda dapat membuat tabel eksternal dengan dua cara:

    • (Direkomendasikan) Gunakan pernyataan IMPORT FOREIGN SCHEMA untuk membuat tabel eksternal

      Penggunaan pernyataan IMPORT FOREIGN SCHEMA lebih sederhana dan praktis. Pernyataan SQL-nya adalah sebagai berikut.

      IMPORT FOREIGN SCHEMA <holo_remote_schema> 
      [{ LIMIT TO EXCEPT }| (remote_table [, ...])]
      FROM SERVER <server_name>
      INTO <holo_local_schema>
      [ OPTIONS ( OPTION 'values' [, ...])];
      Catatan

      Mengimpor metadata tabel eksternal memerlukan pembacaan metadata dalam jumlah besar dari database eksternal. Disarankan menggunakan parameter LIMIT TO untuk hanya mengimpor tabel yang diperlukan. Hal ini mencegah pengimporan seluruh database dan memastikan efisiensi pembuatan tabel eksternal.

      Parameter

      Deskripsi

      Contoh

      holo_remote_schema

      Nama skema tempat tabel sumber berada.

      remote

      remote_table

      Nama tabel sumber yang akan dikueri. Setelah tabel eksternal dibuat, tabel eksternal dengan nama yang sama dengan tabel sumber akan dibuat di database baru.

      lineitem

      server_name

      Nama server yang telah dibuat.

      holo_fdw_server

      holo_local_schema

      Nama skema tempat tabel eksternal dibuat.

      local

      OPTION 'values'

      Kebijakan penanganan konflik saat membuat tabel eksternal. Parameter-parameter tersebut meliputi:

      • import_collate: Menentukan apakah konfigurasi collate kolom disertakan. Nilai default-nya adalah true.

      • import_default: Menentukan apakah nilai default kolom disertakan. Nilai default-nya adalah false.

      • import_not_null: Menentukan apakah Kendala NOT NULL kolom disertakan. Nilai default-nya adalah true.

      import_not_null 'true'

    • Gunakan pernyataan CREATE FOREIGN TABLE untuk membuat tabel eksternal

      Pernyataan SQL-nya adalah sebagai berikut.

      CREATE FOREIGN TABLE <local_table> (
       col_name type,
        ......
      )SERVER <server_name>
      OPTIONS (schema_name '<remote_schema_name>', table_name '<remote_table>');

      Parameter

      Deskripsi

      Contoh

      local_table

      Nama tabel eksternal yang akan dibuat. Secara default, tabel ditempatkan di skema public. Jika Anda memiliki skema kustom, tambahkan nama skema sebelum nama tabel dalam format schema.table.

      public.lineitem

      server_name

      Nama server yang telah dibuat.

      holo_fdw_server

      remote_schema_name

      Nama skema tempat tabel sumber berada.

      public

      remote_table

      Nama tabel sumber yang akan dikueri.

      holo_lineitem

  5. Lakukan kueri data dari tabel eksternal

    Setelah tabel eksternal dibuat, Anda dapat langsung mengkueri datanya untuk melakukan kueri lintas database. Pernyataan SQL-nya adalah sebagai berikut.

    SELECT * FROM <holo_local_table> LIMIT 10;
  6. (Opsional) Impor data ke tabel internal

    Jika Anda ingin mengimpor data lintas database dan instans, atau jika performa kueri tabel eksternal tidak memenuhi ekspektasi, Anda dapat menggunakan pernyataan SQL berikut untuk mengimpor data ke tabel internal Hologres.

    Catatan

    Sebelum memulai, buat terlebih dahulu tabel internal untuk menerima data. Untuk informasi selengkapnya tentang cara membuat tabel internal, lihat Kelola tabel internal.

    INSERT INTO <holo_table> SELECT * FROM <holo_local_table>;

Operasi terkait

  • Kueri server.

    Anda dapat menggunakan pernyataan SQL berikut untuk mengkueri server yang telah dibuat.

    SELECT
        s.srvname AS "Name",
        pg_catalog.pg_get_userbyid(s.srvowner) AS "Owner",
        f.fdwname AS "Foreign-data wrapper",
        pg_catalog.array_to_string(s.srvacl, E'\n') AS "Hak istimewa akses",
        s.srvtype AS "Tipe",
        s.srvversion AS "Versi",
        CASE WHEN srvoptions IS NULL THEN
            ''
        ELSE
            '(' || pg_catalog.array_to_string(ARRAY (
                    SELECT
                        pg_catalog.quote_ident(option_name) || ' ' || pg_catalog.quote_literal(option_value)
                    FROM pg_catalog.pg_options_to_table(srvoptions)), ', ') || ')'
        END AS "Opsi FDW",
        d.description AS "Deskripsi"
    FROM
        pg_catalog.pg_foreign_server s
        JOIN pg_catalog.pg_foreign_data_wrapper f ON f.oid = s.srvfdw
        LEFT JOIN pg_catalog.pg_description d ON d.classoid = s.tableoid
            AND d.objoid = s.oid
            AND d.objsubid = 0
    WHERE
        f.fdwname = 'hologres_fdw';
  • Lihat pemetaan pengguna.

    Anda dapat menggunakan pernyataan SQL berikut untuk mengkueri pemetaan pengguna yang telah dibuat.

    SELECT
        um.srvname AS "Server",
        um.usename AS "Nama pengguna",
        CASE WHEN umoptions IS NULL THEN
            ''
        ELSE
            '(' || pg_catalog.array_to_string(ARRAY (
                    SELECT
                        pg_catalog.quote_ident(option_name) || ' ' || pg_catalog.quote_literal(option_value)
                    FROM pg_catalog.pg_options_to_table(umoptions)), ', ') || ')'
        END AS "Opsi FDW"
    FROM
        pg_catalog.pg_user_mappings um
    WHERE
        um.srvname != 'query_log_store_server';
  • Hapus pemetaan pengguna.

    Anda dapat menggunakan pernyataan SQL berikut untuk menghapus pemetaan pengguna.

    DROP USER MAPPING FOR <account_uid> SERVER <server_name>;

    server_name adalah nama server.

  • Hapus server.

    Anda dapat menggunakan pernyataan SQL berikut untuk menghapus server.

    Penting

    Sebelum menghapus server, Anda harus terlebih dahulu menghapus pemetaan pengguna dan tabel eksternal terkait.

    DROP SERVER <server_name>;

    server_name adalah nama server.

Contoh penggunaan

Bagian ini menjelaskan konfigurasi prasyarat dan menyediakan tiga contoh lengkap kueri data lintas database.

  • Konfigurasi yang Disiapkan

    Sebelum memulai contoh-contoh berikut, Anda harus memiliki instans Hologres, membuat database, dan menyiapkan data tabel internal terkait. Rinciannya sebagai berikut.

    • Konfigurasi instans

      Konfigurasi

      Deskripsi

      ID instans Hologres sumber

      hgpostcn-cn-i7mxxxxxxxxx

      Nama database Hologres sumber

      remote_db

      Nama skema instans Hologres sumber

      remote

      Nama tabel internal Hologres sumber

      lineitem

      Nama tabel induk partisi Hologres sumber

      holo_dwd_product_movie_basic_info

    • DDL untuk tabel internal Hologres sumber

      BEGIN;
      CREATE SCHEMA remote;
      CREATE TABLE "remote"."lineitem" (
       "l_orderkey" int8 NOT NULL,
       "l_linenumber" int8 NOT NULL,
       "l_suppkey" int8 NOT NULL,
       "l_partkey" int8 NOT NULL,
       "l_quantity" int8 NOT NULL,
       "l_extendedprice" int8 NOT NULL,
       "l_discount" int8 NOT NULL,
       "l_tax" int8 NOT NULL,
       "l_returnflag" text NOT NULL,
       "l_linestatus" text NOT NULL,
       "l_shipdate" timestamptz NOT NULL,
       "l_commitdate" timestamptz NOT NULL,
       "l_receiptdate" timestamptz NOT NULL,
       "l_shipinstruct" text NOT NULL,
       "l_shipmode" text NOT NULL,
       "l_comment" text NOT NULL
      );
      COMMIT;
    • DDL untuk tabel partisi Hologres sumber

      -- Tabel induk partisi
      BEGIN;
      CREATE TABLE "remote"."holo_dwd_product_movie_basic_info" (
       "movie_name" text,
       "director" text,
       "scriptwriter" text,
       "area" text,
       "actors" text,
       "type" text,
       "movie_length" text,
       "movie_date" text,
       "movie_language" text,
       "imdb_url" text,
       "ds" text
      )
      PARTITION BY LIST (ds);
      comment on column "remote"."holo_dwd_product_movie_basic_info"."movie_name" is 'movie name';
      comment on column "remote"."holo_dwd_product_movie_basic_info"."director" is 'director';
      comment on column "remote"."holo_dwd_product_movie_basic_info"."scriptwriter" is 'scriptwriter';
      comment on column "remote"."holo_dwd_product_movie_basic_info"."area" is 'production area/country';
      comment on column "remote"."holo_dwd_product_movie_basic_info"."actors" is 'actors';
      comment on column "remote"."holo_dwd_product_movie_basic_info"."type" is 'type';
      comment on column "remote"."holo_dwd_product_movie_basic_info"."movie_length" is 'movie length';
      comment on column "remote"."holo_dwd_product_movie_basic_info"."movie_date" is 'release date';
      comment on column "remote"."holo_dwd_product_movie_basic_info"."movie_language" is 'language';
      comment on column "remote"."holo_dwd_product_movie_basic_info"."imdb_url" is 'IMDb number';
      COMMIT;
      
      --Buat tabel anak partisi untuk partisi '20170122'.
      CREATE TABLE IF NOT EXISTS "remote".holo_dwd_product_movie_basic_info_20170122 PARTITION OF "remote".holo_dwd_product_movie_basic_info FOR VALUES IN ('20170122');
                                      
  • Contoh 1: Kueri tabel non-partisi lintas database

    Catatan

    Semua contoh kode berikut harus dieksekusi di database tempat Anda melakukan kueri lintas database.

    -- Buat ekstensi sebagai superuser.
    CREATE EXTENSION hologres_fdw;
    
    -- Buat server sebagai superuser.
    CREATE SERVER holo_fdw_server FOREIGN DATA WRAPPER hologres_fdw OPTIONS (
        host 'hgpostcn-cn-i7mxxxxxxxxx-cn-hangzhou-internal.hologres.aliyuncs.com',
        port '80',
        dbname 'remote_db'
    );
    
    -- Buat pemetaan otorisasi untuk pengguna saat ini.
    CREATE USER MAPPING FOR CURRENT_USER SERVER holo_fdw_server 
    OPTIONS (access_id 'yourAccessKeyId', access_key 'yourAccessKeySecret');
    
    -- Buat skema. Di instans yang menggunakan fitur FDW, skema lokal bersifat opsional. Anda dapat menggantinya dengan skema bisnis.
    CREATE SCHEMA local;
    
    -- Buat tabel eksternal.
    IMPORT FOREIGN SCHEMA remote 
    LIMIT to (lineitem)
    FROM SERVER holo_fdw_server  
    INTO local
    OPTIONS ( 
      import_not_null 'true'
    );
    
    SELECT * FROM local.lineitem limit 10;
  • Contoh 2: Kueri tabel partisi lintas database

    CREATE EXTENSION hologres_fdw;
    
    CREATE SERVER holo_fdw_server FOREIGN DATA WRAPPER hologres_fdw OPTIONS (
        host 'hgpostcn-cn-i7mxxxxxxxxx-cn-hangzhou-internal.hologres.aliyuncs.com',
        port '80',
        dbname 'remote_db'
    );
    
    -- Buat pemetaan otorisasi untuk pengguna saat ini.
    CREATE USER MAPPING FOR CURRENT_USER SERVER holo_fdw_server 
    OPTIONS (access_id 'yourAccessKeyId', access_key 'yourAccessKeySecret');
    
    -- Buat skema. Di instans yang menggunakan fitur FDW, skema lokal bersifat opsional. Anda dapat menggantinya dengan skema bisnis.
    CREATE SCHEMA local;
    
    -- Beralih ke instans lokal (instans yang menggunakan fitur FDW).
    IMPORT FOREIGN SCHEMA remote
    LIMIT to (holo_dwd_product_movie_basic_info)
    FROM SERVER holo_fdw_server
    INTO local
    OPTIONS (
      import_not_null 'true'
    );
    
    -- Langsung lakukan kueri semua data di tabel.
    SELECT * FROM local.holo_dwd_product_movie_basic_info limit 10;                    
  • Contoh 3: Impor data dari tabel eksternal ke tabel internal

    -- Buat skema. Di instans yang menggunakan fitur FDW, skema lokal bersifat opsional. Anda dapat menggantinya dengan skema bisnis.
    CREATE SCHEMA local;
    
    -- Buat tabel internal.
    BEGIN;
    CREATE TABLE "local"."dwd_product_movie_basic_info" (
     "movie_name" text,
     "director" text,
     "scriptwriter" text,
     "area" text,
     "actors" text,
     "type" text,
     "movie_length" text,
     "movie_date" text,
     "movie_language" text,
     "imdb_url" text,
     "ds" text
    );
    COMMIT;
    
    -- Impor data ke tabel internal.
    insert into local.dwd_product_movie_basic_info select * from local.holo_dwd_product_movie_basic_info;
                        

Kesalahan umum

Saat membuat server, disarankan agar Anda menggunakan Instans utama sebagai instans yang akan dikueri. Jika terjadi kesalahan berikut, lihat solusinya.

  • Skenario kesalahan: Pesan kesalahan serupa berikut muncul saat Anda menggunakan instans read-only replica sebagai instans yang akan dikueri.

    internal error: Gagal mendapatkan shard yang tersedia untuk kueri[xxxxx], silakan coba lagi nanti.
  • Solusi: Eksekusi perintah SQL berikut di Instans utama dari instans read-only replica dan di instans inisiator kueri lintas database.

    ALTER DATABASE <database> SET hg_experimental_enable_dml_read_replica=ON;