SlideShare a Scribd company logo
1 of 10
Download to read offline
PostgreSQL v14 で追加 ( 予定 ) の
SQL-standard function body
2021.5.11
第 23 回 PostgreSQL アンカンファレンス @ オンライン
笠原辰仁 @kasa_zip
はじめに
●
本日は PostgreSQL 14 で追加予定の
SQL-standard function body
についてお話します
●
2021/4/7 に PostgreSQL の HEAD に commit されました
– https://git.postgresql.org/gitweb/?
p=postgresql.git;a=commit;h=e717a9a18b2e34c9c40e5259ad4d31cd
7e420750
●
すでに HEAD で利用可能ですが 仕様変更 or revert される
可能性もあるため、参考程度にお聞きください
SQL-standard Function Body について
●
CREATE FUNCTION / PROCEDURE によるユーザ定義関数を
作成する際の新しい記述方法です
●
従来は PostgreSQL 特有の記述方法でしたが、 SQL 標準に即した
記述方法がサポートされました
– MySQL や DB2 、 SQL Server などでも類似の記述方法が可能
●
従来の書き方も継続して利用できます
●
LANGUAGE SQL でのみ有効です
– PL/PgSQL や PL/python などのプロシージャ言語ではサポー
トされていません
記述例
●
従来の書き方
CREATE FUNCTION f_test1(int, int)
RETURNS bigint
LANGUAGE sql
AS 'SELECT $1 + $2;';
--AS $$ SELECT $1 + $2 $$;
CREATE FUNCTION f_test2(int)
RETURNS text
LANGUAGE sql
AS 'SELECT name FROM t WHERE id = $1;';
--AS $$ SELECT name FROM t WHERE id = $1 $$;
CREATE FUNCTION fb_test1(int, int)
RETURNS bigint
LANGUAGE sql
RETURN $1 + $2; --RETURN 式
CREATE FUNCTION fb_test2(int)
RETURNS text
LANGUAGE sql
BEGIN ATOMIC
SELECT name FROM t WHERE id = $1;
-- 複数のステートメントを記述可能
END;
●
新しい書き方
SQL-standard Function Body の特長 1
●
関数定義時にパースされ、その結果 (Expression nodes) が
pg_proc システムテーブルに格納される
– 従って以降の実行時はパースがスキップされる
– 従来の記述方法は実行時にパースされる
– 若干ですが性能上の恩恵があるかもしれません
SELECT proname, prosrc, substr(prosqlbody,1,50) as body
FROM pg_proc WHERE proname IN ('f_test', 'fb_test');
proname | prosrc | body
---------+-----------------------------------+----------------------------------------------------
f_test | SELECT name FROM t WHERE id = $1; |
fb_test | | (({QUERY :commandType 1 :querySource 0 :canSetTag
SQL-standard Function Body の特長 2
●
関数定義時にパースされるため、実行時に決定される多様型は
使えません
– 多様型を使う場合は従来の書き方で・・
=# CREATE FUNCTION f_test_poly (anyelement, anyelement)
RETURNS anyarray
LANGUAGE sql
AS 'SELECT ARRAY[$1, $2];' ;
CREATE FUNCTION
=# CREATE FUNCTION fb_test_poly (anyelement, anyelement)
RETURNS anyarray
LANGUAGE sql
RETURN ARRAY[$1, $2];
ERROR: SQL function with unquoted function body cannot have polymorphic arguments
SQL-standard Function Body の特長 3
●
関数定義時にパースされると共に、依存関係の解析がされ pg_depend システ
ムテーブルで管理されるようになります
– 厳密には、関数が依存 ( 利用 ) しているオブジェクトは何か?を管理するよ
うになります
=# CREATE TABLE t (id int, name text);
--テ ブル
ー tを参照する2つの 数を作成
関
=# CREATE FUNCTION f_test(int) RETURNS text LANGUAGE sql AS 'SELECT name FROM t WHERE id = $1;';
=# CREATE FUNCTION fb_test(int) RETURNS text LANGUAGE sql BEGIN ATOMIC SELECT name FROM t WHERE id = $1;
END;
=# SELECT * FROM pg_depend WHERE objid = 'fb_test'::regproc; --()内情 は 足したもの
報 補
classid | objid | objsubid | refclassid | refobjid | refobjsubid | deptype
---------------+----------------+----------+--------------------+--------------+-------------+---------
1255(pg_proc) | 16409(fb_test) | 0 | 2615(pg_namespace) | 2200(public) | 0 | n
1255(pg_proc) | 16409(fb_test) | 0 | 1259(pg_class) | 16403(t) | 1 | n
1255(pg_proc) | 16409(fb_test) | 0 | 1259(pg_class) | 16403(t) | 2 | n
SQL-standard Function Body の特長 3
●
関数が参照しているオブジェクトを削除する場合、 CASCADE
オプションで関数も一緒に削除してくれます
– スキーマ管理の運用性向上に役立つでしょう
--前ペ ジからの き
ー 続
=# DROP TABLE t;
ERROR: cannot drop table t because other objects depend on it
DETAIL: function fb_test(integer) depends on table t
HINT: Use DROP ... CASCADE to drop the dependent objects too.
=# DROP TABLE t CASCADE;
NOTICE: drop cascades to function fb_test(integer)
DROP TABLE
-- 来の 述方法で作成した
従 記 function f_test(integer) は残る
SQL-standard Function Body の特長 4
●
SQL 標準に準拠しているので、移植性が ( 多少 ) 向上します
– PostgreSQL から他の DBMS へ、あるいはその逆の移行時
などに便利
●
PostgreSQL の system functions のいくつかは SQL-
standard-body style に書き直されました
まとめ
●
CREATE FUNCTION/PROCEDURE の新しい記述方法がサ
ポートされました
– LANGUAGE SQL のみのサポートです
– 多様型 (any* 型 ) を扱う場合は利用できません
●
SQL 標準に沿った記述方法であり、地味ですが性能・運用
性・移植性の向上が期待できます
●
差し支えなければ、 PostgreSQL 14 以降は今回紹介した記述
方法を使うのがオススメです

More Related Content

What's hot

明日から使えるPostgre sql運用管理テクニック(監視編)
明日から使えるPostgre sql運用管理テクニック(監視編)明日から使えるPostgre sql運用管理テクニック(監視編)
明日から使えるPostgre sql運用管理テクニック(監視編)
kasaharatt
 
PostgreSQLの新バージョン -PostgreSQL9.4- のご紹介
PostgreSQLの新バージョン -PostgreSQL9.4- のご紹介PostgreSQLの新バージョン -PostgreSQL9.4- のご紹介
PostgreSQLの新バージョン -PostgreSQL9.4- のご紹介
Insight Technology, Inc.
 
C16 45分でわかるPostgreSQLの仕組み by 山田努
C16 45分でわかるPostgreSQLの仕組み by 山田努C16 45分でわかるPostgreSQLの仕組み by 山田努
C16 45分でわかるPostgreSQLの仕組み by 山田努
Insight Technology, Inc.
 

What's hot (20)

PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
 
PostgreSQLとPythonとSQL
PostgreSQLとPythonとSQLPostgreSQLとPythonとSQL
PostgreSQLとPythonとSQL
 
明日から使えるPostgre sql運用管理テクニック(監視編)
明日から使えるPostgre sql運用管理テクニック(監視編)明日から使えるPostgre sql運用管理テクニック(監視編)
明日から使えるPostgre sql運用管理テクニック(監視編)
 
Vacuum徹底解説
Vacuum徹底解説Vacuum徹底解説
Vacuum徹底解説
 
Kof2016 postgresql-9.6
Kof2016 postgresql-9.6Kof2016 postgresql-9.6
Kof2016 postgresql-9.6
 
あなたの知らないPostgreSQL監視の世界
あなたの知らないPostgreSQL監視の世界あなたの知らないPostgreSQL監視の世界
あなたの知らないPostgreSQL監視の世界
 
まずやっとくPostgreSQLチューニング
まずやっとくPostgreSQLチューニングまずやっとくPostgreSQLチューニング
まずやっとくPostgreSQLチューニング
 
Osc2015 hokkaido postgresql-semi-stuructured-datatype
Osc2015 hokkaido postgresql-semi-stuructured-datatypeOsc2015 hokkaido postgresql-semi-stuructured-datatype
Osc2015 hokkaido postgresql-semi-stuructured-datatype
 
PostgreSQL 10 新機能 @OSC 2017 Fukuoka
PostgreSQL 10 新機能 @OSC 2017 FukuokaPostgreSQL 10 新機能 @OSC 2017 Fukuoka
PostgreSQL 10 新機能 @OSC 2017 Fukuoka
 
PostgreSQL運用管理入門
PostgreSQL運用管理入門PostgreSQL運用管理入門
PostgreSQL運用管理入門
 
PythonでテキストをJSONにした話(PyCon mini sapporo 2015)
PythonでテキストをJSONにした話(PyCon mini sapporo 2015)PythonでテキストをJSONにした話(PyCon mini sapporo 2015)
PythonでテキストをJSONにした話(PyCon mini sapporo 2015)
 
OSC2015kyoto
OSC2015kyotoOSC2015kyoto
OSC2015kyoto
 
MySQLを割と一人で300台管理する技術
MySQLを割と一人で300台管理する技術MySQLを割と一人で300台管理する技術
MySQLを割と一人で300台管理する技術
 
DynamoDB MyNA・JPUG合同DB勉強会 in 東京
DynamoDB   MyNA・JPUG合同DB勉強会 in 東京DynamoDB   MyNA・JPUG合同DB勉強会 in 東京
DynamoDB MyNA・JPUG合同DB勉強会 in 東京
 
pg_bigmを用いた全文検索のしくみ(前編)
pg_bigmを用いた全文検索のしくみ(前編)pg_bigmを用いた全文検索のしくみ(前編)
pg_bigmを用いた全文検索のしくみ(前編)
 
PostgreSQLの新バージョン -PostgreSQL9.4- のご紹介
PostgreSQLの新バージョン -PostgreSQL9.4- のご紹介PostgreSQLの新バージョン -PostgreSQL9.4- のご紹介
PostgreSQLの新バージョン -PostgreSQL9.4- のご紹介
 
OSC2015nagoya
OSC2015nagoyaOSC2015nagoya
OSC2015nagoya
 
C16 45分でわかるPostgreSQLの仕組み by 山田努
C16 45分でわかるPostgreSQLの仕組み by 山田努C16 45分でわかるPostgreSQLの仕組み by 山田努
C16 45分でわかるPostgreSQLの仕組み by 山田努
 
シンプルでシステマチックな Linux 性能分析方法
シンプルでシステマチックな Linux 性能分析方法シンプルでシステマチックな Linux 性能分析方法
シンプルでシステマチックな Linux 性能分析方法
 
PostgreSQLのトラブルシューティング@第5回中国地方DB勉強会
PostgreSQLのトラブルシューティング@第5回中国地方DB勉強会PostgreSQLのトラブルシューティング@第5回中国地方DB勉強会
PostgreSQLのトラブルシューティング@第5回中国地方DB勉強会
 

Similar to Pg14_sql_standard_function_body

Handlersocket 20110517
Handlersocket 20110517Handlersocket 20110517
Handlersocket 20110517
akirahiguchi
 
第2回品川Redmine勉強会(日本語全文検索)
第2回品川Redmine勉強会(日本語全文検索)第2回品川Redmine勉強会(日本語全文検索)
第2回品川Redmine勉強会(日本語全文検索)
Masanori Machii
 

Similar to Pg14_sql_standard_function_body (20)

とあるDBAの黒い画面(ターミナル)
とあるDBAの黒い画面(ターミナル)とあるDBAの黒い画面(ターミナル)
とあるDBAの黒い画面(ターミナル)
 
[db tech showcase Tokyo 2014] D21: Postgres Plus Advanced Serverはここが使える&9.4新機...
[db tech showcase Tokyo 2014] D21: Postgres Plus Advanced Serverはここが使える&9.4新機...[db tech showcase Tokyo 2014] D21: Postgres Plus Advanced Serverはここが使える&9.4新機...
[db tech showcase Tokyo 2014] D21: Postgres Plus Advanced Serverはここが使える&9.4新機...
 
Chugokudb18_2
Chugokudb18_2Chugokudb18_2
Chugokudb18_2
 
PostgreSQL10徹底解説
PostgreSQL10徹底解説PostgreSQL10徹底解説
PostgreSQL10徹底解説
 
PostgreSQLレプリケーション(pgcon17j_t4)
PostgreSQLレプリケーション(pgcon17j_t4)PostgreSQLレプリケーション(pgcon17j_t4)
PostgreSQLレプリケーション(pgcon17j_t4)
 
MySQL 5.5 Update #denatech
MySQL 5.5 Update #denatechMySQL 5.5 Update #denatech
MySQL 5.5 Update #denatech
 
PostgreSQL 12の話
PostgreSQL 12の話PostgreSQL 12の話
PostgreSQL 12の話
 
Rails3.1rc4を試してみた
Rails3.1rc4を試してみたRails3.1rc4を試してみた
Rails3.1rc4を試してみた
 
Postgre sql update_20170310
Postgre sql update_20170310Postgre sql update_20170310
Postgre sql update_20170310
 
[db tech showcase Tokyo 2014] B26: PostgreSQLを拡張してみよう by SRA OSS, Inc. 日本支社 高塚遥
[db tech showcase Tokyo 2014] B26: PostgreSQLを拡張してみよう  by SRA OSS, Inc. 日本支社 高塚遥[db tech showcase Tokyo 2014] B26: PostgreSQLを拡張してみよう  by SRA OSS, Inc. 日本支社 高塚遥
[db tech showcase Tokyo 2014] B26: PostgreSQLを拡張してみよう by SRA OSS, Inc. 日本支社 高塚遥
 
外部データラッパによる PostgreSQL の拡張
外部データラッパによる PostgreSQL の拡張外部データラッパによる PostgreSQL の拡張
外部データラッパによる PostgreSQL の拡張
 
DeclarativeSql
DeclarativeSqlDeclarativeSql
DeclarativeSql
 
[東京] JapanSharePointGroup 勉強会 #2
[東京] JapanSharePointGroup 勉強会 #2[東京] JapanSharePointGroup 勉強会 #2
[東京] JapanSharePointGroup 勉強会 #2
 
Handlersocket 20110517
Handlersocket 20110517Handlersocket 20110517
Handlersocket 20110517
 
PostgreSQL14の pg_stat_statements 改善(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQL14の pg_stat_statements 改善(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)PostgreSQL14の pg_stat_statements 改善(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQL14の pg_stat_statements 改善(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
 
Inside mobage platform
Inside mobage platformInside mobage platform
Inside mobage platform
 
20190518 27th-chugoku db-lt-pg12
20190518 27th-chugoku db-lt-pg1220190518 27th-chugoku db-lt-pg12
20190518 27th-chugoku db-lt-pg12
 
Rails Controller Fundamentals
Rails Controller FundamentalsRails Controller Fundamentals
Rails Controller Fundamentals
 
DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!
 
第2回品川Redmine勉強会(日本語全文検索)
第2回品川Redmine勉強会(日本語全文検索)第2回品川Redmine勉強会(日本語全文検索)
第2回品川Redmine勉強会(日本語全文検索)
 

Pg14_sql_standard_function_body

  • 1. PostgreSQL v14 で追加 ( 予定 ) の SQL-standard function body 2021.5.11 第 23 回 PostgreSQL アンカンファレンス @ オンライン 笠原辰仁 @kasa_zip
  • 2. はじめに ● 本日は PostgreSQL 14 で追加予定の SQL-standard function body についてお話します ● 2021/4/7 に PostgreSQL の HEAD に commit されました – https://git.postgresql.org/gitweb/? p=postgresql.git;a=commit;h=e717a9a18b2e34c9c40e5259ad4d31cd 7e420750 ● すでに HEAD で利用可能ですが 仕様変更 or revert される 可能性もあるため、参考程度にお聞きください
  • 3. SQL-standard Function Body について ● CREATE FUNCTION / PROCEDURE によるユーザ定義関数を 作成する際の新しい記述方法です ● 従来は PostgreSQL 特有の記述方法でしたが、 SQL 標準に即した 記述方法がサポートされました – MySQL や DB2 、 SQL Server などでも類似の記述方法が可能 ● 従来の書き方も継続して利用できます ● LANGUAGE SQL でのみ有効です – PL/PgSQL や PL/python などのプロシージャ言語ではサポー トされていません
  • 4. 記述例 ● 従来の書き方 CREATE FUNCTION f_test1(int, int) RETURNS bigint LANGUAGE sql AS 'SELECT $1 + $2;'; --AS $$ SELECT $1 + $2 $$; CREATE FUNCTION f_test2(int) RETURNS text LANGUAGE sql AS 'SELECT name FROM t WHERE id = $1;'; --AS $$ SELECT name FROM t WHERE id = $1 $$; CREATE FUNCTION fb_test1(int, int) RETURNS bigint LANGUAGE sql RETURN $1 + $2; --RETURN 式 CREATE FUNCTION fb_test2(int) RETURNS text LANGUAGE sql BEGIN ATOMIC SELECT name FROM t WHERE id = $1; -- 複数のステートメントを記述可能 END; ● 新しい書き方
  • 5. SQL-standard Function Body の特長 1 ● 関数定義時にパースされ、その結果 (Expression nodes) が pg_proc システムテーブルに格納される – 従って以降の実行時はパースがスキップされる – 従来の記述方法は実行時にパースされる – 若干ですが性能上の恩恵があるかもしれません SELECT proname, prosrc, substr(prosqlbody,1,50) as body FROM pg_proc WHERE proname IN ('f_test', 'fb_test'); proname | prosrc | body ---------+-----------------------------------+---------------------------------------------------- f_test | SELECT name FROM t WHERE id = $1; | fb_test | | (({QUERY :commandType 1 :querySource 0 :canSetTag
  • 6. SQL-standard Function Body の特長 2 ● 関数定義時にパースされるため、実行時に決定される多様型は 使えません – 多様型を使う場合は従来の書き方で・・ =# CREATE FUNCTION f_test_poly (anyelement, anyelement) RETURNS anyarray LANGUAGE sql AS 'SELECT ARRAY[$1, $2];' ; CREATE FUNCTION =# CREATE FUNCTION fb_test_poly (anyelement, anyelement) RETURNS anyarray LANGUAGE sql RETURN ARRAY[$1, $2]; ERROR: SQL function with unquoted function body cannot have polymorphic arguments
  • 7. SQL-standard Function Body の特長 3 ● 関数定義時にパースされると共に、依存関係の解析がされ pg_depend システ ムテーブルで管理されるようになります – 厳密には、関数が依存 ( 利用 ) しているオブジェクトは何か?を管理するよ うになります =# CREATE TABLE t (id int, name text); --テ ブル ー tを参照する2つの 数を作成 関 =# CREATE FUNCTION f_test(int) RETURNS text LANGUAGE sql AS 'SELECT name FROM t WHERE id = $1;'; =# CREATE FUNCTION fb_test(int) RETURNS text LANGUAGE sql BEGIN ATOMIC SELECT name FROM t WHERE id = $1; END; =# SELECT * FROM pg_depend WHERE objid = 'fb_test'::regproc; --()内情 は 足したもの 報 補 classid | objid | objsubid | refclassid | refobjid | refobjsubid | deptype ---------------+----------------+----------+--------------------+--------------+-------------+--------- 1255(pg_proc) | 16409(fb_test) | 0 | 2615(pg_namespace) | 2200(public) | 0 | n 1255(pg_proc) | 16409(fb_test) | 0 | 1259(pg_class) | 16403(t) | 1 | n 1255(pg_proc) | 16409(fb_test) | 0 | 1259(pg_class) | 16403(t) | 2 | n
  • 8. SQL-standard Function Body の特長 3 ● 関数が参照しているオブジェクトを削除する場合、 CASCADE オプションで関数も一緒に削除してくれます – スキーマ管理の運用性向上に役立つでしょう --前ペ ジからの き ー 続 =# DROP TABLE t; ERROR: cannot drop table t because other objects depend on it DETAIL: function fb_test(integer) depends on table t HINT: Use DROP ... CASCADE to drop the dependent objects too. =# DROP TABLE t CASCADE; NOTICE: drop cascades to function fb_test(integer) DROP TABLE -- 来の 述方法で作成した 従 記 function f_test(integer) は残る
  • 9. SQL-standard Function Body の特長 4 ● SQL 標準に準拠しているので、移植性が ( 多少 ) 向上します – PostgreSQL から他の DBMS へ、あるいはその逆の移行時 などに便利 ● PostgreSQL の system functions のいくつかは SQL- standard-body style に書き直されました
  • 10. まとめ ● CREATE FUNCTION/PROCEDURE の新しい記述方法がサ ポートされました – LANGUAGE SQL のみのサポートです – 多様型 (any* 型 ) を扱う場合は利用できません ● SQL 標準に沿った記述方法であり、地味ですが性能・運用 性・移植性の向上が期待できます ● 差し支えなければ、 PostgreSQL 14 以降は今回紹介した記述 方法を使うのがオススメです