
ãå"Tsurugi" TipséãTsurugi ã® BLOB ãšå±æ
Overview
ãã®èšäºã§ã¯ãTsurugi 1.3.0 ã«è©Šéšçã«å°å ¥ãã BLOB ã®ããè©³çŽ°ãªæ å ±ãšãä»åŸã®å±æã«ã€ããŠç޹ä»ããŸãã
ãªãã BLOB ã®å©ç𿹿³ã«ã€ããŠã¯ä»¥äžãåç §ããŠãã ããã
BLOB ã®æŠèŠ
Tsurugi ã¯ããŒã¿ããŒã¹å
ã®ãã¹ãŠã®ããŒã¿ãã¡ã¢ãªã«èŒãããã€ã³ã¡ã¢ãªã»ã€ã³ããã¯ã¹ãæ¡çšããããŒã¿ããŒã¹ã§ãã
ã€ã³ã¡ã¢ãªã»ã€ã³ããã¯ã¹ã¯äœã¬ã€ãã³ã·ã»é«ã¹ã«ãŒããããšããç¹åŸŽããããŸããã代ããã«ãã¹ãŠã®ããŒã¿ãã¡ã¢ãªäžã«ä¿åãããããã¡ã¢ãªã®å®¹éã«å¶éãããŸãã
ãŸããBLOB ã®ãããªå·šå€§ãªããŒã¿ãã¡ã¢ãªäžã«ä¿åãããšãã¡ã¢ãªã®å®¹éãå§è¿«ããŠããŸããä»ã®ããŒã¿ã®åãæ±ãã«åœ±é¿ãäžããå¯èœæ§ããããŸãã
ããã§ãBLOB ã«éã£ãŠã¯ã«ã©ã ã®ããŒã¿ããã¡ã€ã«ã·ã¹ãã äžã®åã
ã®ãã¡ã€ã«ã«ä¿åãããã©ã®ãã¡ã€ã«ã«ä¿åãããããšããåç
§æ
å ±ã®ã¿ãã€ã³ããã¯ã¹äžã«ä¿åããŠããŸãã
ãŸããæ°žç¶åã®éã«ããæ¹ããŠãã©ã³ã¶ã¯ã·ã§ã³ãã°ã« BLOB ã®ããŒã¿ãèšé²ããã®ã§ã¯ãªãããã§ã«ä¿åããŠãã BLOB ã®ããŒã¿ãæ°žç¶åæ
å ±ãšããŠå©çšããŸãã
BLOB ã®åç §
BLOB ãå«ãããŒãã«ã«å¯ŸããŠã¯ã©ã€ã¢ã³ãããåãåãããè¡ããšãã¯ã©ã€ã¢ã³ãã«ã¯BLOBã®åç § (Java API ã§ã¯ `BlobReference` ãªããžã§ã¯ã) ãè¿ãããŸãã
å®éã«ãTsurugi ã® SQL å®è¡ãšã³ãžã³ã§ã BLOB ã®å
容ãå©çšããããšã¯åºæ¬çã«ãªããåç
§æ
å ±ã®ã¿ãåãæ±ã£ãŠããŸãã
ãã®ãããBLOB (ããCLOB) åã®ããŒã¿ã«ã¯ä»¥äžã®ãããªå¶çŽãèšããããŠããŸã:
ã€ã³ããã¯ã¹ã®ããŒãšããŠå©çšã§ããªã
`ORDER BY` å¥ã§äžŠã¹æ¿ãã«å©çšã§ããªã
`GROUP BY` å¥ã§ã°ã«ãŒãåã«å©çšã§ããªã
`=`, `<` ãªã©ã®æ¯èŒã«å©çšã§ããªã
ãããã¯ããããããåç §ã ãã§ã¯è¡ããªããæäœã§ããããšã«èµ·å ããŠããŸãã
ãããŠãã¯ã©ã€ã¢ã³ãã¯åŸããã BLOB åç § (`BlobReference`) ãå©çšããŠãTsurugi ãã BLOB ã®å 容ãååŸã§ããŸãã
Transaction tx = ...;
BlobReference ref = ...;
tx.copyTo(ref, Path.of("/path/to/data.bin")).await();ãã®ãšããè£åŽã§ã¯ä»¥äžã®æäœãè¡ãããŠããŸãã
åãåãããè¡ããã€ã³ã¡ã¢ãªã€ã³ããã¯ã¹ãã BLOB ã®åç §ãååŸ
BLOB ã®åç §ããã®ãŸãŸçµæã»ãããšããŠã¯ã©ã€ã¢ã³ãã«æäŸ
ã¯ã©ã€ã¢ã³ãã¯åŸããã BLOB åç §ãå©çšããŠãTsurugi ã« BLOB ã®å 容ãèŠæ±
Tsurugi 㯠BLOB ã®å 容ãèšé²ããããã¡ã€ã«ãã¹ãè¿åŽ (ç¹æš©ã¢ãŒãç¹æã®åäœ)
ã¯ã©ã€ã¢ã³ãã¯è¿ããããã¡ã€ã«ãã¹ãå©çšããŠãBLOB ã®å 容ããã¡ã€ã«ã·ã¹ãã ããååŸ (ç¹æš©ã¢ãŒãç¹æã®åäœ)
äžèšã¯ãç¹æš©ã¢ãŒãããšåŒã°ããåäœã®äŸã§ãçŸåšã§ã¯ (Tsurugi 1.4.0) ã§ã¯ãã®æ¹æ³ã§ã®ã¿ BLOB ã®å
容ãåãåºãããšãã§ããŸãã
æäœã®è©³çްã«ããããã«ãç¹æš©ã¢ãŒãã§ã¯ããŒã«ã«ã®ãã¡ã€ã«ã·ã¹ãã ãä»ã㊠BLOB ã®ããŒã¿ãæåããŸãã
ãã®ãããã¯ã©ã€ã¢ã³ããš Tsurugi ã§åããã¡ã€ã«ã·ã¹ãã äžã®ãã¡ã€ã«ãåç
§ã§ããå¿
èŠããããªã©ãæ§ã
ãªå¶çŽããããŸãã
çŸåšã§ã¯ãã®å¶çŽãç·©åããããã®æ€èšãé²ããŠããã詳ããã¯ä»¥éã®ç« ã§ç޹ä»ããŸãã
BLOB ã®èšé²
Tsurugi ã¯ã€ã³ã¡ã¢ãªã»ã€ã³ããã¯ã¹ãæ¡çšããŠãããã»ãšãã©ã®ããŒã¿ã¯ã¡ã¢ãªäžã«èšé²ããŠããŸãã
ããããªãããã¡ã¢ãªã ãã«èšé²ããŠãããšãã·ã¹ãã ã®ã¯ã©ãã·ã¥ã黿ºæãªã©ã§ããŒã¿ã倱ãããå¯èœæ§ãããããããã©ã³ã¶ã¯ã·ã§ã³ã®ã³ãããæã«ã¯ããã©ã³ã¶ã¯ã·ã§ã³ãã°ãšãããã®ããã£ã¹ã¯äžã«èšé²ããŠããŸãã
Tsurugi ã®ãã©ã³ã¶ã¯ã·ã§ã³ã®ã³ãããã¯ããã¬ã³ããããšã°ã«ãŒãã³ãããã®äºæ®µéã§è¡ã£ãŠããŸãã
ãã¬ã³ãããã¯ãã©ã³ã¶ã¯ã·ã§ã³éã®ç«¶åããªããã確èªããåé¡ãªããã°ã€ã³ããã¯ã¹ã«å€æŽãåæ ããŸãã
ã°ã«ãŒãã³ãããã¯ããã¬ã³ããããæåãããã©ã³ã¶ã¯ã·ã§ã³ããŸãšããŠãã£ã¹ã¯ã«æžãã ããæ°žç¶åããŸãã
ããã§ãBLOB ã«é¢ããŠã¯ä»ã®ããŒã¿ãšåãæ±ããå°ãç°ãªããŸãã
Tsurugi ã§ã¯ãã¬ã³ããããæåããæ®µéã§ã€ã³ããã¯ã¹ã«æžãã ãããšã§ãã»ãã®ãã©ã³ã¶ã¯ã·ã§ã³ãããã®çµæãèªã¿åºããããã«ãªããŸãã
ããã¯ãã©ã³ã¶ã¯ã·ã§ã³ã®ã¹ã«ãŒããããåäžãããããã®éèŠãªèšèšã§ãããã€ã³ããã¯ã¹ã«åç
§ã®ã¿ãèšé²ããŠãã BLOB ãšã¯éåžžã«çžæ§ãæªããBLOB ã®åç
§ãã€ã³ããã¯ã¹ã«èšé²ãããæç¹ã§ãBLOB ã®å
容ããã¡ã€ã«ã·ã¹ãã äžã«ååšããªããšãã»ãã®ãã©ã³ã¶ã¯ã·ã§ã³ããåç
§ã§ããªããšããåé¡ããããŸãã
ããã§ãTsurugi 㯠BLOB ã®ããŒã¿ããã¬ã³ããããããåã«ä»®ç»é²ãšããæé ã§ãã¡ã€ã«ã«æžãã ããŠãããã°ã«ãŒãã³ãããæã«ãããã®ãã¡ã€ã«ãæ¬ç»é²ããŸãã
ããã«ãã£ãŠãBLOB åç
§ãã€ã³ããã¯ã¹ã«èšé²ãããæç¹ã§ãå°ãªããšãä»®ç»é²ããã BLOB ã®ããŒã¿ããã¡ã€ã«ãšããŠååšããããšã«ãªããã»ãã®ãã©ã³ã¶ã¯ã·ã§ã³ãããåç
§ã§ããããã«ãªããŸãã
BLOB ã®åé€
ããåãæ±ããé¢åãªã®ããBLOB ããŒã¿ã®åé€ã§ãã
Tsurugi ã« `DELETE` ãçºè¡ããŠã³ããããè¡ã£ãŠãã察象ã®è¡ãçŽã¡ã« Tsurugi ã®ã€ã³ããã¯ã¹ããåé€ãããããã§ã¯ãããŸããã
ããã¯ãTsurugi ã MVCC (Multi-Version Concurrency Control) ãæ¡çšããŠãããäžã€ã®ããŒãã«ã®è¡ã§ããåæã«è€æ°ã®ããŒãžã§ã³ãååšãããããã§ãã
ããšãã°ã LTX éå§åŸã« OCC ã§ç¹å®ã®è¡ãåé€ããŠããLTX ããã¯åŒãç¶ããã®è¡ã®ããŒã¿ãèªã¿åºãããšãã§ããŸãã
Tsurugi ã§ã¯ã(ç©ççãª) è¡ã®åé€ã¯ GC ã«ãã£ãŠè¡ã£ãŠããŸãã
MVCC ãšãã£ãŠãç¡å¶éã«ãã¹ãŠã®ããŒãžã§ã³ã«ã¢ã¯ã»ã¹ã§ããã®ã§ã¯ãªããåºæ¬çã«å€ãããããŒãžã§ã³ã«ã¯èª°ãã¢ã¯ã»ã¹ããŸããã
ãã®ãããªããŒãžã§ã³ã GC ãæ€åºããèªåçã«ã€ã³ããã¯ã¹ããåé€ããŸãã
BLOB ã®å Žåãåæ§ã«ã誰ãããåç
§ãããªããªã£ã BLOB ã®ããŒã¿ã¯ GC ã«ãã£ãŠåé€ãããŸãã
ãªããã¯ãšãªã®çµæãšããŠåŸããã BLOB ã®åç
§ãã BLOB ã®å
容ãåãåºãéã«ããåããã©ã³ã¶ã¯ã·ã§ã³å
ããè¡ããªããã°ãªããªãããšããå¶çŽããããŸããã
ãã®å¶çŽã¯ BLOB ã®åé€ã«é¢ãããã®ã§ãåäžãã©ã³ã¶ã¯ã·ã§ã³å
ã§ååŸãã BLOB 㯠GC ã«ããåé€å¯Ÿè±¡ã«ãªããŸãããããã©ã³ã¶ã¯ã·ã§ã³çµäºåŸã¯ä¿èšŒãããŸããã
å®éã«ã¯ãã°ããã®éã¯åé€ãããªããããããŸããããå®å
šæ§ãšäºæž¬å¯èœæ§ã®ããã« API ã«ã¯ãã®ãããªå¶çŽãèšããŠããŸãã
BLOB äžç¶ãµãŒãã¹ (屿)
BLOB ã«é¢ãã屿ãšããŠãçã£å
ã«æããããã®ã¯ãç¹æš©ã¢ãŒã以å€ã§ã® BLOB ã®å©çšãã§ãã
ç¹æš©ã¢ãŒãã¯æ§èœçãªæ©æµã倧ãããã®ã®ãã·ã¹ãã æ§æé¢ã§ã®å¶çŽã倧ããããŸããã¹ãæ§ã«é£ããããŸãã
ããã§ãçŸåšã¯ãBLOB äžç¶ãµãŒãã¹ (仮称)ããæ€èšããŠããŸãã
ããã¯ååã®éã BLOB ã®ããŒã¿ãæåããããã®ãµãŒãã¹ã§ãç¹æš©ã¢ãŒãã§è¡ã£ãŠãããã¡ã€ã«ã·ã¹ãã äžã§ã®ããŒã¿ã®æåã代æ¿ããŸãã
åãµãŒãã¹ã¯ Tsurugi æ¬äœã«çµã¿èŸŒãäºå®ã§ããããããŸã§ã®éä¿¡çµè·¯ (IPC/TCP endpoint) ãšã¯ç°ãªããã®ãå©çšããããšã暡玢ããŠããŸãã
æ¢åã®éä¿¡çµè·¯ã¯çްããªããŒã¿ãäœã¬ã€ãã³ã·ã§å€§éã«ããåãããããšãäŒå³ããŠããŸãããBLOB ã¯å€§ããªããŒã¿ãé«ã¹ã«ãŒãããã§æåããããšãç®çãšããŠããŸãã
äŸãã°ã以äžã®ãããªææ³ãæ€èšããŠããŸã
RDMA ã«ããããŒã¿è»¢é
åå²èªã¿åºãã®å¯Ÿå¿
ãªããBLOB äžç¶ãµãŒãã¹ã®ãããªãç¹æš©ã¢ãŒã以å€ã® BLOB ã®åãæ±ããå®çŸããŠããçŸç¶ã® API ãéããŠåæ§ã«å©çšã§ããããã«ããäºå®ã§ãã
ã€ãŸãå
ã»ã©ã®ããã°ã©ã ã¯ãç¹æš©ã¢ãŒãã®éãšåæ§ã«åäœããŸãã
Transaction tx = ...;
BlobReference ref = ...;
tx.copyTo(ref, Path.of("/path/to/data.bin")).await();å éšã®åäœã¯ä»¥äžã®ããã«ãªããŸã:
åãåãããè¡ããã€ã³ã¡ã¢ãªã€ã³ããã¯ã¹ãã BLOB ã®åç §ãååŸ
BLOB ã®åç §ããã®ãŸãŸçµæã»ãããšããŠã¯ã©ã€ã¢ã³ãã«æäŸ
ã¯ã©ã€ã¢ã³ãã¯åŸããã BLOB åç §ãå©çšããŠã BLOB äžç¶ãµãŒãã¹ã« BLOB ã®å 容ãåãåããã
BLOB äžç¶ãµãŒãã¹ã¯ãBLOB ã®å 容ãèšé²ããããã¡ã€ã«ãèªã¿åºããã¯ã©ã€ã¢ã³ãã«è»¢é
ã¯ã©ã€ã¢ã³ãã¯åãåã£ã BLOB ã®å 容ããã¡ã€ã«ã·ã¹ãã ã«ä¿å
UDF ãš BLOB (屿)
Tsurugi ã®çŸåšã®èšç»ãšããŠã UDF (User Defined Function) ã®æäŸããããŸããããã¯ããŠãŒã¶ãç¬èªã«å®çŸ©ããå€éšé¢æ°ããSQL ã®äžã§å©çšã§ããããã«ããæ©èœã§ãã
ãã ããããããã¹ãã¢ãããã·ãŒãžã£ã®ãããªãã®ã§ã¯ãªããJava ã Python ãªã©ã®èšèªã§äœæããããã°ã©ã ããSQL ã®é¢æ°ãšããŠç»é²ããããšãäŒå³ããŠããŸãã
ãšããã®ããä»åã® UDF ã¯ãTsurugi æ¬äœã«äœããããšå€§å€ãªæ©èœãã©ã®ããã«æäŸãããããšããå顿èãã¹ã¿ãŒãå°ç¹ã«ããŠããŸãã
ããã解決ãããããJava ã Python ãªã©ã®ããã°ã©ã ã gRPC ãªã©ã® RPC ãµãŒãã¹ãšããŠå€éšã«äœæããããã SQL ããåŒã³åºããããã«ããæ¹éãæ¡ããŸããã
ããã§éèŠãšãªãã®ã BLOB ã®åãæ±ãã§ãã
æè¿ã®ã·ã¹ãã ã§ã¯ãæ§æ¥ã® RDBMS ã§åãæ±ããããªæ§é åããŒã¿ã®ã¿ã§ã¯ãªããéæ§é åããŒã¿ãäŸãã°å·šå€§ãªããã¹ããç»åãåç»ãªã©ã®ãã€ããªããŒã¿ãåãæ±ãã±ãŒã¹ãå¢ããŸããã
ããããRDBMS ã«éããŠããããåŠçããããšã¯é£ãããåºæ¬çã«ã¯ RDBMS å€ã®ããã°ã©ã ãšé£æºããŠåŠçãè¡ããŸãã
ç¹ã«æããããã®ããæšä»ã® LLM ã«ä»£è¡šããã AI ç³»ã®åŠçã§ããããã¯éæ§é åããŒã¿ããæçšãªæ§é åæ
å ±ãæœåºããã®ã«ãé·ããŠããããŸãæ¥ã
æ§èœåäžãå³ãããŠããããããªãªãžãã«ããŒã¿ã®ä¿æãéåžžã«éèŠã§ãã
ããããã·ãŒã ã¬ã¹ã«é£æºããã®ã UDF ã®ç®çã®äžã€ã§ãã
çŸç¶ã§ã¯ãåè¿°ã® BLOB äžç¶ãµãŒãã¹ (仮称) ã UDF ããå©çšå¯èœã«ããèšç»ã§ãã
gRPC ãªã©ã® RPC ãµãŒãã¹ã§ã¯ãåºæ¬çã«åŒæ°ãæ»ãå€ãšã㊠BLOB ã®ãããªå·šå€§ãªããŒã¿ãåãæ±ãããšãæ³å®ããŠããŸããã
ããã§ãåŒæ°ãæ»ãå€ã¯ Tsurugi å
éšãšåæ§ã« BLOB ã®åç
§ãæåããããã«ããŠãå®éã®ããŒã¿ã®æå㯠BLOB äžç¶ãµãŒãã¹ãéããŠè¡ãããšãèããŠããŸãã
ãŸãšã
ä»åã®èšäºã§ã¯ BLOB ã«é¢ããæ
å ±ãšãä»åŸã®å±æã«ã€ããŠç޹ä»ããŸããã
çŸç¶ã® Tsurugi ã® BLOB ã¯ãŸã ãŸã å¶éãå€ããéå®çãªçšéã«ããå©çšã§ããŸããããèšäºã®ããã«å©äŸ¿æ§ã®åäžããŠãŒã¹ã±ãŒã¹ã®æ¡å€§ã«åããŠéçºãé²ããŠããäºå®ã§ãã
ãã®ä»ã®å"Tsurugi"ã䜿ãéã«åœ¹ç«ã€Tipséã¯ã³ãã©ïŒ
次äžä»£é«éRDBå"Tsurugi"ã¯ããªãŒãã³ãœãŒã¹ã§å
¬éäžã§ãã
ãã²ããŠã³ããŒãããŠã¿ãŠãè§Šã£ãŠã¿ãŠãã ããã
ããŠã³ããŒãã¯ã³ãã©ãã
https://www.tsurugidb.com/