閱讀429 返回首頁    go 財經資訊


7.3 表結構優化__第七章 性能優化和診斷_使用手冊_分析型數據庫-阿裏雲

分區列選擇

基本原理分析型數據庫的表一級分區采用hash分區,可指定任意一列(不支持多列)作為分區列,然後采用以下標準CRC算法,計算出CRC值,並將CRC值模分區數,得出每條記錄的分區號。空值的hash值與字符串”-1”相同。

  1. private static long getCRC32(String value) {
  2. Checksum checksum = new CRC32();
  3. byte[] bytes = value.getBytes();
  4. checksum.update(bytes, 0, bytes.length);
  5. return checksum.getValue();
  6. }

分析型數據庫的調度模塊會將同一個表組下所有表的相同分區分配在同一個計算節點上。好處在於,當出現多表使用分區列join時,單計算節點內部直接計算,避免跨機計算。

分區列選擇依據(按優先級高低排序):

  1. 如果有多個事實表(不包括維度表)進行join,選擇參與join的列作為分區列。

如果有多列join怎麼辦?可根據查詢重要程度或者查詢性能要求(例如某SQL的查詢頻率特別高),選擇某列作為分區列,這樣可以保證基於分區列join的查詢性能具有較好的性能。

  1. 選擇group by 或distinct 包含的列作為分區列。

  2. 選擇值分布均勻的列,不要選擇分區傾斜的列作為分區列。

  3. 常用SQL包含某列的等值或in查詢條件,選擇該列作為分區列。

例如:

select * from table where id=123 and ….;

select * from table where user in(1, 2,3);

一級分區個數

基本原理

分析型數據庫的COMPUTENODE Local/Merge計算引擎(大部分查詢主要的計算引擎),會在每個分區並行計算,每個分區計算使用一個線程,分區計算結果匯總到FRONTNODE。因此分區數過小,會導致並發低,單查詢RT時間長。而如果分區數過多,會導致計算結果數過多,增加FRONTNODE壓力;同時由於分區數過大,更容易產生長尾效應。因此需要根據資源配置和查詢特點,選擇合適的分區數。

一級分區個數選擇依據

注意:一級分區數不可修改。如需修改,必須刪表重建。

  • 參快速join的多個事實表分區數必須相同。
  • 單分區的數據記錄數建議為300萬條到2000萬之間。如果為二級分區,保證每個一級分區下的二級分區的記錄數為300萬條到2000萬條之間。
  • 分區數應該大於ECU數量 X 6,同時需要考慮到將來擴容。例如:某DB為8個C1,則分區數需要大於8*6=48。
  • 單表一級分區數最大值為256。在某些極其特殊的環境中,可能最大值為512。
  • 單計算節點的分區數(包括二級分區)不能超過1萬。

二級分區表適用場景以及二級分區保留個數設置

基本原理

二級分區主要是解決數據按固定時間(例如,天,周,月)增量導入,同時需要保留曆史數據設計的。每個一級分區下會包含多個二級分區,其中每個二級分區的分區列值(通常為日期)相同,並作為一個完整的索引構建單元(每次導入產生一個二級分區)。

在執行查詢過程,計算引擎能夠自動根據查詢條件,篩選出滿足的二級分級,然後對每個符合條件的二級分區執行計算。

如果二級分區過多,由於每個二級分區作為獨立查詢單元,導致多次索引查詢,性能下降;同時由於每個二級分區有獨立的meta,因此會占用更大內存。如果二級分區較少的話,用戶導入頻率會降低,會影響數據的實時性。因此用戶需要根據實際情況綜合評估合理的二級分區更新間隔,以及保留個數。

最佳實踐

單表二級分區數小於等於90,同時每個計算節點上總二級分區個數不超過1萬個。每個一級分區下的二級分區包含的數據條數在300萬到2000萬之間。

聚集列的選擇和設置

基本原理

分析型數據庫數據存儲支持按一列或多列排序(先按第一列排序,第一列相同情況下,使用第二列排序),保證該列值相同或相近的數據在磁盤同一位置。它的好處是,當以聚集列為查詢條件時,查詢結果保存在磁盤相同位置,可以減少IO次數。由於主聚集列隻有一列,因此需要最合適的列作為主聚集列。

聚集列選擇依據

  • 主要或大多數查詢條件包括這一列,且該條件具有較高的篩選率。
  • Join 等值條件列(通常為一級分區列)作為聚集列。

列類型選擇

基本原理AnalyticDB處理數值類型的性能遠好於處理字符串類型。原因在於:

  • 值類型定長,占用內存少,存儲空間小;
  • 數值類型計算更快,尤其是join時;

因此,強烈建議用戶盡可能使用數值類型,減少使用字符串類型。

常見將字符串轉換為數值類型方法:

  • 包含字符前綴或後綴,例如E12345,E12346等。可以直接去掉前綴或者將前綴映射為數字。
  • 該列隻有少數幾個值,例如國家名。可以對每個國家編碼,每個國家對應一個唯一數字。

最後更新:2016-11-23 16:04:20

  上一篇:go 7.2 查看DB性能指標和報告__第七章 性能優化和診斷_使用手冊_分析型數據庫-阿裏雲
  下一篇:go 7.4 查詢SQL優化__第七章 性能優化和診斷_使用手冊_分析型數據庫-阿裏雲