精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

國產數據庫也能打(寫在OB新版本測試后)

原創 精選
數據庫
國產數據庫發展時間尚短、缺乏場景打磨,存在諸多不足也可理解。但比較欣喜的是,整個國產數據庫廠商都在努力追趕。

隨著數據庫國產化深入,越來越多的用戶開始使用國產數據庫;但在使用之后,大家難免會吐槽各種國產數據庫的種種不足。作為一種基礎軟件,數據庫軟件自身就很復雜。國產數據庫雖然經過二三十年的發展, 但相較于國外大型商業數據庫仍然存在不小差距。但與此同時我們也應該看到,國產數據庫正在奮起直追,不斷完善自身的產品功能。在數月前,筆者曾發表過一篇文章(參考),對比部分國內數據庫產品與Oracle在SQL管理方面的差距。文章閱讀量頗高,也受到多家廠商的關注。近期 OceanBase 在發布新版本后,也邀請筆者針對SQL管理部分做個小的測試。測試之余,也為我們國產數據庫的快速發展感到欣慰。也許,現在的產品仍然有很多的不完美,但相信未來是美好的。本文就針對 OceanBase 發布的新版本中SQL管理相關的部分功能進行測試及點評。受個人精力所限,未對完整功能做詳細測試,有興趣的伙伴可參考官方文檔。

1. OceanBase SQL 管理能力概覽

在正式展開之前,我們先回顧下之前對比的情況。之前是從SQL解析、執行計劃、SQL優化、執行過程及其他能力五個維度對比部分國產數據庫的能力。

此次,根據官方給予的指導,從下面這些維度總結下 OceanBase 的能力并與之前做對比。下面也將針對部分能力加以測試。

2. OceanBase SQL 管理能力:執行計劃

下面的測試環境,是采用 OceanBase V4.2.5 的 MySQL 兼容模式。

(1)固定執行計劃:Hint

Hint 是一種 SQL 語句注釋,用于將指令傳遞給 OceanBase 數據庫優化器。通過 Hint 可以使優化器生成指定的執行計劃。一般情況下,優化器會為用戶查詢選擇最佳的執行計劃,不需要用戶使用 Hint 指定,但在某些場景下,優化器生成的執行計劃可能無法滿足用戶的要求,這時就需要用戶使用 Hint 來主動指定并生成特殊的執行計劃。Hint 可以說是 DBA 干預執行計劃最為常用的手段之一。Hint 的豐富程度直接決定 DBA 能干預執行計劃的程度。

OB Hint 仿照 Oracle Hint 的名稱及用法,用起來比較簡單。相較于 MySQL Hint,OB Hint 也豐富了很多。對于 Oracle DBA 來說是可以快速上手的,針對 MySQL DBA 來說則增加了很多調優的手段。

--  測試使用 Hint 干預執行計劃。

mysql> select * from emp where emp_name='emp1234';
+--------+---------+----------+------------+---------+
|emp_id | dept_id | emp_name | birthday   | salary  |
+--------+---------+----------+------------+---------+
|1234 |      74 | emp1234  | 2001-12-30 | 1148.55 |
+--------+---------+----------+------------+---------+

mysql> select dbms_xplan.display_cursor() from dual;
==============================================================================================================
|ID|OPERATOR        |NAME             |EST.ROWS|EST.TIME(us)|REAL.ROWS|REAL.TIME(us)|IO TIME(us)|CPU TIME(us)|
--------------------------------------------------------------------------------------------------------------
|0 |TABLE RANGE SCAN|emp(idx_emp_name)|1       |7           |1        |0            |0          |190         |
==============================================================================================================

mysql> select /*+ full(emp) */ * from emp where emp_name='emp1234';
+--------+---------+----------+------------+---------+
| emp_id | dept_id | emp_name | birthday   | salary  |
+--------+---------+----------+------------+---------+
|   1234 |      74 | emp1234  | 2001-12-30 | 1148.55 |
+--------+---------+----------+------------+---------+

mysql> select dbms_xplan.display_cursor() from dual;
================================================================================================
|ID|OPERATOR       |NAME|EST.ROWS|EST.TIME(us)|REAL.ROWS|REAL.TIME(us)|IO TIME(us)|CPU TIME(us)|
------------------------------------------------------------------------------------------------
|0 |TABLE FULL SCAN|emp |2       |573         |1        |5258         |0          |5032        |
================================================================================================

(2)固定執行計劃:(Format) Outline

通過對某條 SQL 創建 Outline 可實現計劃綁定。在系統上線前,可以直接在 SQL 語句中添加 Hint,控制優化器按 Hint 指定的行為進行計劃生成。但對于已上線的業務,如果出現優化器選擇的計劃不夠優化時,則需要在線進行計劃綁定,即無需業務進行 SQL 更改,而是通過 DDL 操作將一組 Hint 加入到 SQL 中,從而使優化器根據指定的一組 Hint,對該 SQL 生成更優計劃。該組 Hint 就稱為 Outline。OceanBase Outline 也是仿照 Oracle Outline 的實現,使用體驗也相差不大。特別是在驗證 Outline 是否使用上,也可通過DBMS_XPLAN加以查看。

-- 原始執行計劃
mysql> select * from emp where emp_name='emp1234';

mysql> select dbms_xplan.display_cursor(0,'all') from dual;
==============================================================================================================
|ID|OPERATOR        |NAME             |EST.ROWS|EST.TIME(us)|REAL.ROWS|REAL.TIME(us)|IO TIME(us)|CPU TIME(us)|
--------------------------------------------------------------------------------------------------------------
|0 |TABLE RANGE SCAN|emp(idx_emp_name)|1       |7           |1        |1169         |0          |118         |
==============================================================================================================

-- 使用 SQL Outline 固定新的執行計劃
mysql> select sql_id ,statement from oceanbase.V$OB_PLAN_CACHE_PLAN_STAT 
    ->   where statement like '%emp_name%';
+----------------------------------+----------------------------------------+
| sql_id                           | statement                              |
+----------------------------------+----------------------------------------+
| 3A384EC9FBBF76DC073C209C7594BD62 | select * from emp where emp_name=?     |
+----------------------------------+----------------------------------------+

mysql>  CREATE OUTLINE ol_emp_name ON '3A384EC9FBBF76DC073C209C7594BD62' 
    ->   USING HINT /*+ full(emp) */ ;

mysql> select * from emp where emp_name='emp1234';

-- 查看是否使用 SQL Outline
mysql> select dbms_xplan.display_cursor(0,'all') from dual;
================================================================================================
|ID|OPERATOR       |NAME|EST.ROWS|EST.TIME(us)|REAL.ROWS|REAL.TIME(us)|IO TIME(us)|CPU TIME(us)|
------------------------------------------------------------------------------------------------
|0 |TABLE FULL SCAN|emp |2       |573         |1        |5291         |0          |5153        |
================================================================================================
Used Hint:
-------------------------------------
  /*+
      FULL("emp")
  */
Outline Data: 
-------------------------------------
  /*+
      BEGIN_OUTLINE_DATA
      FULL(@"SEL$1" "default_database"."emp"@"SEL$1")
      OPTIMIZER_FEATURES_ENABLE('4.2.5.0')
      END_OUTLINE_DATA
  */

此外,在最新版本中還增加了 Format Outline 特性,提供了一種更為寬松的匹配規則。當用戶創建 Format Outline 時,在 Outline 原有流程之前,系統會先做一次忽略大小寫、空格等非語法定義符號的操作,歸一化為標準格式,這使得歸一化后得到同樣 Format SQL Text 或 Format SQL ID 的用戶請求都可以命中同一個 Format Outline。

(3)固定執行計劃:SPM

SQL Plan Management(SPM)是一種防止計劃回退的機制,能夠確保新生成的計劃在經過驗證后才被使用,以保證計劃性能不斷優化和更新。OceanBase 數據庫支持在線 SPM 演進機制,即當發現新生成的計劃不在基線中時,就會立即自動啟動一個演進任務進行計劃演進,這樣就可以在用戶無需手動干預的情況下自動完成計劃演進。SPM 基于 SQL Plan Baseline 實現,SQL Plan Baseline 是執行計劃的一個基線,用于持久化存儲已經驗證過的執行計劃信息(Outline Data 等信息),每個執行計劃可對應一個 Plan Baseline,通過該 Plan Baseline 可復現一個執行計劃。

(4)查看執行計劃:DBMS_XPLAN

查看執行計劃是所有優化的第一步,因此完善的執行計劃查看手段非常必要。OceanBase 也提供了多種查看的方式,如典型的 Explain 命令;但這里重點介紹下通過 DBMS_XPlan 的方式來查看。相信 Oracle DBA 對這一能力尤為熟悉,其支持多種信息來源、豐富展示維度。在 OceanBase 中也做了類似的實現,并做了部分增強。下表是其支持的主要能力。

在展示內容的豐富程度上,可參考下面的測試。對比傳統的 Explain 方式,無疑增強了很多。

mysql> EXPLAIN SET STATEMENT_ID='testsql1' select * from emp where emp_id=100;

mysql> SELECT DBMS_XPLAN.DISPLAY('all','testsql1','plan_table');
=========================================
|ID|OPERATOR |NAME|EST.ROWS|EST.TIME(us)|
-----------------------------------------
|0 |TABLE GET|emp |1       |3           |
=========================================

Outputs & filters:
-------------------------------------
  0 - output([emp.emp_id], [emp.dept_id], [emp.emp_name], [emp.birthday], [emp.salary]), filter(nil), rowset=16
      access([emp.emp_id], [emp.dept_id], [emp.emp_name], [emp.birthday], [emp.salary]), partitions(p0)
      is_index_back=false, is_global_index=false, 
      range_key([emp.emp_id]), range[100 ; 100], 
      range_cond([emp.emp_id = 100])

Used Hint:
-------------------------------------
  /*+
      
  */
Qb name trace:
-------------------------------------
  stmt_id:0, stmt_type:T_EXPLAIN 
  stmt_id:1, SEL$1

Outline Data: 
-------------------------------------
  /*+
      BEGIN_OUTLINE_DATA
      FULL(@"SEL$1" "default_database"."emp"@"SEL$1")
      OPTIMIZER_FEATURES_ENABLE('4.2.5.0')
      END_OUTLINE_DATA
  */
Optimization Info:
-------------------------------------
  emp:
      table_rows:10000
      physical_range_rows:1
      logical_range_rows:1
      index_back_rows:0
      output_rows:1
      table_dop:1
      dop_method:Table DOP
      avaiable_index_name:[idx_emp_name, idx_emp_birthday, idx_emp_salary, emp]
      pruned_index_name:[idx_emp_name, idx_emp_birthday, idx_emp_salary]
      stats info:[versinotallow=2024-11-25 14:53:29.120791, is_locked=0, is_expired=0]
      dynamic sampling level:0
      estimation method:[OPTIMIZER STATISTICS]

  Plan Type:
      LOCAL

  Parameters:
      :0 => 100
      :1 => 'testsql1'

  Note:
      Degree of Parallelisim is 1 because of table property
mysql> EXPLAIN SET STATEMENT_ID='testsql1' select * from emp where emp_id=100;

mysql> SELECT DBMS_XPLAN.DISPLAY('all','testsql1','plan_table');
=========================================
|ID|OPERATOR |NAME|EST.ROWS|EST.TIME(us)|
-----------------------------------------
|0 |TABLE GET|emp |1       |3           |
=========================================

Outputs & filters:
-------------------------------------
  0 - output([emp.emp_id], [emp.dept_id], [emp.emp_name], [emp.birthday], [emp.salary]), filter(nil), rowset=16
      access([emp.emp_id], [emp.dept_id], [emp.emp_name], [emp.birthday], [emp.salary]), partitions(p0)
      is_index_back=false, is_global_index=false, 
      range_key([emp.emp_id]), range[100 ; 100], 
      range_cond([emp.emp_id = 100])

Used Hint:
-------------------------------------
  /*+
      
  */
Qb name trace:
-------------------------------------
  stmt_id:0, stmt_type:T_EXPLAIN 
  stmt_id:1, SEL$1

Outline Data: 
-------------------------------------
  /*+
      BEGIN_OUTLINE_DATA
      FULL(@"SEL$1" "default_database"."emp"@"SEL$1")
      OPTIMIZER_FEATURES_ENABLE('4.2.5.0')
      END_OUTLINE_DATA
  */
Optimization Info:
-------------------------------------
  emp:
      table_rows:10000
      physical_range_rows:1
      logical_range_rows:1
      index_back_rows:0
      output_rows:1
      table_dop:1
      dop_method:Table DOP
      avaiable_index_name:[idx_emp_name, idx_emp_birthday, idx_emp_salary, emp]
      pruned_index_name:[idx_emp_name, idx_emp_birthday, idx_emp_salary]
      stats info:[versinotallow=2024-11-25 14:53:29.120791, is_locked=0, is_expired=0]
      dynamic sampling level:0
      estimation method:[OPTIMIZER STATISTICS]

  Plan Type:
      LOCAL

  Parameters:
      :0 => 100
      :1 => 'testsql1'

  Note:
      Degree of Parallelisim is 1 because of table property

(5)清除執行計劃:FLUSH PLAN CACHE

當執行計劃出現異常時,需要非常精準地清理某一個語句的執行計劃緩存。在 OceanBase 中實現了語句級的清理能力。

-- 查看執行計劃緩存
mysql> select sql_id ,plan_hash,statement,last_active_time,executions 
    ->  from  oceanbase.gv$ob_plan_cache_plan_stat 
    ->  where statement like '%emp_name%';
+----------------------------------+--------------------+------------------------------------+----------------------------+------------+
| sql_id                           | plan_hash          | statement                          | last_active_time           | executions |
+----------------------------------+--------------------+------------------------------------+----------------------------+------------+
| 3A384EC9FBBF76DC073C209C7594BD62 | 269335962286044871 | select * from emp where emp_name=? | 2024-11-26 14:28:38.374015 |          5 |
+----------------------------------+--------------------+------------------------------------+----------------------------+------------+

-- 清理執行計劃緩存
mysql> ALTER SYSTEM FLUSH PLAN CACHE sql_id='3A384EC9FBBF76DC073C209C7594BD62'
    ->  databases='default_database' GLOBAL;

mysql> select sql_id ,plan_hash,statement,last_active_time,executions 
    ->  from  oceanbase.gv$ob_plan_cache_plan_stat 
    ->  where statement like '%emp_name%';
Empty set (0.02 sec)

-- 重新生成執行計劃
mysql> select * from emp where emp_name='emp1234';
+--------+---------+----------+------------+---------+
| emp_id | dept_id | emp_name | birthday   | salary  |
+--------+---------+----------+------------+---------+
|   1234 |      74 | emp1234  | 2001-12-30 | 1148.55 |
+--------+---------+----------+------------+---------+

mysql> select sql_id ,plan_hash,statement,last_active_time,executions 
    ->  from  oceanbase.gv$ob_plan_cache_plan_stat 
    ->  where statement like '%emp_name%';
+----------------------------------+--------------------+------------------------------------+----------------------------+------------+
| sql_id                           | plan_hash          | statement                          | last_active_time           | executions |
+----------------------------------+--------------------+------------------------------------+----------------------------+------------+
| 3A384EC9FBBF76DC073C209C7594BD62 | 269335962286044871 | select * from emp where emp_name=? | 2024-11-26 14:32:24.447891 |          1 |
+----------------------------------+--------------------+------------------------------------+----------------------------+------------+
-- 查看執行計劃緩存
mysql> select sql_id ,plan_hash,statement,last_active_time,executions 
    ->  from  oceanbase.gv$ob_plan_cache_plan_stat 
    ->  where statement like '%emp_name%';
+----------------------------------+--------------------+------------------------------------+----------------------------+------------+
| sql_id                           | plan_hash          | statement                          | last_active_time           | executions |
+----------------------------------+--------------------+------------------------------------+----------------------------+------------+
| 3A384EC9FBBF76DC073C209C7594BD62 | 269335962286044871 | select * from emp where emp_name=? | 2024-11-26 14:28:38.374015 |          5 |
+----------------------------------+--------------------+------------------------------------+----------------------------+------------+

-- 清理執行計劃緩存
mysql> ALTER SYSTEM FLUSH PLAN CACHE sql_id='3A384EC9FBBF76DC073C209C7594BD62'
    ->  databases='default_database' GLOBAL;

mysql> select sql_id ,plan_hash,statement,last_active_time,executions 
    ->  from  oceanbase.gv$ob_plan_cache_plan_stat 
    ->  where statement like '%emp_name%';
Empty set (0.02 sec)

-- 重新生成執行計劃
mysql> select * from emp where emp_name='emp1234';
+--------+---------+----------+------------+---------+
| emp_id | dept_id | emp_name | birthday   | salary  |
+--------+---------+----------+------------+---------+
|   1234 |      74 | emp1234  | 2001-12-30 | 1148.55 |
+--------+---------+----------+------------+---------+

mysql> select sql_id ,plan_hash,statement,last_active_time,executions 
    ->  from  oceanbase.gv$ob_plan_cache_plan_stat 
    ->  where statement like '%emp_name%';
+----------------------------------+--------------------+------------------------------------+----------------------------+------------+
| sql_id                           | plan_hash          | statement                          | last_active_time           | executions |
+----------------------------------+--------------------+------------------------------------+----------------------------+------------+
| 3A384EC9FBBF76DC073C209C7594BD62 | 269335962286044871 | select * from emp where emp_name=? | 2024-11-26 14:32:24.447891 |          1 |
+----------------------------------+--------------------+------------------------------------+----------------------------+------------+

3. OceanBase SQL 管理能力:過程及優化

(1)ASH

Oracle DBA 對ASH/AWR,一定不陌生。它們是我們查看語句執行過程的好幫手。在 OceanBase 中也帶來了同樣的能力。ASH(Active Session History)是一種活動會話歷史記錄的診斷工具,用于記錄數據庫中所有活動會話的信息。ASH 報告(OceanBase Active Session History Report )是一個能夠提供定位瞬時發生異常的分析報告,與性能報告相比,能提供更加細粒度的診斷信息。一般的性能報告所覆蓋的是小時級別的快照信息,診斷問題的粒度不能深入到 Session 級別。導致一些瞬時抖動信息很難從性能報告上得到詳細的執行細節,因此,我們可以通過 ASH 報告這樣一個會話級別的細粒度診斷信息來解決這種問題。

-- 記錄一個包含語句執行的時間段
mysql> select now() from dual;
+---------------------+
| now()               |
+---------------------+
| 2024-11-25 21:50:44 |
+---------------------+

-- 對于執行時長短的SQL可能會記錄不到,這里構造一個長SQL
mysql> select * from emp where emp_name='emp1234' and salary>sleep(3);

mysql> select now() from dual;
+---------------------+
| now()               |
+---------------------+
| 2024-11-25 21:51:42 |
+---------------------+

-- 查看 SQL ID
mysql> select sql_id ,statement from oceanbase.V$OB_PLAN_CACHE_PLAN_STAT 
    ->  where statement like '%salary%';
+----------------------------------+--------------------------------------------------------+
| sql_id                           | statement                                              |
+----------------------------------+--------------------------------------------------------+
| 3F5322F4E8E89841727D0313B5FBB7F9 | select * from emp where emp_name=? and salary>sleep(?) |
+----------------------------------+--------------------------------------------------------+

-- 生成 ASH Report(指定時間段及SQL ID)
mysql> call dbms_workload_repository.ash_report(     
    ->   str_to_date('2024-11-25 21:50:00', '%Y-%m-%d %H:%i%s'), 
    ->   str_to_date('2024-11-25 21:52:00', '%Y-%m-%d %H:%i%s'),
    ->   sql_id=>'3F5322F4E8E89841727D0313B5FBB7F9');

ASH Report

           Cluster Name: ob69oehg4nx4hs 
       Observer Version: OceanBase 4.2.5.0 (100010012024111110-19dd26fbb0ea8dc8a31ba208a90d58f9b67a4929) 
  Operation System Info: Linux(3.10.0-1160.119.1.el7.x86_64)_x86_64 
  User Input Begin Time: 2024-11-25 21:50:00 
    User Input End Time: 2024-11-25 21:52:00 
    Analysis Begin Time: 2024-11-25 21:51:05 
      Analysis End Time: 2024-11-25 21:51:15 
           Elapsed Time: 10 
          Num of Sample: 8 
Average Active Sessions: 0.80 

Top Active Tenants:
+---------------+------------+------------------+-----------------------+-------------------+--------------------+-----------+--------------------+
|    Tenant Name|Session Type|       Total Count|       Wait Event Count|       On CPU Count| Avg Active Sessions| % Activity|Equivalent Client Load|
+---------------+------------+------------------+-----------------------+-------------------+--------------------+-----------+--------------------+
|  t69qw2ook3c2o|  FOREGROUND|                 8|                      8|                  0|                0.80|    100.00%|                1.00|
+---------------+------------+------------------+-----------------------+-------------------+--------------------+-----------+--------------------+

Top Node Load:
+----------------+-------+------------+------------------+-----------------------+-------------------+--------------------+-----------+--------------------+
|              IP|   Port|Session Type|       Total Count|       Wait Event Count|       On CPU Count| Avg Active Sessions| % Activity|Equivalent Client Load|
+----------------+-------+------------+------------------+-----------------------+-------------------+--------------------+-----------+--------------------+
|    10.104.56.87|   2882|  FOREGROUND|                 8|                      8|                  0|                0.80|    100.00%|                0.00|
+----------------+-------+------------+------------------+-----------------------+-------------------+--------------------+-----------+--------------------+

Top Groups:
  - this section lists top resource consumer groups
  - Group Name: resource consumer group name
  - Group Samples: num of sampled session activity records in the current resource group
  - % Activity: activity percentage for given resource group
  - Avg Active Sessions: average active sessions during ash report analysis time period
+-----------------------------------+-------------+-----------+--------------------+----------------------------------------------------------------+-----------+--------------------------------+-----------+--------------------------------+-----------+
|                         Group Name|Group Samples| % Activity| Avg Active Sessions|                                                         Program|  % Program|                          Module|   % Module|                          Action|   % Action|
+-----------------------------------+-------------+-----------+--------------------+----------------------------------------------------------------+-----------+--------------------------------+-----------+--------------------------------+-----------+
|  cgroup//tenant_1002//OBCG_DEFAULT|            8|    100.00%|                0.80|                                                   T1002_SQL_CMD|    100.00%|                       UNDEFINED|    100.00%|                       UNDEFINED|    100.00%|
+-----------------------------------+-------------+-----------+--------------------+----------------------------------------------------------------+-----------+--------------------------------+-----------+--------------------------------+-----------+

Top Foreground DB Time:
  - this section lists top foreground db time categorized by event
  - Event Name: comprise wait event and on cpu event
  - Event Count: num of sampled session activity records
  - % Activity: activity percentage for given event
  - Avg Active Sessions: average active sessions during ash report analysis time period
+-------------+--------------------+-------------+--------------------+-----------+
|   Event Name|          Wait Class|  Event Count| Avg Active Sessions| % Activity|
+-------------+--------------------+-------------+--------------------+-----------+
|   sleep wait|                IDLE|            8|                0.80|    100.00%|
+-------------+--------------------+-------------+--------------------+-----------+

Top Sessions:
  - this section lists top Active Sessions with the largest wait event and SQL_ID
  - Session ID: user session id
  - % Activity: represents the load on the database caused by this session
  - Avg Active Sessions: average active sessions during ash report analysis time period
  - Event Name: comprise wait event and on cpu event
  - % Event: represents the activity load of the event on the database
  - % SQL ID: represents the activity load of the event on the database
  - Sql Executions: represents the execution count of the SQL_ID
+--------------------+----------------+-----------+--------------------+----------------------------------------------------------------+--------------------+-----------+----------------------------------------+--------------------+-----------+-------------+
|          Session ID|         Program| % Activity| Avg Active Sessions|                                                      Event Name|          Wait Class|    % Event|                                  SQL ID|           Plan Hash|   % SQL ID|Sql Executions|
+--------------------+----------------+-----------+--------------------+----------------------------------------------------------------+--------------------+-----------+----------------------------------------+--------------------+-----------+-------------+
|          3221643314|   T1002_SQL_CMD|    100.00%|                0.80|                                                      sleep wait|                IDLE|    100.00%|        3F5322F4E8E89841727D0313B5FBB7F9|14249117491818627721|    100.00%|            3|
+--------------------+----------------+-----------+--------------------+----------------------------------------------------------------+--------------------+-----------+----------------------------------------+--------------------+-----------+-------------+

Activity Over Time:
  - this section lists time slot information during the analysis period.
  - Slot Begin Time: current slot's begin time. current slot end with next slot begin time.
  - Event Name: comprise wait event and on cpu event
  - Event Count: num of sampled session activity records
  - % Activity: activity percentage for given event
  - Avg Active Sessions: average active sessions during ash report analysis time period
+----------------------------+-------------+--------------------+-------------+-----------+--------------------+
|             Slot Begin Time|   Event Name|          Wait Class|  Event Count| % Activity| Avg Active Sessions|
+----------------------------+-------------+--------------------+-------------+-----------+--------------------+
|  2024-11-25 21:50:00.000000|   sleep wait|                IDLE|            8|    100.00%|                0.03|
+----------------------------+-------------+--------------------+-------------+-----------+--------------------+

Top Execution Phase:
  - this section lists top phases of execution, such as SQL, PL/SQL, STORAGE, etc.
+------------+----------------------+----------+-----------+----------------------------------------+-----------+
|Session Type|    Phase of Execution|Active Samples| % Activity|                                  SQL_ID|   % SQL_ID|
+------------+----------------------+----------+-----------+----------------------------------------+-----------+
|  FOREGROUND|      IN_SQL_EXECUTION|         8|    100.00%|        3F5322F4E8E89841727D0313B5FBB7F9|    100.00%|
|  FOREGROUND|    IN_PLSQL_EXECUTION|         8|    100.00%|        3F5322F4E8E89841727D0313B5FBB7F9|    100.00%|
|  FOREGROUND|       IN_STORAGE_READ|         8|    100.00%|        3F5322F4E8E89841727D0313B5FBB7F9|    100.00%|
+------------+----------------------+----------+-----------+----------------------------------------+-----------+

Top SQL with Top Events:
  - This Section lists the SQL statements that accounted for the highest percentages event.
  - Plan Hash: Numeric representation of the current SQL plan
  - Active Samples: num of samples for top current SQL
  - % Activity: activity percentage for given SQL ID
  - Sampled Executions: represents the number of times the current SQL execution has been sampled
  - Top Event: top event name for current SQL plan
  - % Event: activity percentage for current SQL plan
  - Top Operator/ExecPhase: top operator name or execution phase for current event
  - % Operator/ExecPhase: activity percentage for given operator
+----------------------------------------+--------------------+--------------+--------------+--------------+----------------------------------------------------------------+--------------+--------------------------------------------------------------------------------------------------------------------------------+--------------+----------------------------------------------------------------+
|                                  SQL ID|           Plan Hash|Active Samples|    % Activity|Sampled Executions|                                                       Top Event|       % Event|                                                                                                          Top Operator/ExecPhase|% Operator/ExecPhase|                                                        SQL Text|
+----------------------------------------+--------------------+--------------+--------------+--------------+----------------------------------------------------------------+--------------+--------------------------------------------------------------------------------------------------------------------------------+--------------+----------------------------------------------------------------+
|        3F5322F4E8E89841727D0313B5FBB7F9|14249117491818627721|             8|       100.00%|             3|                                                      sleep wait|       100.00%|                                                                                                                TABLE RANGE SCAN|       100.00%|          select * from emp where emp_name=? and salary>sleep(?)|
+----------------------------------------+--------------------+--------------+--------------+--------------+----------------------------------------------------------------+--------------+--------------------------------------------------------------------------------------------------------------------------------+--------------+----------------------------------------------------------------+

Top SQL with Top Operator:
  - This Section lists the SQL statements that accounted for the highest percentages of sampled session activity with sql operator
  - Plan Hash: Numeric representation of the current SQL plan
  - Active Samples: num of samples for top current SQL
  - % Activity: activity percentage for given SQL ID
  - Sampled Executions: represents the number of times the current SQL execution has been sampled
  - Top Operator: top operator name for current SQL plan
  - % Operator: activity percentage for given operator
  - Top Event: top event name for current operator
  - % Event: activity percentage for given event
+----------------------------------------+--------------------+--------------+--------------+--------------+--------------------------------------------------------------------------------------------------------------------------------+--------------+----------------------------------------------------------------+--------------+----------------------------------------------------------------+
|                                  SQL ID|           Plan Hash|Active Samples|    % Activity|Sampled Executions|                                                                                                                    Top Operator|    % Operator|                                                       Top Event|       % Event|                                                        SQL Text|
+----------------------------------------+--------------------+--------------+--------------+--------------+--------------------------------------------------------------------------------------------------------------------------------+--------------+----------------------------------------------------------------+--------------+----------------------------------------------------------------+
|        3F5322F4E8E89841727D0313B5FBB7F9|14249117491818627721|             8|       100.00%|             3|                                                                                                                TABLE RANGE SCAN|       100.00%|                                                      sleep wait|       100.00%|          select * from emp where emp_name=? and salary>sleep(?)|
+----------------------------------------+--------------------+--------------+--------------+--------------+--------------------------------------------------------------------------------------------------------------------------------+--------------+----------------------------------------------------------------+--------------+----------------------------------------------------------------+

Complete List of SQL Text:
  SQL ID: 3F5322F4E8E89841727D0313B5FBB7F9
SQL Text: select * from emp where emp_name=? and salary>sleep(?)

(2)SQL Stat

OceanBase 也提供了類似 Oracle AWR 中的基于快照的信息收集能力。其中,視圖 DBA_WR_SQLSTAT 就存儲用戶執行過的 SQL 的基本性能統計數據。其中,含 _DELTA 的列表示從上次采集 WR 快照到當前時間為止統計值的增量。

mysql> select snap_id,plan_type,executions_total,source_ip,source_port
->  from oceanbase.DBA_WR_SQLSTAT 
    ->  where sql_id='3A384EC9FBBF76DC073C209C7594BD62'; 
+---------+-----------+------------------+--------------+-------------+
| snap_id | plan_type | executions_total | source_ip    | source_port |
+---------+-----------+------------------+--------------+-------------+
|      22 |         1 |                1 | 10.104.56.87 |        2882 |
+---------+-----------+------------------+--------------+-------------+

(3)SQL Audit

SQL Audit 可以提供詳實的 SQL 執行情況,其中 GV$OB_SQL_AUDIT 就是最常用的 SQL 監控視圖,能夠記錄每一次 SQL 請求的來源、執行狀態、資源消耗及等待事件,除此之外還記錄了 SQL 文本、執行計劃等關鍵信息。該視圖是診斷 SQL 問題的利器。GV$OB_SQL_AUDIT 視圖的數據存放在一個可配置的內存空間中,每個租戶在每個節點上都有一塊獨立的緩存,當內存使用或記錄數達到淘汰上限時會觸發自動淘汰,最久的數據優先淘汰。有經驗的 DBA 在排查 SQL 問題時,往往第一件事就是關閉 SQL Audit 功能以保存現場,避免抖動現場的監控數據被淘汰。

-- 開啟會話級別的全鏈路追蹤(記錄所有語句的相關耗時等信息,采樣頻率為 50%
obclient> CALL DBMS_MONITOR.OB_SESSION_TRACE_ENABLE(null,1,0.5,'ALL');

mysql> SELECT request_id,usec_to_time(request_time),user_client_ip,user_name,db_name,
    ->  sql_id,query_sql ,ELAPSED_TIME,QUEUE_TIME,EXECUTE_TIME,plan_id,is_hit_plan,disk_reads
    ->  FROM oceanbase.gv$OB_SQL_AUDIT 
    ->  WHERE query_sql LIKE '%emp_name%' limit 1\G;
*************************** 1. row ***************************
                request_id: 1669216
usec_to_time(request_time): 2024-11-26 14:54:24.977470
            user_client_ip: 82.157.26.195
                 user_name: testuser
                   db_name: default_database
                    sql_id: 5650F89701DF0872BA2FCBD059EDBFC9
                 query_sql: select * from emp where emp_name ='emp1234'
              ELAPSED_TIME: 13803
                QUEUE_TIME: 18
              EXECUTE_TIME: 271
                   plan_id: 4878
               is_hit_plan: 0
                DISK_READS: 2

(4)SQL Trace

SQL Trace 能夠交互式的提供上一次執行的 SQL 請求執行過程中調用鏈路情況,以及鏈路中各階段耗時情況,以便進行性能分析或調優,快速找到性能瓶頸點。

mysql> SET ob_enable_show_trace = 1;

mysql> select * from emp where emp_name ='emp1234';
+--------+---------+----------+------------+---------+
| emp_id | dept_id | emp_name | birthday   | salary  |
+--------+---------+----------+------------+---------+
|   1234 |      74 | emp1234  | 2001-12-30 | 1148.55 |
+--------+---------+----------+------------+---------+

mysql> show trace;
+-------------------------------------------+----------------------------+------------+
| Operation                                 | StartTime                  | ElapseTime |
+-------------------------------------------+----------------------------+------------+
| com_query_process                         | 2024-11-26 14:57:02.179570 | 0.344 ms   |
| └── mpquery_single_stmt                   | 2024-11-26 14:57:02.179576 | 0.327 ms   |
|     ├── sql_compile                       | 2024-11-26 14:57:02.179584 | 0.074 ms   |
|     │   └── pc_get_plan                   | 2024-11-26 14:57:02.179590 | 0.014 ms   |
|     └── sql_execute                       | 2024-11-26 14:57:02.179673 | 0.208 ms   |
|         ├── open                          | 2024-11-26 14:57:02.179674 | 0.020 ms   |
|         ├── response_result               | 2024-11-26 14:57:02.179706 | 0.122 ms   |
|         │   └── do_local_das_task         | 2024-11-26 14:57:02.179730 | 0.031 ms   |
|         └── close                         | 2024-11-26 14:57:02.179838 | 0.031 ms   |
|             ├── close_das_task            | 2024-11-26 14:57:02.179839 | 0.009 ms   |
|             └── end_transaction           | 2024-11-26 14:57:02.179857 | 0.002 ms   |
+-------------------------------------------+----------------------------+------------+ CALL DBMS_MONITOR.OB_SESSION_TRACE_ENABLE(null,1,0.5,'ALL');\n\nmysql> SELECT request_id,usec_to_time(request_time),user_client_ip,user_name,db_name,\n    ->  sql_id,query_sql ,ELAPSED_TIME,QUEUE_TIME,EXECUTE_TIME,plan_id,is_hit_plan,disk_reads\n    ->  FROM oceanbase.gv$OB_SQL_AUDIT \n    ->  WHERE query_sql LIKE '%emp_name%' limit 1\\G;\n*************************** 1. row ***************************\n                request_id: 1669216\nusec_to_time(request_time): 2024-11-26 14:54:24.977470\n            user_client_ip: 82.157.26.195\n                 user_name: testuser\n                   db_name: default_database\n                    sql_id: 5650F89701DF0872BA2FCBD059EDBFC9\n                 query_sql: select * from emp where emp_name ='emp1234'\n              ELAPSED_TIME: 13803\n                QUEUE_TIME: 18\n              EXECUTE_TIME: 271\n                   plan_id: 4878\n               is_hit_plan: 0\n                DISK_READS: 2"},"attribs":{"0":"*0|k+ql*0+t"}},"apool":{"numToAttrib":{"0":["author","6932737685563949084"]},"nextNum":1}},"type":"text","referenceRecordMap":{},"extra":{"channel":"saas","pasteRandomId":"92c4505b-2aa1-49f0-b48c-ff993801eb0d","mention_page_title":{},"external_mention_url":{}},"isKeepQuoteContainer":false,"isFromCode":true,"selection":[{"id":225,"type":"text","selection":{"start":0,"end":986},"recordId":"FipSdXqTCo7yqIxHH6pcoi81nMg"}],"payloadMap":{},"isCut":false}" data-lark-record-format="docx/text" class="" style="-webkit-tap-highlight-color: transparent; margin: 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important;">
mysql> SET ob_enable_show_trace = 1;

mysql> select * from emp where emp_name ='emp1234';
+--------+---------+----------+------------+---------+
| emp_id | dept_id | emp_name | birthday   | salary  |
+--------+---------+----------+------------+---------+
|   1234 |      74 | emp1234  | 2001-12-30 | 1148.55 |
+--------+---------+----------+------------+---------+

mysql> show trace;
+-------------------------------------------+----------------------------+------------+
| Operation                                 | StartTime                  | ElapseTime |
+-------------------------------------------+----------------------------+------------+
| com_query_process                         | 2024-11-26 14:57:02.179570 | 0.344 ms   |
| └── mpquery_single_stmt                   | 2024-11-26 14:57:02.179576 | 0.327 ms   |
|     ├── sql_compile                       | 2024-11-26 14:57:02.179584 | 0.074 ms   |
|     │   └── pc_get_plan                   | 2024-11-26 14:57:02.179590 | 0.014 ms   |
|     └── sql_execute                       | 2024-11-26 14:57:02.179673 | 0.208 ms   |
|         ├── open                          | 2024-11-26 14:57:02.179674 | 0.020 ms   |
|         ├── response_result               | 2024-11-26 14:57:02.179706 | 0.122 ms   |
|         │   └── do_local_das_task         | 2024-11-26 14:57:02.179730 | 0.031 ms   |
|         └── close                         | 2024-11-26 14:57:02.179838 | 0.031 ms   |
|             ├── close_das_task            | 2024-11-26 14:57:02.179839 | 0.009 ms   |
|             └── end_transaction           | 2024-11-26 14:57:02.179857 | 0.002 ms   |
+-------------------------------------------+----------------------------+------------+
mysql> SET ob_enable_show_trace = 1;

mysql> select * from emp where emp_name ='emp1234';
+--------+---------+----------+------------+---------+
| emp_id | dept_id | emp_name | birthday   | salary  |
+--------+---------+----------+------------+---------+
|   1234 |      74 | emp1234  | 2001-12-30 | 1148.55 |
+--------+---------+----------+------------+---------+

mysql> show trace;
+-------------------------------------------+----------------------------+------------+
| Operation                                 | StartTime                  | ElapseTime |
+-------------------------------------------+----------------------------+------------+
| com_query_process                         | 2024-11-26 14:57:02.179570 | 0.344 ms   |
| └── mpquery_single_stmt                   | 2024-11-26 14:57:02.179576 | 0.327 ms   |
|     ├── sql_compile                       | 2024-11-26 14:57:02.179584 | 0.074 ms   |
|     │   └── pc_get_plan                   | 2024-11-26 14:57:02.179590 | 0.014 ms   |
|     └── sql_execute                       | 2024-11-26 14:57:02.179673 | 0.208 ms   |
|         ├── open                          | 2024-11-26 14:57:02.179674 | 0.020 ms   |
|         ├── response_result               | 2024-11-26 14:57:02.179706 | 0.122 ms   |
|         │   └── do_local_das_task         | 2024-11-26 14:57:02.179730 | 0.031 ms   |
|         └── close                         | 2024-11-26 14:57:02.179838 | 0.031 ms   |
|             ├── close_das_task            | 2024-11-26 14:57:02.179839 | 0.009 ms   |
|             └── end_transaction           | 2024-11-26 14:57:02.179857 | 0.002 ms   |
+-------------------------------------------+----------------------------+------------+

4. OceanBase SQL 管理能力:其他

(1)調整對象:Invisible Index

如何查看當前執行計劃的異常或潛在可能得更優執行計劃,常見的手段如統計信息修改、對象可見性等。OceanBase 這方面能力都具備。這里以不可見索引為示例,演示下。

mysql> explain select * from emp where emp_name ='emp1234';
============================================================= 
|ID|OPERATOR        |NAME             |EST.ROWS|EST.TIME(us)|
-------------------------------------------------------------
|0 |TABLE RANGE SCAN|emp(idx_emp_name)|1       |7           |
=============================================================                                                   

-- 修改索引可見性
mysql> alter table emp alter index idx_emp_name invisible;

mysql> explain select * from emp where emp_name ='emp1234';
=============================================== 
ID|OPERATOR       |NAME|EST.ROWS|EST.TIME(us)| 
----------------------------------------------- 
|0 |TABLE FULL SCAN|emp |2       |573         |
===============================================

(2)統計信息

完整、準確的統計信息,是優化器工作的前提。作為DBA日常優化的工作,統計信息是首要需要關注的。OceanBase 提供了多種統計信息的收集及查看手段。在測試中,發現一點小瑕疵,通過 Analyze 和 DBMS_STATS包的方式收集統計信息,能力上還不統一。期待未來統一起來。

-- Analyze 方式收集(未收集索引信息)
mysql> analyze table emp;

mysql> select table_name,object_type, num_rows,blocks,last_analyzed 
    ->  from oceanbase.dba_tab_statistics where table_name='emp';
+------------+-------------+----------+--------+----------------------------+
| table_name | object_type | num_rows | blocks | last_analyzed              |
+------------+-------------+----------+--------+----------------------------+
| emp        | TABLE       |    10000 |   NULL | 2024-11-25 21:39:58.833398 |
+------------+-------------+----------+--------+----------------------------+

mysql> select table_name,index_name,object_type,blevel,distinct_keys,last_analyzed 
    ->  from oceanbase. DBA_IND_STATISTICS where index_name='idx_emp_name';
+------------+--------------+-------------+--------+---------------+----------------------------+
| table_name | index_name   | object_type | blevel | distinct_keys | last_analyzed              |
+------------+--------------+-------------+--------+---------------+----------------------------+
| emp        | idx_emp_name | INDEX       |   NULL |          NULL | 2024-11-25 14:53:29.154282 |
+------------+--------------+-------------+--------+---------------+----------------------------+

-- DBMS_STATS 包方式收集
mysql> CALL DBMS_STATS.GATHER_TABLE_STATS ('testuser', 'emp', method_opt=>'FOR ALL COLUMNS SIZE AUTO', granularity=>'ALL', degree=>4,cascade=>true);

mysql> select table_name,object_type, num_rows,blocks,last_analyzed 
    ->  from oceanbase.dba_tab_statistics where table_name='emp';
+------------+-------------+----------+--------+----------------------------+
| table_name | object_type | num_rows | blocks | last_analyzed              |
+------------+-------------+----------+--------+----------------------------+
| emp        | TABLE       |    10000 |   NULL | 2024-11-26 14:37:24.010639 |
+------------+-------------+----------+--------+----------------------------+

mysql> select table_name,index_name,object_type,blevel,distinct_keys,last_analyzed 
    ->  from oceanbase. DBA_IND_STATISTICS where index_name='idx_emp_name';
+------------+--------------+-------------+--------+---------------+----------------------------+
| table_name | index_name   | object_type | blevel | distinct_keys | last_analyzed              |
+------------+--------------+-------------+--------+---------------+----------------------------+
| emp        | idx_emp_name | INDEX       |   NULL |          NULL | 2024-11-26 14:37:24.061085 |
+------------+--------------+-------------+--------+---------------+----------------------------+ explain select * from emp where emp_name ='emp1234';\n============================================================= \n|ID|OPERATOR        |NAME             |EST.ROWS|EST.TIME(us)|\n-------------------------------------------------------------\n|0 |TABLE RANGE SCAN|emp(idx_emp_name)|1       |7           |\n=============================================================                                                   \n\n-- 修改索引可見性\nmysql> alter table emp alter index idx_emp_name invisible;\n\nmysql> explain select * from emp where emp_name ='emp1234';\n=============================================== \nID|OPERATOR       |NAME|EST.ROWS|EST.TIME(us)| \n----------------------------------------------- \n|0 |TABLE FULL SCAN|emp |2       |573         |\n===============================================       "},"attribs":{"0":"*0|f+ks*0+1i"}},"apool":{"numToAttrib":{"0":["author","6932737685563949084"]},"nextNum":1}},"type":"text","referenceRecordMap":{},"extra":{"channel":"saas","pasteRandomId":"a0126d51-3fd3-4644-a98b-0ceccafceea1","mention_page_title":{},"external_mention_url":{}},"isKeepQuoteContainer":false,"isFromCode":true,"selection":[{"id":232,"type":"text","selection":{"start":0,"end":802},"recordId":"QDfNdrSDEoHoxoxLvTfc5WSbnDe"}],"payloadMap":{},"isCut":false}" data-lark-record-format="docx/text" class="" style="-webkit-tap-highlight-color: transparent; margin: 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> CALL DBMS_MONITOR.OB_SESSION_TRACE_ENABLE(null,1,0.5,'ALL');\n\nmysql> SELECT request_id,usec_to_time(request_time),user_client_ip,user_name,db_name,\n    ->  sql_id,query_sql ,ELAPSED_TIME,QUEUE_TIME,EXECUTE_TIME,plan_id,is_hit_plan,disk_reads\n    ->  FROM oceanbase.gv$OB_SQL_AUDIT \n    ->  WHERE query_sql LIKE '%emp_name%' limit 1\\G;\n*************************** 1. row ***************************\n                request_id: 1669216\nusec_to_time(request_time): 2024-11-26 14:54:24.977470\n            user_client_ip: 82.157.26.195\n                 user_name: testuser\n                   db_name: default_database\n                    sql_id: 5650F89701DF0872BA2FCBD059EDBFC9\n                 query_sql: select * from emp where emp_name ='emp1234'\n              ELAPSED_TIME: 13803\n                QUEUE_TIME: 18\n              EXECUTE_TIME: 271\n                   plan_id: 4878\n               is_hit_plan: 0\n                DISK_READS: 2"},"attribs":{"0":"*0|k+ql*0+t"}},"apool":{"numToAttrib":{"0":["author","6932737685563949084"]},"nextNum":1}},"type":"text","referenceRecordMap":{},"extra":{"channel":"saas","pasteRandomId":"92c4505b-2aa1-49f0-b48c-ff993801eb0d","mention_page_title":{},"external_mention_url":{}},"isKeepQuoteContainer":false,"isFromCode":true,"selection":[{"id":225,"type":"text","selection":{"start":0,"end":986},"recordId":"FipSdXqTCo7yqIxHH6pcoi81nMg"}],"payloadMap":{},"isCut":false}" data-lark-record-format="docx/text" class="" style="-webkit-tap-highlight-color: transparent; margin: 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important;">
-- Analyze 方式收集(未收集索引信息)
mysql> analyze table emp;

mysql> select table_name,object_type, num_rows,blocks,last_analyzed 
    ->  from oceanbase.dba_tab_statistics where table_name='emp';
+------------+-------------+----------+--------+----------------------------+
| table_name | object_type | num_rows | blocks | last_analyzed              |
+------------+-------------+----------+--------+----------------------------+
| emp        | TABLE       |    10000 |   NULL | 2024-11-25 21:39:58.833398 |
+------------+-------------+----------+--------+----------------------------+

mysql> select table_name,index_name,object_type,blevel,distinct_keys,last_analyzed 
    ->  from oceanbase. DBA_IND_STATISTICS where index_name='idx_emp_name';
+------------+--------------+-------------+--------+---------------+----------------------------+
| table_name | index_name   | object_type | blevel | distinct_keys | last_analyzed              |
+------------+--------------+-------------+--------+---------------+----------------------------+
| emp        | idx_emp_name | INDEX       |   NULL |          NULL | 2024-11-25 14:53:29.154282 |
+------------+--------------+-------------+--------+---------------+----------------------------+

-- DBMS_STATS 包方式收集
mysql> CALL DBMS_STATS.GATHER_TABLE_STATS ('testuser', 'emp', method_opt=>'FOR ALL COLUMNS SIZE AUTO', granularity=>'ALL', degree=>4,cascade=>true);

mysql> select table_name,object_type, num_rows,blocks,last_analyzed 
    ->  from oceanbase.dba_tab_statistics where table_name='emp';
+------------+-------------+----------+--------+----------------------------+
| table_name | object_type | num_rows | blocks | last_analyzed              |
+------------+-------------+----------+--------+----------------------------+
| emp        | TABLE       |    10000 |   NULL | 2024-11-26 14:37:24.010639 |
+------------+-------------+----------+--------+----------------------------+

mysql> select table_name,index_name,object_type,blevel,distinct_keys,last_analyzed 
    ->  from oceanbase. DBA_IND_STATISTICS where index_name='idx_emp_name';
+------------+--------------+-------------+--------+---------------+----------------------------+
| table_name | index_name   | object_type | blevel | distinct_keys | last_analyzed              |
+------------+--------------+-------------+--------+---------------+----------------------------+
| emp        | idx_emp_name | INDEX       |   NULL |          NULL | 2024-11-26 14:37:24.061085 |
+------------+--------------+-------------+--------+---------------+----------------------------+ explain select * from emp where emp_name ='emp1234';\n============================================================= \n|ID|OPERATOR        |NAME             |EST.ROWS|EST.TIME(us)|\n-------------------------------------------------------------\n|0 |TABLE RANGE SCAN|emp(idx_emp_name)|1       |7           |\n=============================================================                                                   \n\n-- 修改索引可見性\nmysql> alter table emp alter index idx_emp_name invisible;\n\nmysql> explain select * from emp where emp_name ='emp1234';\n=============================================== \nID|OPERATOR       |NAME|EST.ROWS|EST.TIME(us)| \n----------------------------------------------- \n|0 |TABLE FULL SCAN|emp |2       |573         |\n===============================================       "},"attribs":{"0":"*0|f+ks*0+1i"}},"apool":{"numToAttrib":{"0":["author","6932737685563949084"]},"nextNum":1}},"type":"text","referenceRecordMap":{},"extra":{"channel":"saas","pasteRandomId":"a0126d51-3fd3-4644-a98b-0ceccafceea1","mention_page_title":{},"external_mention_url":{}},"isKeepQuoteContainer":false,"isFromCode":true,"selection":[{"id":232,"type":"text","selection":{"start":0,"end":802},"recordId":"QDfNdrSDEoHoxoxLvTfc5WSbnDe"}],"payloadMap":{},"isCut":false}" data-lark-record-format="docx/text" class="" style="-webkit-tap-highlight-color: transparent; margin: 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important;">
-- Analyze 方式收集(未收集索引信息)
mysql> analyze table emp;

mysql> select table_name,object_type, num_rows,blocks,last_analyzed 
    ->  from oceanbase.dba_tab_statistics where table_name='emp';
+------------+-------------+----------+--------+----------------------------+
| table_name | object_type | num_rows | blocks | last_analyzed              |
+------------+-------------+----------+--------+----------------------------+
| emp        | TABLE       |    10000 |   NULL | 2024-11-25 21:39:58.833398 |
+------------+-------------+----------+--------+----------------------------+

mysql> select table_name,index_name,object_type,blevel,distinct_keys,last_analyzed 
    ->  from oceanbase. DBA_IND_STATISTICS where index_name='idx_emp_name';
+------------+--------------+-------------+--------+---------------+----------------------------+
| table_name | index_name   | object_type | blevel | distinct_keys | last_analyzed              |
+------------+--------------+-------------+--------+---------------+----------------------------+
| emp        | idx_emp_name | INDEX       |   NULL |          NULL | 2024-11-25 14:53:29.154282 |
+------------+--------------+-------------+--------+---------------+----------------------------+

-- DBMS_STATS 包方式收集
mysql> CALL DBMS_STATS.GATHER_TABLE_STATS ('testuser', 'emp', method_opt=>'FOR ALL COLUMNS SIZE AUTO', granularity=>'ALL', degree=>4,cascade=>true);

mysql> select table_name,object_type, num_rows,blocks,last_analyzed 
    ->  from oceanbase.dba_tab_statistics where table_name='emp';
+------------+-------------+----------+--------+----------------------------+
| table_name | object_type | num_rows | blocks | last_analyzed              |
+------------+-------------+----------+--------+----------------------------+
| emp        | TABLE       |    10000 |   NULL | 2024-11-26 14:37:24.010639 |
+------------+-------------+----------+--------+----------------------------+

mysql> select table_name,index_name,object_type,blevel,distinct_keys,last_analyzed 
    ->  from oceanbase. DBA_IND_STATISTICS where index_name='idx_emp_name';
+------------+--------------+-------------+--------+---------------+----------------------------+
| table_name | index_name   | object_type | blevel | distinct_keys | last_analyzed              |
+------------+--------------+-------------+--------+---------------+----------------------------+
| emp        | idx_emp_name | INDEX       |   NULL |          NULL | 2024-11-26 14:37:24.061085 |
+------------+--------------+-------------+--------+---------------+----------------------------+ explain select * from emp where emp_name ='emp1234';\n============================================================= \n|ID|OPERATOR        |NAME             |EST.ROWS|EST.TIME(us)|\n-------------------------------------------------------------\n|0 |TABLE RANGE SCAN|emp(idx_emp_name)|1       |7           |\n=============================================================                                                   \n\n-- 修改索引可見性\nmysql> alter table emp alter index idx_emp_name invisible;\n\nmysql> explain select * from emp where emp_name ='emp1234';\n=============================================== \nID|OPERATOR       |NAME|EST.ROWS|EST.TIME(us)| \n----------------------------------------------- \n|0 |TABLE FULL SCAN|emp |2       |573         |\n===============================================       "},"attribs":{"0":"*0|f+ks*0+1i"}},"apool":{"numToAttrib":{"0":["author","6932737685563949084"]},"nextNum":1}},"type":"text","referenceRecordMap":{},"extra":{"channel":"saas","pasteRandomId":"a0126d51-3fd3-4644-a98b-0ceccafceea1","mention_page_title":{},"external_mention_url":{}},"isKeepQuoteContainer":false,"isFromCode":true,"selection":[{"id":232,"type":"text","selection":{"start":0,"end":802},"recordId":"QDfNdrSDEoHoxoxLvTfc5WSbnDe"}],"payloadMap":{},"isCut":false}" data-lark-record-format="docx/text" class="" style="-webkit-tap-highlight-color: transparent; margin: 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important;">
-- Analyze 方式收集(未收集索引信息)
mysql> analyze table emp;

mysql> select table_name,object_type, num_rows,blocks,last_analyzed 
    ->  from oceanbase.dba_tab_statistics where table_name='emp';
+------------+-------------+----------+--------+----------------------------+
| table_name | object_type | num_rows | blocks | last_analyzed              |
+------------+-------------+----------+--------+----------------------------+
| emp        | TABLE       |    10000 |   NULL | 2024-11-25 21:39:58.833398 |
+------------+-------------+----------+--------+----------------------------+

mysql> select table_name,index_name,object_type,blevel,distinct_keys,last_analyzed 
    ->  from oceanbase. DBA_IND_STATISTICS where index_name='idx_emp_name';
+------------+--------------+-------------+--------+---------------+----------------------------+
| table_name | index_name   | object_type | blevel | distinct_keys | last_analyzed              |
+------------+--------------+-------------+--------+---------------+----------------------------+
| emp        | idx_emp_name | INDEX       |   NULL |          NULL | 2024-11-25 14:53:29.154282 |
+------------+--------------+-------------+--------+---------------+----------------------------+

-- DBMS_STATS 包方式收集
mysql> CALL DBMS_STATS.GATHER_TABLE_STATS ('testuser', 'emp', method_opt=>'FOR ALL COLUMNS SIZE AUTO', granularity=>'ALL', degree=>4,cascade=>true);

mysql> select table_name,object_type, num_rows,blocks,last_analyzed 
    ->  from oceanbase.dba_tab_statistics where table_name='emp';
+------------+-------------+----------+--------+----------------------------+
| table_name | object_type | num_rows | blocks | last_analyzed              |
+------------+-------------+----------+--------+----------------------------+
| emp        | TABLE       |    10000 |   NULL | 2024-11-26 14:37:24.010639 |
+------------+-------------+----------+--------+----------------------------+

mysql> select table_name,index_name,object_type,blevel,distinct_keys,last_analyzed 
    ->  from oceanbase. DBA_IND_STATISTICS where index_name='idx_emp_name';
+------------+--------------+-------------+--------+---------------+----------------------------+
| table_name | index_name   | object_type | blevel | distinct_keys | last_analyzed              |
+------------+--------------+-------------+--------+---------------+----------------------------+
| emp        | idx_emp_name | INDEX       |   NULL |          NULL | 2024-11-26 14:37:24.061085 |
+------------+--------------+-------------+--------+---------------+----------------------------+

寫在最后

國產數據庫發展時間尚短、缺乏場景打磨,存在諸多不足也可理解。但比較欣喜的是,整個國產數據庫廠商都在努力追趕。近年已經多次受邀參加廠商的產品、用戶、生態大會,大家都希望更多聽聽來自外部的聲音。如此次也是OB官方聯系筆者聽取建議,并在新版本發布后第一時間聯系筆者進行評測。

從此次的評測來看,OceanBase在SQL 管理方面取得了長足的進步,達到比較完善的程度,可滿足日常SQL管理工作。在使用體驗上大量仿照了Oracle的做法,上手門檻很低。當然仍存在一些不足,如文檔偏重技術說明、缺少實操過程;不同兼容模式下產品能力尚未對齊等;但相信未來會越來越完善。

責任編輯:姜華 來源: 韓鋒頻道
相關推薦

2025-05-15 07:31:51

2023-11-08 07:31:51

國產數據庫YashanDB

2024-04-26 09:37:43

國產數據庫開發者

2023-08-03 08:42:24

2021-08-02 09:01:29

PythonMySQL 數據庫

2021-08-04 09:00:53

Python數據庫Python基礎

2011-08-01 15:35:51

GlassFishJava 7

2013-03-28 15:59:34

為知筆記

2009-07-30 18:22:14

OracleTimesTenIn-Memory D

2020-08-24 19:23:29

Pythonpipenv開發工具

2015-03-13 15:30:26

編程數據庫創建表單

2009-06-17 09:24:34

學習strutsStruts新版本

2015-02-05 16:59:36

平安WiFiiOS

2010-02-23 17:44:48

Python 3.0

2011-11-04 14:07:40

存儲

2011-03-11 09:14:18

國產數據庫

2011-03-11 09:26:13

2021-08-10 15:32:12

Redis緩存數據庫

2019-05-31 08:23:00

Oracle數據庫云渡劫
點贊
收藏

51CTO技術棧公眾號

青春草在线视频| 日韩欧美亚洲一区二区三区| 最新中文字幕在线播放| 久久久久久久精| 国产97人人超碰caoprom| 性欧美一区二区| 日韩三级精品| 日韩欧美a级成人黄色| 亚洲成人18| 成人免费视频国产免费麻豆| 久久天天综合| 欧美国产日韩免费| 亚洲av片不卡无码久久| 欧美成人免费全部网站| 亚洲国产精品久久人人爱| 欧美日韩亚洲在线| 亚洲黄色a级片| 免费看精品久久片| 91a在线视频| 久久国产美女视频| 欧美在线色图| 欧美精品一区二区久久婷婷| 亚洲第一狼人区| 成av人片在线观看www| 中文字幕亚洲欧美在线不卡| 国产一区二区三区高清| 国产精品一区二区三区在线免费观看| 99亚洲精品| 欧美另类暴力丝袜| 亚洲欧美综合7777色婷婷| 色综合www| 欧美精品一区二区三区久久久 | av黄色一级片| 国产一区二区三区国产精品| 欧美专区亚洲专区| 国产精品沙发午睡系列| 麻豆av在线播放| 亚洲精品欧美专区| 中文字幕精品—区二区日日骚| 欧美女优在线| 91在线高清观看| 国产女主播一区二区| 国产黄色一区二区| 韩国av一区二区三区| 国产精品视频大全| 国产美女www爽爽爽| 久久天天综合| 国产精品极品美女在线观看免费| 黑人一级大毛片| 亚洲国产三级| 国产尤物一区二区| 一区二区三区在线视频免费观看| 欧美日韩综合久久| 青青草在线免费观看| 91原创在线视频| 久久精品中文字幕一区二区三区| 色哟哟国产精品色哟哟| 成人国产精品免费观看| wwwxx欧美| 高清一区二区三区四区| 大白屁股一区二区视频| 国产精品乱码视频| 欧美 日韩 人妻 高清 中文| eeuss鲁片一区二区三区在线观看| 国产精品18毛片一区二区| www.狠狠干| youjizz国产精品| 狠狠色综合欧美激情| 天堂av在线免费| 国产午夜精品在线观看| 亚洲欧美99| a免费在线观看| 一个色妞综合视频在线观看| 黄色一级片在线看| 成人线上视频| 欧美亚一区二区| 午夜免费一级片| 欧美视频二区欧美影视| 亚洲国产精品嫩草影院久久| 爱爱免费小视频| 成人精品影视| 欧美日韩国产二区| 久久久久亚洲av成人毛片韩| 奇米亚洲午夜久久精品| 91久久国产自产拍夜夜嗨| 男人天堂av网| 国产精品欧美经典| 国产女教师bbwbbwbbw| 男女羞羞在线观看| 欧美日韩精品欧美日韩精品一综合| 高清av免费看| 激情av综合| 在线中文字幕日韩| 国产精品九九九九九九| 国产精品久久久久久久久久妞妞 | 一区二区视频在线免费| 日本欧美电影在线观看| 日韩欧美亚洲成人| 日本亚洲一区二区三区| 西瓜成人精品人成网站| 精品国产欧美一区二区五十路| 欧美精品乱码视频一二专区| 久久精品一区二区国产| www 成人av com| а天堂8中文最新版在线官网| 亚洲另类春色国产| 亚洲黄色a v| 国产精品久久久久av蜜臀| 中文字幕久久久| 六月丁香在线视频| 国产一区91精品张津瑜| 日韩aⅴ视频一区二区三区| 日韩另类在线| 欧美女孩性生活视频| 给我看免费高清在线观看| 亚洲国产精品成人| 国产精品久久久久久久久久久久久| 亚洲风情第一页| 国产精品国产馆在线真实露脸 | 精品一区二区影视| 鲁丝片一区二区三区| 亚洲第一图区| 欧美三级在线看| 亚洲精品理论片| 伊人激情综合| 99视频免费观看| 老司机免费在线视频| 日本黄色一区二区| 免费中文字幕av| 亚洲黄色大片| 国产传媒一区| 日本中文字幕中出在线| 欧美麻豆精品久久久久久| 性猛交娇小69hd| 美女尤物久久精品| 美国av一区二区三区| 丁香花高清在线观看完整版| 日韩视频在线永久播放| 久艹在线观看视频| 久久成人av少妇免费| 日韩精品另类天天更新| 欧美xxx网站| 精品中文字幕久久久久久| 日韩欧美性视频| 99久久久国产精品免费蜜臀| 免费高清一区二区三区| 91久久精品无嫩草影院| 欧美国产日韩在线| 亚洲黄色在线免费观看| 亚洲一区影音先锋| fc2成人免费视频| 亚洲精品社区| 精品国产日本| 欧美性xxx| 这里只有精品在线播放| 亚洲手机在线观看| 亚洲同性同志一二三专区| 91pony九色| 午夜日韩电影| 国产精品免费一区二区三区四区 | 国产福利电影在线| 欧美日韩精品系列| 青娱乐国产盛宴| 99久久免费国产| 热久久精品国产| 色乱码一区二区三区网站| 成人国产精品久久久| 黄色成人影院| 亚洲第一二三四五区| 在线观看国产亚洲| 国产农村妇女精品| 992tv人人草| 亚洲三级国产| 日日夜夜精品网站| www欧美在线观看| 色在人av网站天堂精品| 熟妇人妻系列aⅴ无码专区友真希| 精品免费在线视频| 精品人体无码一区二区三区| 国产一区在线观看视频| 婷婷无套内射影院| 精品亚洲成人| 99久久久精品免费观看国产| 美女av在线免费看| 中文字幕在线看视频国产欧美| 国产成人精品一区二三区四区五区| 亚洲高清在线视频| 国产精品理论在线| 成人免费黄色在线| 色哟哟精品视频| 亚洲福利电影| 在线观看日韩片| 日本欧美三级| 91深夜福利视频| 成人美女大片| 九九九久久久久久| 波多野结衣一区二区| 日韩免费在线观看| 日本成人一级片| 精品福利在线观看| 国产女人18水真多毛片18精品| 99久久久久久| 少妇性l交大片7724com| 久久只有精品| 成人午夜视频在线观看免费| 日韩精品网站| 欧美韩国日本精品一区二区三区| av日韩一区| 国产精品久久久久免费a∨大胸| 亚洲最大天堂网| 网站一区二区| 国产精品丝袜视频| 中文字幕成在线观看| 久久亚洲私人国产精品va | 中文字幕精品视频| 天天操天天干天天插| 91精品国产麻豆国产自产在线| 日韩精品在线免费视频| 一区二区三区 在线观看视频| 男人操女人动态图| hitomi一区二区三区精品| 国产精品久久久久久久99| 天堂午夜影视日韩欧美一区二区| 国产xxxx振车| 欧美一区视频| 一区二区不卡在线视频 午夜欧美不卡'| 日韩av资源网| 国产另类自拍| 999在线精品| 147欧美人体大胆444| 青娱乐极品盛宴一区二区| 国产极品jizzhd欧美| 性欧美xxx69hd高清| 国模gogo一区二区大胆私拍 | 国产精品成人国产乱一区| 色吧亚洲日本| 欧美亚洲成人免费| 九色porny丨国产首页在线| 欧美激情a∨在线视频播放| av色综合久久天堂av色综合在| 国产亚洲欧洲黄色| 国产51人人成人人人人爽色哟哟 | 嫩草在线视频| 日韩网站在线观看| 日本精品在线观看视频| 国产一区影院| 国产999视频| 国模一区二区| 国产精品影院在线观看| 国产精品99精品一区二区三区∴| 国产精品久久久久高潮| 日韩久久一区二区三区| 国产精品国产三级国产aⅴ9色 | mm131美女视频| 久久久久久久电影| 纪美影视在线观看电视版使用方法| 国产日韩高清在线| 91精品国自产在线| 国产精品久久久久aaaa樱花| 亚洲综合久久av一区二区三区| 中文字幕亚洲电影| 国产va在线播放| 午夜精品在线看| 国产三级av片| 欧美色综合久久| 国产精品视频一二区| 精品久久人人做人人爱| 午夜性色福利视频| 夜夜嗨av一区二区三区免费区| av女优在线| 欧美成人激情视频| 色吧亚洲日本| 91精品国产综合久久久久久久久| 久久久91麻豆精品国产一区| 国产精品久久久久免费| 男男gay无套免费视频欧美| 亚洲成人自拍视频| 欧美精选在线| 国产又大又硬又粗| 精品亚洲成av人在线观看| 亚洲麻豆一区二区三区| 国产日韩精品一区二区浪潮av| 波多野结衣家庭教师| 国产免费播放一区二区| 亚洲精品国产综合久久| 日本成人一区| 按摩亚洲人久久| av中文字幕在线观看第一页| 国产精品69精品一区二区三区| 亚洲欧美专区| 精品国产乱码久久久久久久软件| 波多野结衣在线播放一区| 国产一区 在线播放| 久久视频一区| 永久免费看片在线观看| 99久久精品免费看| 日韩高清dvd碟片| 精品国产乱码久久久久久虫虫漫画 | 中文字幕第六页| 久久精品欧美一区二区三区不卡| 欧美偷拍第一页| 一本一本大道香蕉久在线精品| 99久久精品无免国产免费| 亚洲欧美国产精品久久久久久久| 日本视频不卡| 欧美亚洲激情视频| 视频二区欧美| 亚洲视频导航| 久久久亚洲人| 久久国产劲爆∧v内射| 国产精品久久久久久亚洲伦| 成年人免费高清视频| 日韩一级片网站| 永久免费av在线| 日本一区二区在线播放| 99精品国产高清一区二区麻豆| 亚洲精品8mav| 视频一区在线视频| 久久人妻少妇嫩草av无码专区| 专区另类欧美日韩| 夜夜爽妓女8888视频免费观看| 亚洲黄色av网站| 在线观看男女av免费网址| 国产精品爽爽ⅴa在线观看| 偷拍自拍一区| 国产精品333| 不卡视频在线看| 久久久www成人免费毛片| 欧美福利电影网| 无遮挡动作视频在线观看免费入口| 欧美在线一区二区三区四| 成人爽a毛片| 欧美国产综合在线| 国产成人综合自拍| 久久久久99精品成人片试看| 欧美日韩不卡在线| 欧美成人三区| 国产欧美久久久久久| 全球成人免费直播| 免费看污污网站| 国产精品免费aⅴ片在线观看| 精品不卡一区二区| 亚洲视频777| 高清在线一区| 一区二区精品在线| 国产制服丝袜一区| 欧洲第一无人区观看| 日韩一区二区免费视频| 中文字幕在线三区| 国产66精品久久久久999小说| 老妇女50岁三级| 欧美日韩国产美女| 亚洲s色大片| 91啪国产在线| 欧美日韩国产色综合一二三四| 三上悠亚 电影| 亚洲国产视频a| 亚洲人视频在线观看| 日本精品免费观看| 日本一区二区在线看| 欧美三级午夜理伦三级富婆| 国产精品成人网| www.日韩高清| 97视频在线观看亚洲| 欧美极品在线观看| 岛国毛片在线播放| 亚洲精品少妇30p| 乱色精品无码一区二区国产盗| 性色av一区二区三区| 精品国产一区一区二区三亚瑟| 手机版av在线| 亚洲国产视频直播| 日本福利片在线| 91精品久久久久久久久久| 欧美777四色影| 亚洲欧美视频在线播放| 在线观看日韩精品| 中文在线手机av| 久久久精品国产一区二区三区| 日韩精品高清不卡| 五月天丁香激情| 亚洲精品永久免费精品| 四虎国产精品免费久久| 国产免费内射又粗又爽密桃视频| 99久久99久久精品国产片果冻| 日本中文字幕在线观看视频| 日韩在线视频中文字幕| 成人h动漫免费观看网站| 日本www高清视频| 亚洲六月丁香色婷婷综合久久| 欧美在线 | 亚洲| 国产精品直播网红| 尹人成人综合网| 久久爱一区二区| 亚洲日本欧美日韩高观看| 日韩成人视屏| 国产高潮免费视频| 精品福利免费观看| 2024最新电影在线免费观看| 欧美资源一区|