All Products
Search
Document Center

PolarDB:Fungsi yang Didefinisikan Pengguna

Last Updated:Mar 29, 2026

Fungsi yang didefinisikan pengguna (User-defined functions/UDFs) di PolarDB-X adalah fungsi tersimpan berbasis SQL yang memperluas logika kueri dengan komputasi kustom.

UDF didukung pada PolarDB-X versi 5.4.16 dan yang lebih baru.

Cara kerja

p676214 \(1\).png

Setelah Anda membuat UDF, PolarDB-X menyimpannya secara persisten ke meta center dan memuatnya ke node komputasi untuk dieksekusi. Eksekusi dibagi berdasarkan jenis logika:

  • Logika SQL — dikirim ke engine SQL

  • Logika alur kendali — dieksekusi di engine PL

Sebelum eksekusi, setiap UDF didaftarkan ke pusat manajemen fungsi waktu proses. Penggunaan memori per kueri dibatasi secara ketat selama eksekusi.

Pushdown fungsi

PolarDB-X memeriksa bidang SQL DATA ACCESS dari sebuah UDF untuk menentukan apakah akan mendaftarkannya pada node data. Hanya UDF dengan nilai SQL DATA ACCESS yang diatur ke NO SQL yang didaftarkan pada node data dan dapat dipushdown.

Untuk menjaga kompatibilitas MySQL, PolarDB-X mendaftarkan UDF yang memenuhi syarat pushdown ke pustaka MySQL pada node data.

Bidang SQL DATA ACCESS tidak dapat diubah karena melibatkan logika pushdown UDF.

Pushdown setelah penskalaan

Setelah penskalaan, jalankan pushdown udf untuk mendaftarkan UDF yang memenuhi syarat pushdown ke node data (DN) baru.

Perbedaan dari MySQL

UDF PolarDB-X berbeda dari fungsi tersimpan MySQL dalam tiga aspek:

PerbedaanMySQLPolarDB-X
Operasi yang didukungDQL, DML, DDLHanya DQL — DML dan DDL tidak didukung di dalam UDF
Cakupan penyimpananTingkat databaseTingkat instance
SQL DATA ACCESS fieldDapat diubah dengan ALTER FUNCTIONImmutable — mengontrol perilaku pushdown

Sintaksis

Membuat UDF

CREATE
    [DEFINER = user]
    FUNCTION sp_name ([func_parameter[,...]])
    RETURNS type
    [characteristic ...] routine_body

func_parameter:
    param_name type

characteristic:
    COMMENT 'string'
  | LANGUAGE SQL
  | [NOT] DETERMINISTIC
  | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
  | SQL SECURITY { DEFINER | INVOKER }

routine_body:
    Valid SQL routine statement

Karakteristik utama:

KarakteristikDeskripsi
[NOT] DETERMINISTICMenandai fungsi sebagai deterministik—input yang sama selalu menghasilkan output yang sama. Gunakan DETERMINISTIC untuk mengizinkan optimasi.
NO SQL | CONTAINS SQL | READS SQL DATA | MODIFIES SQL DATAMengatur bidang SQL DATA ACCESS. Atur ke NO SQL untuk mengaktifkan pushdown ke node data. Bidang ini tidak dapat diubah setelah pembuatan.
SQL SECURITY DEFINER | INVOKERMenentukan apakah fungsi dijalankan dengan hak istimewa pembuat fungsi (DEFINER) atau pemanggil (INVOKER).

Contoh:

CREATE FUNCTION my_mul(x int, y int)
RETURNS int
LANGUAGE SQL
DETERMINISTIC
COMMENT 'my multiply function'
RETURN x*y*31;

Memanggil UDF

Panggil UDF dengan cara yang sama seperti fungsi bawaan:

SELECT my_mul(2, 2);
+--------------+
| my_mul(2, 2) |
+--------------+
|          124 |
+--------------+

Memodifikasi UDF

ALTER FUNCTION mendukung modifikasi COMMENT, LANGUAGE SQL, dan SQL SECURITY. Perintah ini tidak mendukung perubahan pada SQL DATA ACCESS.

ALTER FUNCTION func_name [characteristic ...]

characteristic: {
    COMMENT 'string'
  | LANGUAGE SQL
  | SQL SECURITY { DEFINER | INVOKER }
}

Menghapus UDF

DROP FUNCTION [IF EXISTS] FUNCTION_NAME;

Menampilkan UDF

Menampilkan semua UDF:

SELECT * FROM information_schema.Routines WHERE ROUTINE_TYPE = 'FUNCTION';

Menampilkan UDF tertentu:

SHOW FUNCTION STATUS [LIKE 'pattern' | WHERE expr]

SHOW CREATE FUNCTION function_name;

SELECT * FROM information_schema.Routines WHERE ROUTINE_NAME = 'function_name';

Lihat UDF yang didorong ke bawah:

SELECT * FROM information_schema.pushed_function;

Membatalkan UDF yang sedang berjalan

Jalankan pernyataan KILL untuk menghentikan kueri yang sedang mengeksekusi UDF:

KILL {QUERY | CONNECTION} connection_id;

Manajemen cache

Metadata UDF (apakah suatu fungsi ada) selalu berada dalam cache. Badan fungsi dimuat sesuai permintaan—hanya saat pertama kali dipanggil.

Perintah cache

PerintahDeskripsi
SELECT * FROM information_schema.function_cache;Menampilkan UDF yang dicache dan ukuran yang dimuat
SELECT * FROM information_schema.function_cache_capacity;Menampilkan ukuran cache yang digunakan dan total per node
RESIZE FUNCTION CACHE num;Mengatur ukuran cache
CLEAR FUNCTION CACHE;Mengosongkan cache
RELOAD FUNCTIONS;Memuat ulang semua UDF dan mengatur ulang cache

Contoh siklus hidup cache

Contoh berikut menjelaskan seluruh siklus hidup cache untuk my_mul.

-- Membuat UDF.
CREATE FUNCTION my_mul(x int, y int)
     RETURNS int
     LANGUAGE SQL
     DETERMINISTIC
     COMMENT 'my multiply function'
     RETURN x*y*31;

-- Fungsi ada dalam cache, tetapi badan fungsi belum dimuat (SIZE = 0).
SELECT * FROM information_schema.function_cache;
+--------------------+--------------+------+
| ID                 | FUNCTION     | SIZE |
+--------------------+--------------+------+
| xx.xx.xx.xx:3000   | mysql.my_mul |    0 |
| yy.yy.yy.yy:3100   | mysql.my_mul |    0 |
+--------------------+--------------+------+

-- Memanggil UDF. Ini memicu pemuatan badan fungsi pada satu node.
SELECT my_mul(2, 2);
+--------------+
| my_mul(2, 2) |
+--------------+
|          124 |
+--------------+

-- Badan fungsi kini dimuat pada node yang mengeksekusi panggilan (SIZE = 79).
SELECT * FROM information_schema.function_cache;
+--------------------+--------------+------+
| ID                 | FUNCTION     | SIZE |
+--------------------+--------------+------+
| xx.xx.xx.xx:3000   | mysql.my_mul |    0 |
| yy.yy.yy.yy:3100   | mysql.my_mul |   79 |
+--------------------+--------------+------+

SELECT * FROM information_schema.function_cache_capacity;
+--------------------+-----------+-------------+
| ID                 | USED_SIZE | TOTAL_SIZE  |
+--------------------+-----------+-------------+
| xx.xx.xx.xx:3000   |         0 | 15139759718 |
| yy.yy.yy.yy:3100   |        79 | 15139759718 |
+--------------------+-----------+-------------+

-- Memuat ulang UDF untuk mengatur ulang cache di semua node.
RELOAD FUNCTIONS;

-- Semua node kembali menunjukkan SIZE = 0.
SELECT * FROM information_schema.function_cache;
+--------------------+--------------+------+
| ID                 | FUNCTION     | SIZE |
+--------------------+--------------+------+
| xx.xx.xx.xx:3000   | mysql.my_mul |    0 |
| yy.yy.yy.yy:3100   | mysql.my_mul |    0 |
+--------------------+--------------+------+

Manajemen sumber daya

Batas memori

Selama eksekusi UDF, memori terutama digunakan oleh kursor. Gunakan parameter berikut untuk mengatur batas memori:

ParameterDeskripsi
PL_CURSOR_MEMORY_LIMITBatas memori maksimum untuk satu kursor. Jika melebihi batas, data akan dialihkan ke disk. Atur minimal 128 KB (131072).
PL_MEMORY_LIMITBatas memori maksimum untuk sebuah UDF. Harus lebih besar dari atau sama dengan PL_CURSOR_MEMORY_LIMIT.

Memori untuk seluruh kueri yang memanggil UDF juga dibatasi.

Batas kedalaman pemanggilan

Gunakan parameter MAX_PL_DEPTH untuk membatasi kedalaman pemanggilan UDF. Tumpukan panggilan yang dalam sulit di-debug dan mengonsumsi sumber daya signifikan.