ORACLEクエストのOceanBase 2.1互換機能

アウトライン

 

1.4と2.1:OceanBaseは、より多くの社内業務使用は2つのバージョンがありがあり、普遍分散リレーショナル・データベースです。各バージョンにはOceanBaseは常に人々に驚きの多くを与える変更し、ORACLEのバージョン2.1を実装している多くの機能と互換性があります。本論文では、これらの新機能でシンプルな外観。

運用・保守

 

アカウント管理

テナントORACLEモードでは、ユーザーが作成しcreate user、単一引用符パスワードをコマンド。ライセンス、または組み合わせまたはORACLEとMySQL。閲覧権限の方法は、(この時点では、MySQLの構文は非常に便利です)MySQLの構文です。

テナントのORACLEモード、異なるユーザが異なる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クラスタレベルのビューとパラメータを介して変更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');

 


例の修正方法

set global autocommit=on;

性能解析

類似したに関連するOracle AWRの多くを達成OceanBase 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 ;

開発

 

指向開発が主な機能であるDDLDML

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

 

 

支持通过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;

数值函数

目前支持:

  • abs/sign

  • floor/'ceil`

  • trunc/mod

  • bitand

示例如下:

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

 

 

比较函数

目前支持:

  • 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; 

 

 

类型转换函数

主要是数值、字符串、日期之间的互相转换
目前支持:

  • 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;

 

条件函数

目前支持:

  • 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;

 

系统函数

目前支持:

  • uid/user

select uid, user, userenv('schemaid'),SYS_CONTEXT('userenv','current_user') from dual;

 

 

select rownum rn,object_name, object_type from user_objects order by object_name;

 

分析函数

目前支持的聚合函数包括:

  • 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;

 

 

统计数量近似值

select count(distinct customernumber), APPROX_COUNT_DISTINCT(customernumber) from payments;

 

 

统计分组汇总 

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;

 

 

统计分组内第一和最后一个值

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;

 

 

同行显示分组统计的上一个和下一个值

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;

 

 

后记

 

更多Oracle的兼容性还在陆续开发或内部试用中。尤其是存储过程、PLSQL以及Package。请保持关注。

OceanBase对Oracle的兼容只是用户功能接口上的兼容,其底层原理依然是OceanBase特有的原理。

 

推荐阅读

  

 

 

更多后续分享敬请关注公众号:obpilot

 

 

おすすめ

転載: www.cnblogs.com/mq44944/p/oracle2ob.html