OceanBaseÊǰ¢Àï°Í°Í¼¯ÍÅ×ÔÖ÷Ñз¢µÄ¿ÉÀ©Õ¹µÄ¹ØÏµÐÍÊý¾Ý¿â£¬ÊµÏÖÁË¿çÐпç±íµÄÊÂÎñ£¬Ö§³ÖÊýǧÒÚÌõ¼Ç¼¡¢Êý°ÙTBÊý¾ÝÉϵÄSQL²Ù×÷¡£ÔÚ°¢Àï°Í°Í¼¯ÍÅÏ£¬OceanBaseÊý¾Ý¿âÖ§³ÖÁ˶à¸öÖØÒªÒµÎñµÄÊý¾Ý´æ´¢£¬°üÀ¨ÊղؼС¢Ö±Í¨³µ±¨±í¡¢ÌìèÆÀ¼ÛµÈ¡£½ØÖ¹µ½2013Äê4Ô·ݣ¬OceanBaseÏßÉÏÒµÎñµÄÊý¾ÝÁ¿ÒѾ³¬¹ýһǧÒÚÌõ¡£
¿´ÆðÀ´Í¦À÷º¦µÄ,½ñÌìÎÒÃÇÀ´Ñо¿ÏÂËüµÄÔ´´úÂë¡£¹ØÓÚOceanBaseµÄ¼Ü¹¹ÃèÊöÓкܶàÎĵµ£¬ÕâÆª±Ê¼ÇÒ²²»´òËãÉæ¼°ÕâЩ¶«Î÷£¬Ö»ÌÖÂÛOceanBaseµÄSQL±àÒ벿·ÖµÄ´úÂë¡£
OceanBaseÊÇÒ»¸ö¿ªÔ´µÄÊý¾Ý¿â,ÍйÜÔÚgithubÉÏ,µã»÷ÏÂÔØ¡£±¾ÎÄÌÖÂÛµÄÔ´Âë·¾¶¶ÔӦΪ£ºoceanbase_0.3/src/sql¡£×îеİ汾Ϊ0.4£¬±¾ÎÄÌÖÂ۵ĴúÂë»ùÓÚ0.3°æ±¾µÄOceanBase.ĿǰOceanBaseµÄÄܽâÎöµÄSQL»¹±È½ÏÉÙ£¬°üÀ¨Select,Insert,Update,Delete,Show,ExplainµÈ.
Ñ¡ÔñOceanBase 0.3 °æ±¾½øÐÐѧϰ£¬»ùÓÚ¼¸¸öÔÒò£º
1.OceanBase µÄ¸ßÖÊÁ¿£¬¸ß¿É¶ÁÐÔ
2.OceanBase °æ±¾µÍ£¬Ã»ÓÐÀúÊ·¸ºµ£
3.OceanBase SQL½âÎöÏà¶Ô¼òµ¥£¬¸üÈÝÒ׿ú¼ûȫò£¬ÀûÓÚÀí½âÉè¼Æ¿ª·¢ÖÐÒª½â¾öµÄÖ÷ÒªÎÊÌâ¡£
4.ÓëÆäËûÊý¾Ý¿âµÄSQL½âÎö²¿·Ö½øÐжԱȣ¬ÉîÈëÀí½âÎÊÌâ±¾ÖÊ
¸Ã²¿·ÖÖ÷Òª¹¦ÄܰüÀ¨ÁË£¬SQLÓï¾ä½âÎö£¬Âß¼¼Æ»®µÄÉú³É£¬ÎïÀí²Ù×÷·ûÔËËãµÈ¡£
Èë¿Ú£ºObSqlÀà
±¾²¿·ÖµÄÈë¿Úº¯ÊýÔÚob_sql.hÖÐ,µ÷Óú¯ÊýObSql::direct_execute¿ÉÒÔÖ±½ÓÖ´ÐÐSQLÓï¾ä,²¢·µ»Ø½á¹û¼¯ObResultSet¡£º¯Êýstmt_prepareÓÃÓÚ½âÎöÒªÔ¤±àÒëµÄSQLÓï¾ä,stmt_executeÔòÓÃÓÚÖ´ÐÐPrepare¹ýµÄSQLÓï¾ä¡£
class ObSql { public: ObSql(){} ~ObSql(){} int direct_execute(const common::ObString &stmt, ObResultSet &result) int stmt_prepare(const common::ObString &stmt, ObStmtPrepareResult &result); int stmt_execute(const uint64_t stmt_id, const common::ObArray<common::ObObj> params, ObResultSet &result); int stmt_close(const uint64_t stmt_id); }; |
ÔÚ0.4°æ±¾ÖУ¬direct_execute,stmt_prepare,stmt_executeµÈº¯Êý¶¼±»ÉùÃ÷Ϊstaticº¯Êý,Òâζ×ŵ÷ÓÃSQLÓï¾äÖ´ÐÐʱ¿ÉÒÔÖ±½ÓObSql::direct_execute¿ÉÒÔÖ´ÐÐSQLÓï¾ä£¬¶ø²»±ØÔÙÏȶ¨ÒåÒ»¸öObSql¶ÔÏó¡£OceanBase»¹ÓÐÄêÇᣬ»¹´æÔÚ²»×㣬ÎÒÃÇÔĶÁÔ´ÂëʱӦ¸Ã´ø×ÅÅúÅÐ˼¿¼µÄ¾«Éñ¡£
Ö±½Ó½øÈëdirect_executeº¯Êý£¬¿ÉÒÔ¿´µ½Õû¸öÖ´ÐеĹý³Ì,º¯ÊýÖÐÓкܶàµÄif,elseÓï¾ä£¬Ö÷ÒªÊÇÒòΪOceanBaseÓÐÒ»¸ö±àÂë¹æ·¶ÒªÇó£ºÒ»¸öº¯ÊýÖ»ÄÜÓÐÒ»¸ö·µ»Ø³ö¿Ú.°´µ¥³ö¿ÚµÄ¹æ·¶Ð´´úÂë»áʹµÃд´úÂëµÄ˼··Ç³£ÇåÎú£¬²»ÈÝÒ׳öÏÖÄÚ´æÐ¹Â¶µÈÎÊÌ⣬ÔÚ´óÐÍÏîÄ¿Öл¹ÊÇÓ¦¸Ã¾¡Á¿±£³Öº¯Êýµ¥³ö¿Ú.µ±È»£¬ÎÒ¾õµÃ±£³ÖÒ»¸öº¯Êý¹¦Äܼò½à¡¢¼òµ¥Ò×¶®Ò²ÊǷdz£ÖØÒªµÄ¡£
ÔÚÄãÔĶÁÔ´ÂëµÄ¹ý³ÌÖУ¬Óöµ½µÄ´ó²¿·Öº¯Êý¶¼»áÊÇÕâ¸öÑù.ÅÙÈ¥ÆäËû¸ÉÈÅÐÅÏ¢£¬½áºÏ×¢ÊÍ£¬¿ÉÒÔ¿´µ½£¬SQLÖ´ÐзÖΪ5¸ö²½Ö裺
³õʼ»¯
½âÎöSQLÓï·¨Ê÷
parse_sql(&parse_res, stmt.ptr(), static_cast<size_t>(stmt.length())); |
ÖÆ¶¨Âß¼¼Æ»®
resolve(&logical_plan, parse_res.result_tree_)
ObMultiPlan* multi_plan = static_cast<ObMultiPlan*>(logical_plan.plan_tree_); |
Éú³ÉÎïÀí¼Æ»®£º
trans.add_logical_plans(multi_plan);
physical_plan = trans.get_physical_plan(0) |
Ö´ÐÐÎïÀí¼Æ»®£º
³õʼ»¯½ö½öÊdzõʼ»¯Ò»¸ö»º³åÇø£¬¿ÉÒÔÂÔ¹ýÀ´Ñо¿ºóÃæ¹Ø¼üµÄ4²½¡£
½âÎöSQLÓï·¨Ê÷
ÏñPostgreSQL,MySQlµÈÒ»Ñù,OceanBase²ÉÓÃlexºÍyaccϵµÄ´Ê·¨ºÍÓï·¨½âÎö¹¤¾ßÉú³ÉÓï·¨Ê÷¡£GNUϵĴʷ¨ºÍÓï·¨¹¤¾ßΪFlexºÍBison.FlexÀûÓÃÕýÔò±í´ïʽʶ±ðSQLÓï¾äÖеÄËùÓдÊÓBisonÔò¸ù¾ÝÀàËÆBNFµÄÓï·¨¹æÔòʶ±ðSQLÓïÒ壬´Ó¶ø¹¹½¨Óï·¨Ê÷¡£²»ÊìϤFlexÓëBisonµÄÍ¬Ñ§ÍÆ¼öÔĶÁ¡¶FLEXÓëBISON¡·(Ã²ËÆÎÒҲûÕÒµ½ÆäËûÀàËÆµÄÊé¼®,^_^)£¬ÀïÃæÒ²ÓÐרÃŵÄÒ»Õ½²ÊöÀûÓÃFlexÓëBisonʵÏÖÒ»¸ö¼òµ¥µÄSQL·ÖÎöÆ÷¡£
OceanBaseµÄSQLÓï·¨Ê÷ÓëPostgreSQL¸üΪÏàËÆ£¬µ«ÊÇÉè¼ÆÉÏÒ²ÓкܶàÇø±ð¡£
½ÚµãÉè¼Æ
Óï·¨Ê÷ÓÉһϵÁеĽڵ㴮Á¬¶ø³É¡£ÎÒѡȡ½ÏΪ¼òµ¥µÄUpdateÓï¾ä×÷ΪʾÀý£¬ÏÂÃæÊÇÒ»¸öÀý¾ä£º
Update student set sex="M" where name="СÃ÷";
|
ÆäSQLÓï·¨Ê÷¿ÉÒÔ±íʾΪ£º
|--Update Stmt
|--Table:student
|--TargeList:
|--sex = "M"
|--Qualifications:
|--name="СÃ÷" |
Óï·¨½âÎöµÄ×÷ÓþÍÊÇÈçºÎÓÃÊý¾Ý½á¹¹À´±íʾÉÏÃæÕâ¿ÃÓï·¨Ê÷¡£²»Í¬µÄÊý¾Ý¿âÓв»Í¬µÄ·½°¸¡£Îª¼ÓÇ¿¶Ô±È£¬ÎÒѡȡÁËPostgreSQL,RedBaseÓëOceanBase×÷Ϊ²ÎÕÕ¡£
PostgreSQLÓï·¨Ê÷µÄ½ÚµãÉè¼Æ
PostgreSQLÖÐÿһÖÖÓï·¨¶¼»áÓÐÒ»¸ö¶ÔÓ¦µÄ½á¹¹Ì壬±ÈÈç¸üÐÂÓï¾äUpdate¶ÔÓ¦µÄ½á¹¹ÌåΪUpdateStmt:
typedef struct UpdateStmt NodeTag type; /* ö¾ÙÀàÐÍ */ RangeVar *relation; /* Òª¸üÐµĹØÏµ */ List *targetList; /* Òª¸üеÄÏî */ Node *whereClause; /* ¸üÐÂÌõ¼þ */ List *fromClause; /* optional from clause for more tables */ List *returningList; /* ·µ»ØµÄ±í´ïʽÁбí */ WithClause *withClause; /* WITH clause */ UpdateStmt; |
ÆäÖÐtypeÊǸöö¾ÙÖµ,±íʾ½á¹¹ÌåµÄÀàÐÍ,ÔÚUpdateStmtÖÐΪT_UpdateStmt¡£ÆäËû×ֶηֱð¶ÔÓ¦UPdateÓï¾äµÄ¸÷¸ö²¿·Ö£¬¸Ã½á¹¹Ìå¿ÉÒÔÖ§³Ö¸ü¸´ÔÓµÄUpdateÓï¾ä¡£
PostgreSQLÖл¹ÓÐÒ»¸ö»ù´¡µÄ½á¹¹Ì壺
typedef struct Node { NodeTag type; } Node; |
ÓÃÓÚÓï·¨½âÎöµÄ½á¹¹Ìå¶¼¿ÉÒÔÇ¿ÖÆ×ª»»³ÉNode * ÀàÐÍ¡£PostgreSQLÖд«µÝÓï·¨½á¹¹ÌåÊǶ¼»áת»¯³ÉNode
*ÀàÐÍ£¬Ö»ÓÐÔÚÐèÒªÃ÷È·ÀàÐ͵Äʱºò¸ù¾Ýtypeö¾Ùֵת»»³ÉÐèÒªµÄÀàÐÍ¡£Node *µÄ×÷ÓÃÓеÄÀàËÆÓÚvoid
* ,µ«ÊǸüÀûÓÚµ÷ÊÔ¡£ÎÒÃÇÒ²¿ÉÒÔ¼òµ¥µÄÈÏΪ£ºÖîÈçUpdateStmtµÄÓï·¨½âÎö½á¹¹ÌåÃǶ¼¼Ì³Ð×ÔNode¡£
ÓÉÓÚÿ¸öÓï·¨¶ÔÓ¦Ò»¸ö½á¹¹Ì壬Òò´ËÔÚPostgreSQLÖдæÔںܶàÀàËÆµÄ½á¹¹Ì壬°üÀ¨SelectStmt,InsertStmt,DeleteStmtµÈ¡£×îÖÕÕâЩ½á¹¹Ì廹»á±»Í³Ò»×ª»»³ÉQuery½á¹¹Ìå¡£¼´QueryÊÇͳһµÄÓï·¨Ê÷½á¹¹Ìå¡£
ÔÚPostgreSQLÖУ¬Ê¾ÀýÖеÄSQLÓï·¨Ê÷¿É±íʾΪ£º
|--UpdateStmt
|--type: T_UpdateStmt
|--relation: student
|--targetList:
|--targest[0]:
|--name: sex
|--val: "M"
|--whereClause£º
|--expr: =
|--left: name
|--right: "СÃ÷" |
RedBaseµÄÓï·¨Ê÷µÄ½ÚµãÉè¼Æ
RedBaseÊÇ˹̹¸£µÄÊý¾Ý¿âϵͳʵÏÖÕâÃſγÌ(cs346)µÄÒ»¸öÏîÄ¿¡£RedBase±ÈÆðPostgreSQL,OceanBaseÕâÑùµÄ¸´ÔÓÊý¾Ý¿â¶øÑÔ£¬Ê®·ÖµÄ¼òµ¥¡£µ«ÊÇÆäÓï·¨Ê÷µÄ½ÚµãÉè¼ÆÓëÆäËûÊý¾Ý¿â²»Í¬£¬Òò´ËÌá³öÀ´×ö¶Ô±È¡£
typedef struct node{ NODEKIND kind;/*ö¾ÙÀàÐÍ*/ union{ /* SM component nodes */ /* create table node */ struct{ char *relname; struct node *attrlist; } CREATETABLE; /*´Ë´¦Ê¡ÂÔn¶à¸ö½á¹¹Ìå...*/ /* QL component nodes */ /* query node */ ... /* update node */ struct{ char *relname; /* ¹ØÏµÃû */ struct node *relattr; /* ÊôÐÔ */ struct node *relorvalue; /* Ð޸ĺóÖµ */ struct node *conditionlist; /* Ìõ¼þÁбí */ } UPDATE; /*´Ë´¦Ê¡ÂÔn¶à¸ö½á¹¹Ìå...*/ } u; } NODE; |
RedBaseÊý¾Ý¿âµÄÓï·¨Ê÷½á¹¹ÌåÖ»ÓÐÒ»¸ö£¬¾ÍÊÇNODE,µ«ÊÇÕâ¸öNODE½á¹¹ÌåµÄÉùÃ÷ÓÐ150¶àÐÐ(^-^).NODE°üÀ¨Ò»¸öö¾ÙÀàÐÍ,×÷ÓÃÓÚPostgreSQLÖеÄtypeÒ»Ñù¡£ËùÓеÄÓï·¨½á¹¹ÈçUPDATE,SELECT,CREATETABLEµÈ¹¹³É¾Þ´óµÄÁªºÏÌå¡£Õë¶ÔUpdateÓï¾äµÄ½á¹¹Ìå°üÀ¨Á˹ØÏµÃû,ÊôÐÔ,Ð޸ĺóµÄÖµ,Ìõ¼þÁбíµÈ×ֶΣ¬ÏÔÈ»ÕâÖÖÉè¼ÆÖ»ÄÜÖ§³Ö¼òµ¥µÄUpdateÓï¾ä¡£
RedBase²ÉÓá°¾ÞÐÍ¡±ÁªºÏÌåÈ¡´úPostgreSQLÖеĶà¸ö½á¹¹Ì壬ÃâÈ¥ÁËÀàÐÍת»»£¨Óï·¨½á¹¹Ìåµ½Node*µÄת»»£©¡£Èç¹û°ÑPostgreSQLÓï·¨Ê÷½Úµã¿´³ÉÊÇ¡°¼Ì³Ð¡±½á¹¹£¬ÄÇôRedBaseµÄÓï·¨Ê÷½Úµã¿ÉÒÔ¿´³ÉÊÇ¡°×éºÏ¡±½á¹¹¡£
ÔÚRedBaseÖУ¬Ê¾ÀýÖеÄSQLÓï·¨Ê÷¿É±íʾΪ£º
|--NODE:
|--kind: N_UPDATE
|--u:UPDATE
|--relname: student
|--relattr:
|--kind: N_RELATTR
|--u:RELATTR
|--relname: (null)
|--attrname: sex
|--relorvalue:
|--kind: N_RELATTR_OR_VALUE
|--u:RELATTR_OR_VALUE
|--relattr: (null)
|--value:
|--kind:N_VALUE
|--u:VALUE
|--sval = "M"
|--conditionlist:
|--kind:N_LIST
|--u: LIST
|--next: (null)
|--curr:
|--kind: N_CONDITION
|--u: CONDITION
|--lhsRelattr:
|--kind: N_RELATTR
|--u:RELATTR
|--relname: (null)
|--attrname: name
|--op:
|--kind: N_EQ
|--rhsRelattr:(null)
|--rhsValue:
|--kind:N_VALUE
|--u:VALUE
|--sval = "M"
|
OceanBaseµÄÓï·¨Ê÷µÄ½ÚµãÉè¼Æ
OceanBase µÄÓï·¨Ê÷½Úµã½á¹¹ÌåÒ²Ö»ÓÐÒ»¸ö,¸Ã½á¹¹Ìå°üÀ¨Ò»¸öö¾ÙÀàÐͱäÁ¿type_,ºÍPostgreSQLÓëRedBaseÒ»Ñù£¬´ú±í¸Ã½á¹¹Ìå¶ÔÓ¦µÄÀàÐÍ¡£»¹ÓÐÁ½×éÊôÐÔ£¬¶ÔÓ¦ÖÕÖ¹·û½Úµã,Ö»ÄÜʹÓÃvakue_ºÍstr_value_Á½¸ö×ֶΣ¬·Ö±ð¶ÔÓ¦64λÕûÐÎÖµºÍ×Ö·û´®Öµ£»·ÇÖÕÖ¹·û½ÚµãʹÓÃ×îºóÁ½¸ö×Ö¶Î,num_child_±íʾ×Ó½ÚµãµÄ¸öÊý,children_Ö¸Ïò×Ó½ÚµãÊý×éµÄÊ×µØÖ·¡£
typedef struct _ParseNode { ObItemType type_; /* ÖÕÖ¹·û½ÚµãµÄÕæÊµµÄÖµ */ int64_t value_; const char* str_value_; /* ·ÇÖÕÖ¹·û½ÚµãµÄº¢×Ó½Úµã*/ int32_t num_child_; /*º¢×Ó½ÚµãµÄ¸öÊý*/ struct _ParseNode** children_; // BuildPlanFunc m_fnBuildPlan; } ParseNode; |
¶ÔÓ¦Ò»¸ö½Úµã¶øÑÔ£¬ÒªÃ´ÊÇÖÕÖ¹·û½ÚµãҪôÊÇ·ÇÖÕÖ¹·û½Úµã£¬ËüÖ»»áʹÓÃÁ½×éÊôÐÔÖеÄÒ»×é¡£int,long,float,double,stringµÈ¶¼ÊÇÖÕÖ¹·ûÀàÐÍ£¬¿ÉÒÔ¿´³öint,long¶¼ÊÇÓÃ64λÕûÐÎint64±íʾ¡£float,double,stringÔòÓÃchar
*×Ö·û´®±íʾ¡£ÖÕÖ¹·ûµÄnum_child_Ϊ0,children_Ϊnull.
PostgreSQLµÄ×ӽڵ㶼ÊÇÓÐÃû×ÖµÄ×ӽڵ㣬¿ÉÒÔʹÓÃÃû×Ö½øÐзÃÎÊ£¬ÈçÔÚPostgreSQLÖУ¬UpdateÓï¾äµÄwhereÌõ¼þ¿ÉÒÔͨ¹ý
updatestmt.whereClause À´·ÃÎÊ ¡£ µ«ÔÚOceanBaseÖв»ÐÐ £¬ ËùÓеÄ×ӽڵ㶼ÊÇÄäÃûµÄ
£¬ Ö»ÄÜͨ¹ýϱêÀ´·ÃÎÊ¡£
´ò¸ö±È·½£¬ÔÚPostgreSQLºÍRedBaseÖУ¬º¢×ÓÊÇÓÐÃû×ֵģ¬¿ÉÒÔ½ÐСÃ÷¡¢Ð¡ºìµÈ£¬¸ù¾ÝÃû×ÖÄã´ó¸Å¿ÉÒÔÖªµÀÕâ¸öº¢×ÓÊÇÄÐÊÇÅ®£»µ«ÊÇÔÚOceanBase¼Ò£¬ËûÃÇ·Ö±ð½ÐÀÏ´ó£¬À϶þ£¬ÀÏÈý£¬ÌýÃû×ÖÍêÈ«Ìý²»³öÊÇÄÐÊÇÅ®µÄ¡£OceanBase¼ÒÓе㲻½²¾¿^-^¡£
¿ÉÒÔÔÚÔËÐÐʱ²é¿´Óï·¨Ê÷µÄ½á¹¹£¬Ò²¿ÉÒÔÔÚ´úÂëÖпÉÒÔÍÆ¸÷¸ö×Ó½Úµã´ú±íµÄÀàÐÍ£¬µ«ÊDz»ÈçPostgreSQLºÍRedBase·½±ã¡£ÔÚsql_parser.yÎļþÖУ¬¶¨ÒåÁËSQLµÄÓï·¨¹æÔò£¬Í¬Ê±Ò²¹æ¶¨Á˸÷ÖÖÀàÐ͵Ä×Ó½ÚµãµÄ½á¹¹¡£
update_stmt: UPDATE relation_factor SET update_asgn_list opt_where { ParseNode* assign_list = merge_tree(result->malloc_pool_, T_ASSIGN_LIST, $4); $$ = new_non_terminal_node(result->malloc_pool_, T_UPDATE, 3, $2, assign_list, $5); } ; |
´ÓÉÏÊö´úÂë¿ÉÒÔ¿´³ö£¬UpdateÓï·¨½á¹¹ÌåÖÐÓÐ3¸ö×ӽڵ㣬µÚÒ»¸ö±íʾ±íÃû£¬µÚ¶þ¸ö±íʾҪ¸üÐÂÁбíÏµÚÈý¸ö±íʾ¸üеÄÌõ¼þÓï¾ä¡£
ʾÀýÖеÄUpdateÓï¾äÔÚOceanBaseÖпÉÒÔ±íʾΪÈçÏÂÐÎʽ£º
|--ParseNode
|--type: T_UPDATE
|--num_child: 3
|--children[0]:
|--type: T_IDENT
|--str_value: student
|--children[1]:
|--type: T_ASSIGN_LIST
|--num_child:1
|--children[0]:
|--type: T_ASSIGN_ITEM
|--children[0]:
|--type: T_IDENT
|--str_value: sex
|children[1]:
|--type: T_EXPR
|--children[0]:
|--type: T_STRING
|--str_value: "M"
|--children[2]:
|--type: T_OP_EQ
|--num_child: 2
|--children[0]:
|--type: T_IDENT
|--str_value: name
|--children[1]:
|--type: T_IDENT
|--str_value: "СÃ÷" |
OceanBaseÖвÉÓõÄÕâÖÖ·½Ê½È±µãºÜÃ÷ÏÔ£¬¾ÍÊÇʹÓÃÕâЩ½á¹¹Ìåʱ±ØÐëÒª×Ðϸ±æ±ð¸÷¸ö×Ó½Úµã´ú±íµÄÒâÒ壬·ñÔòÈÝÒ׳ö´í¡£ÓŵãͬÑùÒ²ºÜÃ÷ÏÔ£¬¿ÉÒԷdz£Áé»îµÄ¹¹½¨³öÓï·¨Ê÷¡£
Óï·¨Ê÷µÄ½ÚµãµÄÉè¼Æ£¬Ö÷ÒªÊÇΪÁ˽â¾öÈçºÎ±í´ïÓï·¨½á¹¹¡£²»Í¬µÄÊý¾Ý¿âÓв»Í¬µÄ¾ßÌåʵÏÖ¡£OceanBase²ÉÓÃÖÕÖ¹·ûºÍ·ÇÖÕÖ¹·û·ÖÀ࣬ʹÓÃOceanBaseµÄÉè¼Æ¼«¾ßÁé»îÐÔ£¬µ«Ê¹ÓÃʱÐèÒª×ÐϸÑéÖ¤£¬±ÜÃâ³ö´í¡£
|