天天看點

OceanBase 2.1 的ORACLE相容性能力探秘

OceanBase是一款通用的分布式關系型資料庫,目前内部業務使用比較多有兩個版本:1.4和2.1。OceanBase每個版本變化總能帶給人很多驚喜,其中2.1版本實作了ORACLE很多特性的相容。本文主要簡單浏覽一下這些新功能。

概述

OceanBase是一款通用的分布式關系型資料庫,目前内部業務使用比較多有兩個版本:1.4和2.1。OceanBase每個版本變化總能帶給人很多驚喜,其中2.1版本實作了ORACLE很多特性的相容。本文主要簡單浏覽一下這些新功能。

運維

賬戶管理

在ORACLE Mode的租戶裡,建立使用者依然是

create user

指令,密碼不用單引号。授權方式還是還是ORACLE和MySQL的結合。檢視權限方式是MySQL的文法(這點還是MySQL文法很友善)。

在ORACLE Mode的租戶裡,不同使用者就是不同

SCHEMA

,預設彼此資料通路權限隔離,除非明确授權通路。

$obclient -h11.***.84.84 -usys@tnt_oracle#obdemo -P2883 SYS -A -pobDBA2019

create user ora_user identified by 123456;
grant all privileges on ora_user.* to ora_user;
grant select on sys.* to ora_user;
show grants for ora_user;
select username, account_status, lock_date, expiry_date, created from dba_users;
           
OceanBase 2.1 的ORACLE相容性能力探秘

執行個體變量檢視

OceanBase叢集級别的參數是通過檢視和修改

parameters

,但是在Oracle租戶裡,租戶級别的設定修改依然是通過類似修改MySQL的變量(

variables

)來的。這點跟Oracle原生執行個體不一樣。

show global variables where variable_name in (\'autocommit\',\'ob_compatibility_mode\',\'ob_enable_sql_audit\',\'ob_query_timeout\',\'ob_read_consistency\',\'ob_tcp_invited_nodes\',\'ob_trx_timeout\',\'sql_mode\',\'tx_isolation\',\'system_time_zone\',\'time_zone\');
           
OceanBase 2.1 的ORACLE相容性能力探秘

修改方法舉例

set global autocommit=on;
           

性能分析

OceanBase實作了很多類似Oracle的AWR相關的

GV$

視圖。不過大部分在業務租戶下是沒有權限檢視的。業務租戶下隻提供了一個SQL全量日志視圖。這個也夠用了。詳細用法參見《阿裡資料庫性能診斷的利器——SQL全量日志》

select /*+ read_consistency(weak) query_timeout(1000000000) */ request_time, svr_Ip, trace_id, sid, client_ip, tenant_id,tenant_name,user_name,db_name, query_sql, affected_rows,ret_code, event, state, elapsed_time, execute_time, queue_time, decode_time, get_plan_time, block_cache_hit, bloom_filter_cache_Hit, block_index_cache_hit, disk_reads,retry_cnt,table_scan, memstore_read_row_count, ssstore_read_row_count, round(request_memory_used/1024/1024) req_mem_mbfrom gv$sql_audit where user_name in (\'ora_user\') and rownum<100order by request_time desc ;
           

開發

面向開發的功能主要就是

DDL

DML

了。

DDL

建表

OceanBase的表是索引組織表(

IOT

),強烈建議設定主鍵,并且主鍵就是資料。

建表時支援的資料類型如下:

  • CHAR

    /

    VARCHAR2

  • DATE

    /

    TIMESTAMP

    /

    TIMESTAMP WITH TIME ZONE

    /

    TIMESTAMP WITH LOCAL TIME ZONE

  • INTERVAL

    (部分運算)
  • NUMBER

    (包括其子類型

    int

    等)
  • CLOB

    /

    BLOB

    (不超過48M)

建表示例:

$obclient -h11.***.84.84 -uora_user@tnt_oracle#obdemo -P2883 -A -p123456 ORA_USER
create table t01(
 id number not null,
   c1    char(10),
   c2    varchar2(10),
   c3    DATE    default sysdate,
   c4    timestamp    default systimestamp,
   c5    timestamp with time zone default localtimestamp,
   c6    timestamp with local time zone default localtimestamp,
   c7    int,
   c8    clob,
   c9    blob
);

create sequence seq_t01 start with 1000000000 increment by 2 cache 100 ;
insert into t01(id, c1, c2, c7, c8) 
values(seq_t01.nextval, \'test\', \'test\',99999999999,\'clobtextclobtextclobtextclobtextclobtextclobtextclobtextclobtextclobtext\');
select * from t01\G
           
OceanBase 2.1 的ORACLE相容性能力探秘

支援通過

CTAS

方法從老表建立新表。

修改表結構

目前對修改表結構類型還有很多限制,如隻能在同類類型中改大值域。如

varchar

擴大長度。

函數

目前支援ORACLE常用的函數。如時間函數、數值函數、字元串函數、類型轉換函數、條件函數、系統函數、統計分析函數等等。

時間函數

目前支援:

  • interval

  • localtimestamp

  • current_timestamp

  • sysdate

    /

    systimestamp

select sysdate, sysdate + interval\'1\' minute next_min, sysdate + interval\'1\' hour next_hour, sysdate + interval\'1\' day next_day from dual;
           
OceanBase 2.1 的ORACLE相容性能力探秘

數值函數

目前支援:

  • abs

    /

    sign

  • floor

    /\'ceil`
  • trunc

    /

    mod

  • bitand

示例如下:

select abs(-3.1415926), ceil(3.1415926), floor(3.1415926), sign(-3.1415926),round(314 / 7, 0), mod(314,7), trunc(3.1415926) f rom dual;

OceanBase 2.1 的ORACLE相容性能力探秘

比較函數

目前支援:

  • least

    /

    greatest

字元串函數

目前支援:

  • pad

    /

    lpad

    /

    rpad

  • instr

    /

    substr

  • concat

    /

    ||

  • length

    /

    lengthb

  • lower

    /

    upper

select lpad(3.14159, 10, \'*\') c1, rpad(\'Apple\', 10, \'<\') c2, ltrim(\'   Hello\') c3, rtrim(\'World!   \') c4, \'Hello \' || \' World\' c5, concat(\'Hello \',\' World!\') c6, lower(\'Hello World!\') c7, upper(\'Hello World!\') c8, instr(\'Hello World\',\'o\',6) c9, substr(\'Hello World\',5,3) c10, length(\'Hello 中國!\') c11, lengthb(\'Hello 中國!\') c12 from dual; 
           
OceanBase 2.1 的ORACLE相容性能力探秘

類型轉換函數

主要是數值、字元串、日期之間的互相轉換

目前支援:

  • to_date

    /

    to_timestamp

  • to_char

  • to_number

示例如下:

select cast(\'3.1415926\' as number), to_date(\'2019-05-23 14:00:00\',\'yyyy-mm-dd hh24:mi:ss\'), to_number(\'3.1415926\'), to_char(3.1415926), to_timestamp(sysdate), to_timestamp_tz(sysdate) from dual;
           
OceanBase 2.1 的ORACLE相容性能力探秘

條件函數

目前支援:

  • case...when...end

  • nvl

  • decode

drop table t02;
create table t02(id number not null , type varchar2(2), gmt_create date not null default sysdate);
insert into t02(id,type) values(1,\'R\'),(2,\'B\'),(3,NULL);commit;
select id, NVL(type,\'NULL!\') type,  case type when \'R\' then \'Good guy!\' when \'B\' then \'Bad guy!\' else \'Unknown!\' end type_desc, 
decode(type,\'R\',\'Good guy!\',\'B\',\'Bad guy!\',\'Unknown!\') type_desc2,  gmt_create 
from t02;
           
OceanBase 2.1 的ORACLE相容性能力探秘

系統函數

目前支援:

  • uid

    /

    user

select uid, user, userenv(\'schemaid\'),SYS_CONTEXT(\'userenv\',\'current_user\') from dual;
           
OceanBase 2.1 的ORACLE相容性能力探秘
select rownum rn,object_name, object_type from user_objects order by object_name;
           
OceanBase 2.1 的ORACLE相容性能力探秘

分析函數

目前支援的聚合函數包括:

  • COUNT

  • APPROX_COUNT_DISTINCT

  • SUM

    MAX

    MIN

    AVG

  • LISTAGG

    RANK

    DENSE_RANK

    PERCENT_RANK

     +

    ROW_NUMBER

  • NTILE

    CUME_DIST

    FIRST_VALUE

    LAST_VALUE

  • LEAD

    LAG

    NTH_VALUE

示例如下:

統計組内排名

select customernumber, checknumber, paymentdate, amount, dense_rank() over (partition by customernumber order by amount) dense_rank , 
round(PERCENT_RANK() over (partition by customernumber order by amount),2)  perentage
from payments where customernumber=141 order by dense_rank, customernumber;
           
OceanBase 2.1 的ORACLE相容性能力探秘

統計數量近似值

select count(distinct customernumber), APPROX_COUNT_DISTINCT(customernumber) from payments;
           
OceanBase 2.1 的ORACLE相容性能力探秘

統計分組彙總 

select * from ( select OFFICECODE, listagg(LASTNAME,\',\') within GROUP (ORDER BY EMPLOYEENUMBER) OVER (partition by OFFICECODE) EMP_LIST, row_number() over (partition by OFFICECODE order by EMPLOYEENUMBER) as rn FROM employees) where rn = 1;

OceanBase 2.1 的ORACLE相容性能力探秘

統計分組内第一和最後一個值

select OFFICECODE, listagg(LASTNAME,\',\') within GROUP (ORDER BY EMPLOYEENUMBER) OVER (partition by OFFICECODE) EMP_LIST, first_value(LASTNAME) over (partition by OFFICECODE order by EMPLOYEENUMBER ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) first_emp_all, last_value(LASTNAME) over (partition by OFFICECODE order by EMPLOYEENUMBER ) last_emp, last_value(LASTNAME) over (partition by OFFICECODE order by EMPLOYEENUMBER ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) last_emp_all FROM employees order by OFFICECODE;

OceanBase 2.1 的ORACLE相容性能力探秘

同行顯示分組統計的上一個和下一個值

select customernumber, checknumber, paymentdate,amount, round(cume_dist() over (partition by customernumber order by amount) ,2) as cume_dist ,lag(amount) over (partition by customernumber order by amount) last_ck,lead(amount) over (partition by customernumber order by amount) next_ckfrom payments where customernumber in (412,447,452,458) order by customernumber;

OceanBase 2.1 的ORACLE相容性能力探秘

後記

更多Oracle的相容性還在陸續開發或内部試用中。尤其是存儲過程、

PLSQL

以及

Package

。請保持關注。

OceanBase對Oracle的相容隻是使用者功能接口上的相容,其底層原理依然是OceanBase特有的原理。

推薦閱讀

  • OceanBase資料庫實踐入門——了解總控服務
  • OceanBase資料庫實踐入門——常用操作SQL
  • OceanBase分區表有什麼不同?

更多後續分享敬請關注公衆号:obpilot