上一篇介紹了 8.6 AI查詢時(shí)間預(yù)測(cè)的相關(guān)內(nèi)容,本篇我們介紹“8.7 DeepSQL、8.8 小結(jié)”的相關(guān)精彩內(nèi)容介紹。
前面提到的功能均為AI4DB領(lǐng)域,AI與數(shù)據(jù)庫(kù)結(jié)合還有另外一個(gè)大方向,即DB4AI。在本章中,我們將介紹openGauss的DB4AI能力,探索通過數(shù)據(jù)庫(kù)來(lái)高效驅(qū)動(dòng)AI任務(wù)的新途徑。
數(shù)據(jù)庫(kù)DB4AI功能的實(shí)現(xiàn),即在數(shù)據(jù)庫(kù)內(nèi)實(shí)現(xiàn)AI算法,以更好的支撐大數(shù)據(jù)的快速分析和計(jì)算。目前openGauss的DB4AI能力通過DeepSQL特性來(lái)呈現(xiàn)。這里提供了一整套基于SQL的機(jī)器學(xué)習(xí)、數(shù)據(jù)挖掘以及統(tǒng)計(jì)學(xué)的算法,用戶可以直接使用SQL語(yǔ)句進(jìn)行機(jī)器學(xué)習(xí)工作。DeepSQL能夠抽象出端到端的、從數(shù)據(jù)到模型的數(shù)據(jù)研發(fā)過程,配合底層的計(jì)算引擎及數(shù)據(jù)庫(kù)自動(dòng)優(yōu)化,讓具備基礎(chǔ)SQL知識(shí)的用戶即可完成大部分的機(jī)器學(xué)習(xí)模型訓(xùn)練及預(yù)測(cè)任務(wù)。整個(gè)分析和處理都運(yùn)行在數(shù)據(jù)庫(kù)引擎中,用戶可以直接分析和處理數(shù)據(jù)庫(kù)內(nèi)的數(shù)據(jù),不需要在數(shù)據(jù)庫(kù)和其他平臺(tái)之間進(jìn)行數(shù)據(jù)傳遞,避免在多個(gè)環(huán)境之間進(jìn)行不必要的數(shù)據(jù)移動(dòng),并且整合了碎片化的數(shù)據(jù)開發(fā)技術(shù)棧。
如今,學(xué)術(shù)界與工業(yè)界在DB4AI這個(gè)方向已經(jīng)了取得了許多成果。很多傳統(tǒng)的商業(yè)關(guān)系數(shù)據(jù)庫(kù)都已經(jīng)支持了DB4AI能力,通過內(nèi)置AI組件適配數(shù)據(jù)庫(kù)內(nèi)的數(shù)據(jù)處理和環(huán)境,可以對(duì)數(shù)據(jù)庫(kù)存儲(chǔ)的數(shù)據(jù)進(jìn)行處理,最大程度地減少數(shù)據(jù)移動(dòng)的花費(fèi)。同時(shí),很多云數(shù)據(jù)庫(kù)、云計(jì)算數(shù)據(jù)分析平臺(tái)也都具備DB4AI能力。同時(shí)還可能具備Python、R語(yǔ)言等接口,便于數(shù)據(jù)分析人員快速入門。
在DB4AI領(lǐng)域,同樣具備很出色的開源軟件,例如Apache頂級(jí)開源項(xiàng)目MADlib。它兼容PostgreSQL數(shù)據(jù)庫(kù),很多基于PostgreSQL數(shù)據(jù)庫(kù)源碼基線進(jìn)行開發(fā)的數(shù)據(jù)庫(kù)也可以很容易進(jìn)行適配。MADlib可以為結(jié)構(gòu)化和非結(jié)構(gòu)化數(shù)據(jù)提供統(tǒng)計(jì)和機(jī)器學(xué)習(xí)的方法,并利用聚集函數(shù)實(shí)現(xiàn)在分布式數(shù)據(jù)庫(kù)上的并行化計(jì)算。MADlib支持多種機(jī)器學(xué)習(xí)、數(shù)據(jù)挖掘算法,例如回歸、分類、聚類、統(tǒng)計(jì)、圖算法等,累計(jì)支持的算法達(dá)到70多個(gè),在目前發(fā)布的1.17版本中MADlib支持深度學(xué)習(xí)。MADlib使用類SQL語(yǔ)法作為對(duì)外接口,通過創(chuàng)建UDF(user-defined function,用戶自定義函數(shù))的方式將AI任務(wù)集成到數(shù)據(jù)庫(kù)中。
當(dāng)前openGauss的DB4AI模塊,兼容開源的MADlib,在原始MADlib開源軟件的基礎(chǔ)上進(jìn)行了互相適配和增強(qiáng),性能相比在PostgreSQL數(shù)據(jù)庫(kù)上運(yùn)行的MADlib性能更優(yōu)。同時(shí),openGauss基于MADlib框架,實(shí)現(xiàn)了其他工業(yè)級(jí)的、常用的算法,例如XGBoost、Prophet、GBDT以及推薦系統(tǒng)等。與此同時(shí),openGauss還具備原生的AI執(zhí)行計(jì)劃與執(zhí)行算子,該部分特性會(huì)在后續(xù)版本中開源。因此,本章內(nèi)容主要介紹openGauss是如何兼容MADlib的。
MADlib的文件結(jié)構(gòu)及說(shuō)明如表8-16所示,MADlib的代碼可通過其官方網(wǎng)站獲?。篽ttps://madlib.apache.org/。
文件結(jié)構(gòu) | 說(shuō)明 | |
cmake | - | Cmake相關(guān)文件 |
? | /array_ops | 數(shù)組array操作模塊 |
/kmeans | Kmeans相關(guān)模塊 | |
/sketch | 詞頻統(tǒng)計(jì)處理相關(guān)模塊 | |
/stemmer | 詞干處理相關(guān)模塊 | |
/svec | 稀疏矩陣相關(guān)模塊 | |
/svec_util | 稀疏矩陣依賴模塊 | |
/utils | 其他公共模塊 | |
src/bin | - | 工具模塊,用于安裝、卸載、部署等 |
src/bin/madpack | - | 數(shù)據(jù)庫(kù)交互模塊 |
src/dbal | - | 詞干處理相關(guān)模塊 |
src/libstemmer | - | 工具依賴文件 |
src/madpack | - | 里面包含公共的模塊 |
src/modules | - | 關(guān)聯(lián)規(guī)則算法 |
/assoc_rules | 包括凸算法的實(shí)現(xiàn) | |
/convex | 包括條件隨機(jī)場(chǎng)算法 | |
/crf | 彈性網(wǎng)絡(luò)算法 | |
/elastic_net | 廣義線性模型 | |
/glm | 隱狄利克雷分配 | |
/lda | 線性代數(shù)操作 | |
/linalg | 線性系統(tǒng)模塊 | |
/linear_systems | 概率模塊 | |
/prob | 決策樹和隨機(jī)森林 | |
/recursive_partitioning | 回歸算法 | |
/regress | 采樣模塊 | |
/sample | 數(shù)理統(tǒng)計(jì)類模塊 | |
/stats | 時(shí)間序列 | |
/utilities | 包含pg,gaussdb平臺(tái)相關(guān)接口 | |
src/ports | - | 接口,鏈接db |
src/ports/postgres | - | 針對(duì)pg系,相關(guān)算法 |
/dbconnector | 關(guān)聯(lián)規(guī)則算法 | |
/modules | 貝葉斯算法 | |
/modules/bayes | 共軛梯度法 | |
/modules/conjugate_gradient | 包括多層感知機(jī) | |
/modules/convex | 條件隨機(jī)場(chǎng) | |
/modules/crf | 彈性網(wǎng)絡(luò) | |
/modules/elastic_net | Prophet時(shí)序預(yù)測(cè) | |
/modules/gbdt | Gdbt算法 | |
/modules/glm | 廣義線性模型 | |
/modules/graph | 圖模型 | |
/modules/kmeans | Kmeans算法 | |
/modules/knn | Knn算法 | |
/modules/lda | 隱狄利克雷分配 | |
/modules/linalg | 線性代數(shù)操作 | |
/modules/linear_systems | 線性系統(tǒng)模塊 | |
/modules/pca | PCA降維 | |
/modules/prob | 概率模塊 | |
/modules/recursive_partitioning | 決策樹和隨機(jī)森林 | |
/modules/sample | 回歸算法 | |
/modules/stats | 采樣模塊 | |
/modules/summary | 數(shù)理統(tǒng)計(jì)類模塊 | |
/modules/svm | 描述性統(tǒng)計(jì)的匯總函數(shù) | |
/modules/tsa | Svm算法 | |
/modules/validation | 時(shí)間序列 | |
/modules/xgboost_gs | 交叉驗(yàn)證 | |
src/utils | - | Xgboost算法 |
用戶通過調(diào)用UDF即可進(jìn)行模型的訓(xùn)練和預(yù)測(cè),相關(guān)的結(jié)果會(huì)保存在表中,存儲(chǔ)在數(shù)據(jù)庫(kù)上。以訓(xùn)練過程為例,MADlib在openGauss上執(zhí)行的整體流程如圖8-22所示。
前文展示了MADlib各個(gè)模塊的功能和作用,從結(jié)構(gòu)上看,用戶可以針對(duì)自己的算法進(jìn)行擴(kuò)展。前文中提到的XGBoost、GBDT和Prophet三個(gè)算法是我們?cè)谠瓉?lái)基礎(chǔ)上擴(kuò)展的算法。本小節(jié)將以自研的GBDT模塊為例,介紹基于MADlib框架的擴(kuò)展。
GBDT文件結(jié)構(gòu)如表8-17所示。
文件結(jié)構(gòu) | 說(shuō)明 |
gbdt/gbdt.py_in | python代碼 |
gbdt/gbdt.sql_in | 存儲(chǔ)過程代碼 |
gbdt/test/gbdt.sql | 測(cè)試代碼 |
在sql_in文件中,定義上層SQL-like接口,使用PL/pgSQL或者PL/python實(shí)現(xiàn)。
在SQL層中定義UDF函數(shù),下述代碼實(shí)現(xiàn)了類似重載的功能。
CREATE OR REPLACE FUNCTION MADLIB_SCHEMA.gbdt_train( training_table_name TEXT, output_table_name TEXT, id_col_name TEXT, dependent_variable TEXT, list_of_features TEXT, list_of_features_to_exclude TEXT, weights TEXT)RETURNS VOID AS $$ SELECT MADLIB_SCHEMA.gbdt_train($1, $2, $3, $4, $5, $6, $7, 30::INTEGER);$$ LANGUAGE sql VOLATILE;CREATE OR REPLACE FUNCTION MADLIB_SCHEMA.gbdt_train( training_table_name TEXT, output_table_name TEXT, id_col_name TEXT, dependent_variable TEXT, list_of_features TEXT, list_of_features_to_exclude TEXT)RETURNS VOID AS $$ SELECT MADLIB_SCHEMA.gbdt_train($1, $2, $3, $4, $5, $6, NULL::TEXT);$$ LANGUAGE sql VOLATILE;CREATE OR REPLACE FUNCTION MADLIB_SCHEMA.gbdt_train( training_table_name TEXT, output_table_name TEXT, id_col_name TEXT, dependent_variable TEXT, list_of_features TEXT)RETURNS VOID AS $$ SELECT MADLIB_SCHEMA.gbdt_train($1, $2, $3, $4, $5, NULL::TEXT);$$ LANGUAGE sql VOLATILE;
其中,輸入表、輸出表、特征等必備信息需要用戶指定。其他參數(shù)提供缺省的參數(shù),比如權(quán)重weights,如果用戶沒有指定自定義參數(shù),程序會(huì)用默認(rèn)的參數(shù)進(jìn)行運(yùn)算。
在SQL層定義PL/python接口,代碼如下:
CREATE OR REPLACE FUNCTION MADLIB_SCHEMA.gbdt_train( training_table_name TEXT, output_table_name TEXT, id_col_name TEXT, dependent_variable TEXT, list_of_features TEXT, list_of_features_to_exclude TEXT, weights TEXT, num_trees INTEGER, num_random_features INTEGER, max_tree_depth INTEGER, min_split INTEGER, min_bucket INTEGER, num_bins INTEGER, null_handling_params TEXT, is_classification BOOLEAN, predict_dt_prob TEXT, learning_rate DOUBLE PRECISION, verbose BOOLEAN, sample_ratio DOUBLE PRECISION)RETURNS VOID AS $$PythonFunction(gbdt, gbdt, gbdt_fit)$$ LANGUAGE plpythonu VOLATILE;
PL/pgSQL或者SQL函數(shù)最終會(huì)調(diào)用到一個(gè)PL/python函數(shù)。
“PythonFunction(gbdt, gbdt, gbdt_fit)”是固定的用法,這也是一個(gè)封裝的m4宏,會(huì)在編譯安裝的時(shí)候,會(huì)進(jìn)行宏替換。
PythonFunction中,第一個(gè)參數(shù)是文件夾名,第二個(gè)參數(shù)是文件名,第三個(gè)參數(shù)是函數(shù)名。PythonFunction宏會(huì)被替換為“from gdbt.gdbt import gbdt_fit”語(yǔ)句。所以要保證文件路徑和函數(shù)正確。
在python層中,實(shí)現(xiàn)訓(xùn)練函數(shù),代碼如下:
def gbdt_fit(schema_madlib,training_table_name, output_table_name, id_col_name, dependent_variable, list_of_features, list_of_features_to_exclude, weights, num_trees, num_random_features, max_tree_depth, min_split, min_bucket, num_bins, null_handling_params, is_classification, predict_dt_prob = None, learning_rate = None, verbose=False, **kwargs): … plpy.execute("""ALTER TABLE {training_table_name} DROP COLUMN IF EXISTS gradient CASCADE """.format(training_table_name=training_table_name)) create_summary_table(output_table_name, null_proxy, bins["cat_features"], bins["con_features"], learning_rate, is_classification, predict_dt_prob, num_trees, training_table_name)
在python層實(shí)現(xiàn)預(yù)測(cè)函數(shù),代碼如下:
def gbdt_predict(schema_madlib, test_table_name, model_table_name, output_table_name, id_col_name, **kwargs): num_tree = plpy.execute("""SELECT COUNT(*) AS count FROM {model_table_name}""".format(**locals()))[0]["count"] if num_tree == 0: plpy.error("The GBDT-method has no trees") elements = plpy.execute("""SELECT * FROM {model_table_name}_summary""".format(**locals()))[0]…
在py_in文件中,定義相應(yīng)的業(yè)務(wù)代碼,用python實(shí)現(xiàn)相應(yīng)處理邏輯。
在安裝階段,sql_in和py_in會(huì)被GNU m4解析為正常的python和sql文件。這里需要指出的是,當(dāng)前MADlib框架只支持python2版本,因此,上述代碼實(shí)現(xiàn)也是基于python2完成的。
這里以通過支持向量機(jī)算法進(jìn)行房?jī)r(jià)分類為例,演示具體的使用方法。
(1) 數(shù)據(jù)集準(zhǔn)備,代碼如下:
DROP TABLE IF EXISTS houses;CREATE TABLE houses (id INT, tax INT, bedroom INT, bath FLOAT, price INT, size INT, lot INT);INSERT INTO houses VALUES(1 , 590 , 2 , 1 , 50000 , 770 , 22100),(2 , 1050 , 3 , 2 , 85000 , 1410 , 12000),(3 , 20 , 3 , 1 , 22500 , 1060 , 3500), …(12 , 1620 , 3 , 2 , 118600 , 1250 , 20000),(13 , 3100 , 3 , 2 , 140000 , 1760 , 38000),(14 , 2070 , 2 , 3 , 148000 , 1550 , 14000),(15 , 650 , 3 , 1.5 , 65000 , 1450 , 12000);
(2) 模型訓(xùn)練
① 訓(xùn)練前配置相應(yīng)schema和兼容性參數(shù),代碼如下:
SET search_path="$user",public,madlib;SET behavior_compat_options = "bind_procedure_searchpath";
② 使用默認(rèn)的參數(shù)進(jìn)行訓(xùn)練,分類的條件為‘price < 100000’,SQL語(yǔ)句如下:
DROP TABLE IF EXISTS houses_svm, houses_svm_summary; SELECT madlib.svm_classification("public.houses","public.houses_svm","price < 100000","ARRAY[1, tax, bath, size]");
(3) 查看模型,代碼如下:
/x onSELECT * FROM houses_svm;/x off
結(jié)果如下:
-[ RECORD 1 ]------+-----------------------------------------------------------------coef | {.113989576847,-.00226133300602,-.0676303607996,.00179440841072}loss | .614496714256667norm_of_gradient | 108.171180769224num_iterations | 100num_rows_processed | 15num_rows_skipped | 0dep_var_mapping | {f,t}
(4) 進(jìn)行預(yù)測(cè),代碼如下:
DROP TABLE IF EXISTS houses_pred; SELECT madlib.svm_predict("public.houses_svm","public.houses","id","public.houses_pred");
(5) 查看預(yù)測(cè)結(jié)果,代碼如下:
SELECT *, price < 100000 AS actual FROM houses JOIN houses_pred USING (id) ORDER BY id;
結(jié)果如下:
id | tax | bedroom | bath | price | size | lot | prediction | decision_function | actual----+------+---------+------+--------+------+-------+------------+-------------------+-------- 1 | 590 | 2 | 1 | 50000 | 770 | 22100 | t | .09386721875 | t 2 | 1050 | 3 | 2 | 85000 | 1410 | 12000 | t | .134445058042 | t … 14 | 2070 | 2 | 3 | 148000 | 1550 | 14000 | f | -1.9885277913972 | f 15 | 650 | 3 | 1.5 | 65000 | 1450 | 12000 | t | 1.1445697772786 | t(15 rows
查看誤分率,代碼如下:
SELECT COUNT(*) FROM houses_pred JOIN houses USING (id) WHERE houses_pred.prediction != (houses.price < 100000);
結(jié)果如下:
count------- 3(1 row)
(6) 使用svm其他核進(jìn)行訓(xùn)練,代碼如下:
DROP TABLE IF EXISTS houses_svm_gaussian, houses_svm_gaussian_summary, houses_svm_gaussian_random; SELECT madlib.svm_classification( "public.houses","public.houses_svm_gaussian","price < 100000","ARRAY[1, tax, bath, size]","gaussian","n_components=10", "", "init_stepsize=1, max_iter=200" );
進(jìn)行預(yù)測(cè),并查看訓(xùn)練結(jié)果。
DROP TABLE IF EXISTS houses_pred_gaussian; SELECT madlib.svm_predict("public.houses_svm_gaussian","public.houses","id", "public.houses_pred_gaussian");SELECT COUNT(*) FROM houses_pred_gaussian JOIN houses USING (id) WHERE houses_pred_gaussian.prediction != (houses.price < 100000);
結(jié)果如下:
count -------+ 0 (1 row)
(7) 其他參數(shù)
除了指定不同的核方法外,還可以指定迭代次數(shù)、初始參數(shù),比如init_stepsize,max_iter,class_weight等。
openGauss當(dāng)前通過兼容開源的Apache MADlib機(jī)器學(xué)習(xí)庫(kù)來(lái)具備機(jī)器學(xué)習(xí)能力。通過對(duì)原有MADlib框架的適配,openGauss實(shí)現(xiàn)了多種自定義的工程化算法擴(kuò)展。
除兼容業(yè)界標(biāo)桿PostgreSQL系的Apache MADlib來(lái)獲得它的業(yè)務(wù)生態(tài)外,openGauss也在自研原生的DB4AI引擎,并支持端到端的全流程AI能力,這包括模型管理、超參數(shù)優(yōu)化、原生的SQL-like語(yǔ)法、數(shù)據(jù)庫(kù)原生的AI算子與執(zhí)行計(jì)劃等,性能相比MADlib具有5倍以上的提升。該功能將在后續(xù)逐步開源。
本章中,介紹了openGauss團(tuán)隊(duì)在AI與數(shù)據(jù)庫(kù)結(jié)合中的探索,并重點(diǎn)介紹了AI4DB中的參數(shù)自調(diào)優(yōu)、索引推薦、異常檢測(cè)、查詢時(shí)間預(yù)測(cè)、慢SQL發(fā)現(xiàn)等特性,以及openGauss的DB4AI功能。無(wú)論從哪個(gè)方面講,AI與數(shù)據(jù)庫(kù)的結(jié)合遠(yuǎn)不止于此,此處介紹的這些功能也僅是一個(gè)開端,在openGauss的AI功能上還有很多事情要做、還有很多路要走。包括AI與優(yōu)化器的進(jìn)一步結(jié)合;打造全流程的AI自治能力,實(shí)現(xiàn)全場(chǎng)景的故障發(fā)現(xiàn)與自動(dòng)修復(fù);利用AI改造數(shù)據(jù)庫(kù)內(nèi)的算法與邏輯等都是演進(jìn)的方向。
雖然AI與數(shù)據(jù)庫(kù)結(jié)合已經(jīng)取得了長(zhǎng)遠(yuǎn)的進(jìn)步,但是還面臨著如下的挑戰(zhàn)。
(1) 算力問題:額外的AI計(jì)算產(chǎn)生的算力代價(jià)如何解決?會(huì)不會(huì)導(dǎo)致性能下降。
(2) 算法問題:使用AI算法與數(shù)據(jù)庫(kù)結(jié)合是否會(huì)帶來(lái)顯著的收益?算法額外開銷是否很大?算法能否泛化,適用到普適場(chǎng)景中?選擇什么樣的算法更能解決實(shí)際問題?
(3) 數(shù)據(jù)問題:如何安全的提取和存儲(chǔ)AI模型訓(xùn)練所需要的數(shù)據(jù),如何面對(duì)數(shù)據(jù)冷熱分類和加載啟動(dòng)問題?
上述問題在很大程度上是一個(gè)權(quán)衡問題,既要充分利用AI創(chuàng)造的靈感,又要充分繼承和發(fā)揚(yáng)數(shù)據(jù)庫(kù)現(xiàn)有的理論與實(shí)踐,這也是openGauss團(tuán)隊(duì)不斷探索的方向。
感謝大家學(xué)習(xí)第8章 AI技術(shù)中“8.7 DeepSQL、8.8 小結(jié)”的精彩內(nèi)容,下一篇我們開啟“第9章 安全管理源碼解析”的相關(guān)內(nèi)容的介紹。
敬請(qǐng)期待。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/121547.html
摘要:本文整理了年月國(guó)產(chǎn)數(shù)據(jù)庫(kù)大事件和重要產(chǎn)品發(fā)布消息。柏睿數(shù)據(jù)庫(kù)加速安全卡面向全球重磅發(fā)布。月日,在全球數(shù)字經(jīng)濟(jì)大會(huì)成果發(fā)布會(huì)上,中國(guó)移動(dòng)北京分公司與國(guó)產(chǎn)數(shù)據(jù)庫(kù)領(lǐng)域新銳企業(yè)柏睿數(shù)據(jù)簽署戰(zhàn)略合作協(xié)議。本次大賽主要面向全國(guó)愛好數(shù)據(jù)庫(kù)的高校學(xué)生。 本文整理了2021年8月國(guó)產(chǎn)數(shù)據(jù)庫(kù)大事件和重要產(chǎn)品發(fā)布消息。目錄8月國(guó)產(chǎn)數(shù)據(jù)庫(kù)大事記TOP108月國(guó)產(chǎn)數(shù)據(jù)庫(kù)大事記時(shí)間線產(chǎn)品/版本發(fā)布兼容認(rèn)證8月排行榜新增...
摘要:年月國(guó)產(chǎn)數(shù)據(jù)庫(kù)流行度排行榜前名達(dá)夢(mèng)本月分?jǐn)?shù)下跌,總分,位于榜單第二位。人大金倉(cāng)保持增長(zhǎng)態(tài)勢(shì),本月分?jǐn)?shù)大幅上漲,總分,位于榜單第九位。達(dá)夢(mèng)入選其中,位列總榜第國(guó)產(chǎn)數(shù)據(jù)庫(kù)第。月日,人大金倉(cāng)與天津科大正式簽訂聯(lián)合人才培養(yǎng)協(xié)議。2021年11月國(guó)產(chǎn)數(shù)據(jù)庫(kù)流行度排行榜前15名 ? 達(dá)夢(mèng)本月分?jǐn)?shù)下跌10.88,總分467.45,位于榜單第二位。作為具有完全自主知識(shí)產(chǎn)權(quán)的國(guó)產(chǎn)數(shù)據(jù)庫(kù)廠商,今年達(dá)夢(mèng)的...
.markdown-body{word-break:break-word;line-height:1.75;font-weight:400;font-size:15px;overflow-x:hidden;color:#333}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body...
摘要:年月國(guó)產(chǎn)數(shù)據(jù)庫(kù)流行度排行榜前名連續(xù)三個(gè)月的分?jǐn)?shù)下跌讓名次下降一位,以分的總分來(lái)到榜單第三。國(guó)產(chǎn)數(shù)據(jù)庫(kù)流行度排行榜與趨勢(shì)變化本月分?jǐn)?shù)下跌,總分,位于榜單第五。 2021年10月國(guó)產(chǎn)數(shù)據(jù)庫(kù)流行度排行榜前15名 連續(xù)三個(gè)月的分?jǐn)?shù)下跌讓OceanBase名次下降一位,以424.83分的總分來(lái)到榜單第三。本月,OceanBase有幾個(gè)重要事件,如亮相2021中國(guó)國(guó)際服務(wù)貿(mào)易交流會(huì),參與HICOO...
閱讀 3178·2023-04-25 19:09
閱讀 3888·2021-10-22 09:54
閱讀 1763·2021-09-29 09:35
閱讀 2919·2021-09-08 09:45
閱讀 2263·2021-09-06 15:00
閱讀 2775·2019-08-29 15:32
閱讀 1040·2019-08-28 18:30
閱讀 376·2019-08-26 13:43