大家好,又見面了,我是你們的朋友全棧
修改記錄
時間 | 內容 |
---|---|
2020年9月13日 | 第一次發布 |
? 分析型數據庫AnalyticDB(原名 ADS)是阿里巴巴針對海量數據分析自主研發的實時高并發在線分析系統,可以針對萬億級別的數據進行多維度分析透視和業務探索。采用分布式計算,具有強大的實時計算能力。
? 主要特點就是實時和高并發,可以針對萬億級別的數據進行多緯度分析透視和業務探索。
? AnalyticDB數據庫支持多種列數據類型,如下:
– 待補充
? ADS邏輯存儲對象包括:數據庫、表組、表,其中表分為維度表和事實表。
? 數據庫,database 或 schema,在ADS中是最?層的對象,按數據庫進?資源的分配、隔離和管理,實現了多租戶的管理能?。
? 表組(table group)是?系列數據表的集合,通常將同?業務下的表歸屬到?個表組,便于表的分類和管理。
就是統一業務類型的表集合。
? 在ADS的LM引擎下,還要求Join的兩張表是同一表組,而MMP引擎則沒有這個要求。
? 分析型數據庫中表組分為兩類:維度表組和事實表組。
? 一個數據庫可以創建多個表組。
CREATE TABLEGROUP [db_name.]tablegroup_name;
? 表按數據倉庫模型分為:
表按更新模式分為:
? ADS?持2級分區策略,將表數據分布到不同的節點,?級分區采?hash算法,?級分區采?list 算法。
? 一級分區方式大致和Hive的HashPartitioner一樣。
? 如下圖所示,事實表按ID進??級分區,通過CRC32算法將不同ID值分布到不同的節點。?級分區 采?按?期(bigint類型)進?分區–每天?個?級分區。
? HASH分區是事實表的一級分區,說明如下:
? LIST分區是事實表的二級分區,說明如下:
? AnalyticDB為解決?數據索引的問題,采?默認模式預先為所有列創建索引,可以在明確表的某?列不需要索引情況,可以顯式的disable index。(牛逼。。。)
? AnalyticDB為每個分區?動創建了下列索引:
對于倒排索引的解釋參考:https://blog.csdn.net/starzhou/article/details/87519973
? AnalyticDB的realtime類型的表必須包含主鍵字段,AnalyticDB?持realtime表insert/delete,通過主鍵進?相同記錄的判斷,確定唯?記錄。
? 像前面介紹表,實時表可以通過delete、insert的方式更新數據,而在插入數據時就要根據主鍵來判斷唯一值。
? 主鍵組成:(業務id+?級分區鍵+?級分區鍵),有些情況,業務id與?級分區相同。對于記錄量特別?的表,從存儲空間和insert性能考慮,?定要減少主鍵的字段數。在之前的公司,有用多個列的MD5值來作為主鍵的。
注意:
? ADS支持將一列或多列進行排序,保證該列值相同或相近的數據存儲在磁盤同一位置,這樣的列叫做聚集列。
? 它的好處是,當以聚集列為查詢條件時,查詢結果保存在磁盤相同位置,可以減少IO次數,提高查詢性能。
? 由于主聚集列只有?列,因此需要最合適的列作為主聚集列,聚集列的選擇如下:
? 基本原理: AnalyticDB數據按列存儲,對每列按固定記錄數切塊,作為IO的基本單位。如果數據塊太?,容易導致單塊有效數據量?例較?,增加單次IO latency;反之如果數據塊太?,會增加IO次數,影響查 詢性能。
? 配置建議: 需要根據業務本身查詢特點,?戶選擇合適的塊??。對于包含聚集列(單塊中有多條有效數據)或者內存資源較為充?情況下,適合采?較?的塊??(超過或等于32760);反之如果沒有聚集列,同時查詢結果的列個數?特別多時,建議設置較?的塊??。?前AnalyticDB默認塊??為32760。
? 注意:修改塊??只對新導?(或基線合并)的數據有效,對歷史數據?效。
– 待補充
? 多值列是AnalyticDB特有的數據類型
? 暫時參考《阿里云 專有云企業版 V3.7.1 分析型數據庫 用戶指南 20190124》 – 6.2.2
? AnalyticDB支持通過界面操作或SQL操作來創建事實表組。
? 在AnalyticDB數據庫中,您只可以創建事實表組,維度表組是唯一的,在創建數據庫時自動生成,命名為數據庫名*_dimension_group*。
CREATE TABLEGROUP ads_demo--表組名options(minRedundancy=2 executeTimeout=30001;--設置選項:副本數、超時時間
? 事實表組創建完成后,后續可根據實際需要修改事實表組的最小副本數和超時時間,但不支持修改表組名稱。
? 同樣支持界面修改和SQL修改。
ALTER tablegroup ads_demo minRedundancy = 4;
? 當想刪除某個表組時,必須要先刪除該表組下的所有表,然后才能刪除表組。
? 只支持SQL刪除。
drop TABLEGROUP ads_demo;
-- 示例-- 創建事實表CREATE TABLE t_fact_orders(order_id varchar COMMENT '',customer_id varchar COMMENT '',goods_id bigint COMMENT '',numbers bigint COMMENT '',total_price double COMMENT '', order_time timestamp COMMENT '',order_date bigint COMMENT '',PRIMARY KEY (order_id, customer_id, order_date) )PARTITION BY HASH KEY (customer_id) PARTITION NUM 128--一級分區 + 分區數SUBPARTITION BY LIST KEY (order_date)--二級分區 + 二級分區最大分區數SUBPARTITION OPTIONS (available_partition_num = 90)--[CLUSTERED BY (col3,col4)] --CLUSTERED BY ?句?于指定聚集列TABLEGROUP ads_demo--指定表組,同一表組的表才能hash joinOPTIONS (UPDATETYPE = 'realtime')--創建一張實時更新表,帶主鍵,如果 updateType選項不填則默 認為批量更新表COMMENT '';-- 創建維度表:CREATE DIMENSION TABLE t_dim_goods (goods_id bigint comment '',price double comment '',class bigint comment '',name varchar comment '',update_time timestamp comment '',primary key (goods_id)) OPTIONS (UPDATETYPE = 'realtime');--維度表比較簡單,用dimension指定就可以到維度表組
? 創建表成功后,表的列、一級分區、表名、表組、更新方式均不可更改(除非重建),但您可以修改查詢超時時間、聚集列、注釋,并且可以新增列。
-- 增加列ALTER TABLE t_fact_orders ADD new_col varchar;-- 二級分區數是可以修改的,最??級分區數?前可以在建表后進?在線修改ALTER TABLE [db_name.[table_name subpartition_available_partition_num = N;-- 刪除表drop TABLE tab_01;-- 查看表中字段的順序SHOW CREATETABLE db_name.table_name;
? ADS默認為所有列創建index,同時可以?持選擇性取消列的索引。
? 什么時候該選擇取消索引,參考原則:
創建表時指定某列為 disableIndex true,則會取消該列的索引;創建表后,不支持修改索引。
-- 取消索引示例CREATE TABLE t_fact_orders(order_id varchar COMMENT '',customer_id varchar COMMENT '',goods_id bigint COMMENT '',numbers bigint disableIndex true COMMENT '',total_price double disableIndex true COMMENT '',...
? AnalyticDB 支持 JSON 數據類型和 JSON 索引。
? 創建表時,您可以指定列為 JSON 數據類型,語法示例如下:
CREATE TABLE t_fact_json (id int COMMENT '',data json, PRIMARY KEY (id) )PARTITION BY HASH KEY (id) PARTITION NUM 16TABLEGROUP ads_demoOPTIONS (UPDATETYPE='realtime')COMMENT '';
? 創建表時,您可通過 jsonIndexAttrs ‘’ 語法指定要為JSON 中的哪些屬性構建索引。如果不帶 jsonIndexAttrs ‘<attributes to be indexed>’ ,則表示對 JSON 的所有屬性都構建索引。注意,這里是說的對Json字段里面細分的哪些屬性。
CREATE TABLE t_fact_json (id int COMMENT '',data json jsonIndexAttrs '$.name, $.company.company_address' comment '',--這里對json構建索引PRIMARY KEY (id) )PARTITION BY HASH KEY (id) PARTITION NUM 16TABLEGROUP ads_demoOPTIONS (UPDATETYPE = 'realtime')COMMENT '';
? 插入數據示例:
insert into t_fact_json (id, data) values(0, '{"id":0,"name":"tjy", "age":0}');
? 查詢數據:
select * from t_fact_json where json_extract(data, '$.company') = 'alibaba';
? AnalyticDB 會在 FRONTNODE 節點構建本地 local 的內置數據庫引擎,內置數據庫引擎存儲一定量的本地數據緩存表(Cache Table),以便您快速對本地單表進行查詢。
? 基于Cache table,您可進行一定范圍內的高效的分頁數據查詢。但 Cache Table 只能作為臨時存儲,不能作為永久性存儲。
CREATE TABLE cache.table_name OPTIONS(cache=true)ASSELECT * FROM table_name;
/* +cache_id = 1683065103.38806.6.0.082539 */select * FROM cache.test_cache_table_1;
/* +cache_id = 1683065103.38806.6.0.082539 */drop TABLE cache.test_cache_table_1;
? 在 AnalyticDB 中,只有實時更新表(realtime)支持 DML 語言,批量更新表(batch)不支持。實時更新表支持的 DML 語句包括:insert 和 delete。
? 可以用insert插入實時更新表,插入后有延遲,約一分鐘后能查到數據。
? 一次提交16KB數據時,數據庫性能處于最佳狀態?,F場實際使用時,建議根據表行長來確定一次提交的記錄數 N ,N = 16KB/rowsize。
insert INTO table_name [ ( column [, ... ] ) ] VALUES [(),()]insert INTO db_name.target_table_name [ ( column [, ... ] ) ]select col1, ... FROM db_name.source_table_name where ...;-- 或者能保證字段順序下:insert INTO table_name(co1,col2,col3,...) VALUES(?,?,?,...)insert INTO db_name.target_table_nameSELECT col1, ... FROM db_name.source_table_nameWHERE ...;
? insert和insert IGNORE的區別如下:
? 在實際應用中,您可根據業務應用的需求來選擇 insert 或 insert IGNORE 語句。
? insert FROM select 語句支持在LM(Local-Merge)、 MPP 和Native MPP三種引擎模式執行。
/*+engine=COMPUTENODE*/insert INTO db_name.target_table_name (col1, col2, col3)select col1, col2, col3 FROM db_name.source_table_nameWHERE col4 = 'xxx';
/*+engine=MPP*/insert INTO db_name.target_table_name (col1, col2, col3)select col1, col2, col3 FROM db_name.source_table_nameWHERE col4 = 'xxx';
/*+engine=MPP, mppNativeInsertFromSelect=true*/INSERTINTO db_name.target_table_name (col1, col2, col3)select col1, col2, col3 FROM db_name.source_table_nameWHERE col4 ='xxx';
? 當通過 insert FROM select 語句插入大量數據(1000萬條以上的記錄)時,您需要進行長時間的等待,此時您可通過 run_async=true Hint 來進行異步化執行。
? 進入異步化執行的語句后,可以通過查詢元數據表 information_schema.async_task 來查看三天內異步化任務的執行狀態,STATUS字段為SUCCESS執行成功,如下:
-- 加run_async=true hint來進入異步化執行-- sql執行后會返回異步化執行的ID/*+run_async=true, engine=mpp, mppNativeInsertFromSelect=true*/insert INTO tpch_junlan.insert_from_select_testSELECT * FROM lineitem;--返回:+-----------------------------------+| ASYNC_TASK_ID |+-----------------------------------+| xxxxx_19010_1501141772740 |+-----------------------------------+select * FROM information_schema.async_taskWHERE id = 'xxxxx_19010_1501141772740';--返回:+------------+-----------------------+-----------------------+| CLUSTER_NAME | TABLE_SCHEMA | ID | TASK_NAME | STATUS | MESSAGE | PROCESS_ID | COMMAND | CREATOR_ID | CREATE_TIME| UPDATE_TIME |+--------------+--------------+-----------------------------------| dailybuild | tpch_junlan | xxxxx_19010_1501141772740 | InsertFrom select | SUCCESS | task has been processed successfully. | 2017072715493210008113606009999000098 | insert into tpch_junlan.insert_from_select_test select * from lineitem | $ | 2017-07-27 15:49:33.0 | 2017-07-27 15:50:02.0 |+--------------+--------------+-----------------------------------
? 實時更新表可以delete表中的部分數據,但批量更新表是不可以刪除數據的,只能整表drop掉。
? 注意:
? AnalyticDB目前擁有 COMPUTENODE Local-Merge(簡稱LM))和 Full MPP Mode(簡稱MPP)兩套計算引擎,兩種計算引擎在 select 查詢時各有優缺點。同時,您還可通過Hint強制指定計算引擎。
? LM是ADS默認的引擎,MMP是新增的引擎,兩者區別如下:
對比項 | LM | MPP |
---|---|---|
優缺點 | 計算性能很好、并發能力強,但對部分跨一級分區列的計算支持差。 | 計算功能全面、支持跨一級分區列的計算,但查詢響應時間和并發能力不如 LM 。 |
Hint寫法 | /* +engine = COMPUTENODE */ | /* +engine = MPP */ |
? 個人理解兩者的區別就是LM的計算性能和并發能力都比MMP強,但是在對一些復雜的查詢或者跨一級分區列的查詢不支持,比如數學函數、窗口函數、Group by僅非分區列等這種LM無法做到;
? 而MPP雖然計算性能和并發沒有LM那么好,但具備LM所不支持的計算功能,這兩者應該是互補關系。
交集:Intersect & Intersect distinct(交集后去重):返回兩個查詢結果的交集
并集:Union All & Union
差集:Minus :(返回僅存在于左查詢結果集而不在右查詢結果集的數據行)
MPP模式下的差集是用Except
? SHOW 語句,您可以查詢用戶的數據庫、表組、表信息,查詢表的列信息,查詢表的 DDL 建表語句,以及查詢正在運行的 MPP 任務等
-- 查詢用戶的數據庫列表-- 指定 EXTRA 參數,輸出關于數據庫的更多信息SHOW DATABASES [LIKE 'name_pattern'] [EXTRA];-- 查詢用戶當前數據庫下的表組列表SHOW TABLEGROUPS;SHOW TABLEGROUPS IN ads_demo;-- 查詢用戶當前數據庫(或表組)下的表的列表SHOW TABLES [IN db_name[.tablegroup_name]]-- 查詢表的列信息SHOW COLUMNS IN table_name;-- 查詢表的 DDL 建表語句。SHOW CREATE TABLE [db_name.]table_name;-- 查詢當前正在運行的 MPP 任務-- 如果指定 /*+cross-frontnode=true*/ Hint,則查詢當前數據庫實例所有正在運行的 MPP 任 務,否則只查詢當前連接的 FRONTNODE 節點實例運行的 MPP 任務。[/*+cross-frontnode=true*/] SHOW PROCESSLIST MPP;
– 待補充
? 數據入庫方式:AnalyticDB 中表的數據更新方式包括批量更新和實時更新兩種,批量更新方式對應的 SQL 命令為LOAD DATA 批量導入,實時更新方式對應的 SQL 命令為 insert。
? AnalyticDB 支持多種數據入庫方式,包括但不限于以下方式:
? 注意事項:
? 在 DMS For AnalyticDB 控制臺,選擇菜單欄中的導入導出 > 導入。
? 如果 MaxCompute 的數據類型是以下類型,則必須手動改寫成 AnalyticDB 支持的類型。
? AnalyticDB 目標表的列名要與源表中的列名一致。MaxCompute 源表的列類型與 AnalyticDB 目標表的對應的列類型可以不一致,但二者必須能夠成功轉換
? 如果發生長尾,需要檢查分區鍵是否合理,數據分布是否均勻,可以檢查MaxCompute源表,按分區列group by并計算count():
odps@ garudadc>select __aid, count(*) as countfrom dmj_ex_1.allcase_actiongroup by __aid order by count desc limit 5--返回結果:+------------+------------+| __aid | count |+------------+------------+| 0 | 2124978 || 9 | 5197 || 6 | 5185 || 1 | 5172 || 5 | 5097 |+------------+------------+
? 通過大數據開發套件(DataWorks)的數據集成任務里的數據同步進行操作。
? 這兩部分用到時參考官方文檔,這里不做說明。
– 待補充
– 待補充
? ADS的事實表支持二級分區策略,一級分區采用Hash算法,二級分區采用List算法,通過二級分區策略,ADS可將表數據分布到不同節點。
? 在ADS中,事實表的邏輯存儲如下圖:
? 如上圖,事實表一級分區按id進行求hash值,然后在對分區總數m求模運算,以此來將不同id值的數據分布到不同節點。
? 事實表的二級分區則按日期進行分區。單個二級分區的記錄數不宜太小,比如:如果每天有2000萬新增數據(每個一級分區每天新增記錄數:2000萬/32 = 62萬),則建議按周劃分二級分區(每個二級分區的總記錄數:62萬*7天 = 434萬)。如果每天有300萬新增數據,則建議按月劃分二級分區。
? 在ADS中,維度表的邏輯存儲則比較簡單,采用復制的方式存儲在每個節點上。如下:
? 在 AnalyticDB 中,數據表的分區存儲示意圖如下:
? 可以把下圖當做6.1.1 的補充。
? 基本原理:AnalyticDB 的表一級分區采用 HASH 分區,可指定任意一列(不支持多列)作為分區列。HASH 分區通過標準 CRC 算法計算出 CRC 值,并將 CRC 值與分區數作模計算,得出每條記錄的分區號。
? 在 AnalyticDB 中,調度模塊會將同一個表組下所有表的相同分區分配在同一個計算節點上。因此,當多表使用分區列進行 JOIN 時,單計算節點內部直接計算,避免了跨機計算。
? 在ADS中,一級分區的選擇依據如下(按優先級從高到低排):
? 一級分區個數選擇:
? 一般情況下,每個一級分區下會包含多個二級分區。二級分區主要用于解決數據表需要按固定時間周期(例如:天、周、月、年)增加數據的問題,一般也是選擇為按天、周、月、年這樣時間特征的字段,同時二級分區還考慮了保留一定時間范圍的歷史數據。
? 二級分區采用 LIST 分區,不同值的個數即為二級分區數。
? 二級分區列是數據表中的一個 bigint 類型的列,通常為bigint類型的日期,如2020090310
? 二級分區適用場景:一般情況下,當一級分區數據量隨時間增大到超過單個一級分區記錄數最佳推薦值(2000萬~3000萬)時,需要考慮設計二級分區。二級分區可以理解為按隊列方式管理分區個數,當超過最大定義數,最小值分區自動刪除,循環使用空間,所以二級分區支持自動清除歷史數據。
? 但是如果二級分區數過多,則會導致多次索引查詢、性能下降,并且二級分區有自身的元數據信息,過多也會導致占用更多的內存。如果過少,則導致用戶導入數據頻率降低,從而影響數據實時性。
? 一般情況下,如果單個分區每日增量數據超過300萬,則推薦按天進行二級分區;如需要存儲的時間范圍更長,則可按周、月進行規劃。如果有二級分區,則保證一級分區下的每個二級分區的記錄數在300萬條到2000萬條之間。另外雖然單表的最大二級分區數支持365*3個,但單表二級分區數推薦小于等于90,同時每個計算節點上總的二級分區個數不超過10 000個。
可以通過 DMS 管理工具修改表的聚集列。實時更新表修改后,新插入(insert)的數據在optimize 后才會生效。
? 在ADS中,實時更新表必須包含主鍵,同時數據的insert和delete操作都要根據主鍵來判斷唯一記錄。但ADS的主鍵構成和其他數據庫有所不同,如下,可以是其他鍵的組合。
? 主鍵組成:業務 ID + 一級分區鍵 + 二級分區鍵。
? 如果表記錄數特別大,從存儲空間和 insert 性能考慮,一定要減少主鍵的字段數。
? 最主要的還是要從業務角度確保生成的主鍵在該表能代表唯一值。
因此,建議在選擇列的數據類型時盡可能使用數值類型,減少使用字符串類型。
? 建表指導原則:
? 數據傾斜即數據在數據庫中的存儲分布不均衡,引起數據傾斜常見原因如下:
? 數據傾斜會給 AnalyticDB 帶來存儲溢出、計算長尾問題,從而導致數據庫業務中斷、查詢超時。
? 具體來說:
? 在創建表前,您必須進行充分的業務數據調研和數據傾斜驗證,以規避數據傾斜。
? 為規避數據傾斜,按一級分區列選擇原則選擇一級分區后,還需要注意以下事項:
調研一級分區不同值個數,一般要求不同值個數是設置的一級分區數的N倍,N要大于10,否則要進行第二步
select count(distinct 一級分區列) from tab
對一級分區鍵group by統計分區的數據總數來檢查數據是否分布均勻
select 一級分區, count(*) from tab group by 一級分區列 order by count(*) desc
檢查是否有空值(’’),并查詢空值的數據量
select count(*) from t_fact_mail_status where org_code='';
– 待補充
版權聲明:本文內容由互聯網用戶自發貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如發現本站有涉嫌侵權/違法違規的內容, 請發送郵件至 舉報,一經查實,本站將立刻刪除。
192438.html
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
網絡推廣與網站優化公司(網絡優化與推廣專家)作為數字營銷領域的核心服務提供方,其價值在于通過技術手段與策略規劃幫助企業提升線上曝光度、用戶轉化率及品牌影響力。這...
在當今數字化時代,公司網站已成為企業展示形象、傳遞信息和開展業務的重要平臺。然而,對于許多公司來說,網站建設的價格是一個關鍵考量因素。本文將圍繞“公司網站建設價...
在當今的數字化時代,企業網站已成為企業展示形象、吸引客戶和開展業務的重要平臺。然而,對于許多中小企業來說,高昂的網站建設費用可能會成為其發展的瓶頸。幸運的是,隨...
歪歪如何設置鮮花?斜置花的方法如下:1。當等級達到16級時,可以送出一束鮮花。在我的花里,你可以設定一束花的數目。2. 渠道經理可以根據當前渠道刷花的情況,禁止送花或調整花的大小?;ǖ拇笮〔煌簑aiwai voice是廣州多灣信息技術有限公司開發的基于互聯網的團隊語音通信平臺,是一款功能強大、音質清晰、安全穩定、不占用資源、適合游戲玩家的免費語音軟件。在網絡上通常用YY來表示。簡而言之,它是一種...
泰國龍普托大師330年肉身不壞是真的嗎? ;師父龍佩是大成王朝時期的傳奇圣僧。因為他是傳說中的圣僧,沒有正統的歷史記載,只有寺廟本身的記載,沒見過肉身,也沒聽說過肉身不壞。需要注意的是,有很多不法商人把蠟像當肉吃。滿意我的回復,請接受回答,謝謝。泰國龍普托大師330年肉身不壞是真的嗎? ;師父龍佩是大成王朝時期的傳奇圣僧。因為他是傳說中的圣僧,沒有正統的歷史記載,只有寺廟本身的記載,沒見過肉身...
汽車中控屏上的廣告怎么去除?在手機桌面點擊【網址導航】。進入界面點擊【我的】。直接進入我的界面點擊右上角的設置圖標。剛剛進入設置界面點擊【廣告過濾設置】。再次進入下一步,然后把把【廣告過濾開關按鈕】的按鈕自動打開表就行。艾酷neo5怎么設置側邊返回?進入到系統設置--系統導航--導航手勢,選擇“側邊前往”表就行。艾酷大屏導航工廠密碼是多少?3368密碼是3368。大部份車機的工廠密碼也是3368,...