成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

國產新銳,崖山數據庫產品初探

原創 精選
數據庫 其他數據庫
近期受邀對國產數據庫-YashanDB的最新版本進行了評測,進而對這一新興國產數據庫有了較完整的認識,也為我們國產數據庫取得進步感到欣喜。后續的測試內容,是基于 YashanDB 最新版本-v23.1版本進行的測試。

近些年來,數據庫國產化成為大的趨勢,涌現出一批數據庫廠商。這些產品或基于開源構建、或全新自研,通過較短時間的發展取得了不俗的成績。近期受邀對國產數據庫-YashanDB的最新版本進行了評測,進而對這一新興國產數據庫有了較完整的認識,也為我們國產數據庫取得進步感到欣喜。后續的測試內容,是基于 YashanDB 最新版本-v23.1版本進行的測試。感興趣的同學,也可以通過如下鏈接獲取免費版本進行測試。

下載鏈接:http://download.yashandb.com。

一、YashanDB 簡要介紹

崖山數據庫管理系統(YashanDB)是深圳計算科學研究院在經典數據庫理論基礎上,融入新的原創理論,自主設計、研發的新型數據庫管理系統。第一次看到YashanDB的架構及能力,還是挺驚訝的,感覺是一個集“Oracle單機+DataGuard+RAC+分布式MPP(Shared-Nothing)”于一身的全面手。為了更好的理解,我簡單列個表格說明下。

1、多部署架構

(1)主備架構

(2)共享集群架構

(3)分布式架構

2、多存儲引擎

存儲引擎是數據庫核心部件之一,YashanDB通過不同的存儲引擎適應不同的應用場景,以獲得面向在線交易場景的高效事務處理能力,面向實時分析場景的事務與分析均衡能力,和面向海量穩態數據分析場景的高性能。基于不同的存儲引擎,YashanDB支持的表類型有HEAP表,TAC表和LSC表。

  • HEAP Table:行存表,主打OLTP場景。
  • TAC Table (Transaction Analytics Columnar Table) :列存表,主打實時分析場景。
  • LSC Table (Large-scale Storage Columnar Table):列存表,主打海量穩態數據的交互式分析場景。

3、多計算引擎

作為SQL引擎的核心組件,YashanDB的優化器采用CBO(Cost Based Optimizer)優化模式,基于統計信息,計算數據訪問和處理所需要的代價,選擇代價最低的方案生成執行計劃。另外YashanDB 支持多種計算引擎,包括基于火山模型的執行引擎、向量化執行引擎及PL/SQL 引擎。針對大數據量下的列計算,YashanDB采用向量化執行模型,利用SIMD原理對某一列數據進行批量處理和計算,提高CPU利用率,大批量地減少程序循環。PL/SQL為數據庫內部引擎,能夠靈活高效地訪問數據庫對象,其語法基于SQL語言擴展,可編程性強,支持用戶將業務邏輯下沉到數據層,更接近數據更高效,并可通過多級封裝實現安全、隔離、簡潔的接口供多應用系統調用。

4、多發行版本

YashanDB 也支持多種發行版本,滿足不同需求。

  • 個人版:YashanDB面向個人用戶推出的免費試用版本,除不支持多模數據  類型、高級安全能力、數據庫集群等企業級功能,該版本包含YashanDB數據庫所有基礎核心能力,支持單機主備部署形態,配套開發者工具;同時對最大連接數、表空間限額、列存、運維和數據遷移工具等做了限制。供個人用戶或開發者用于學習、測試、開發用途。
  • 標準版:YashanDB面向小規模用戶推出的商業版本,該版本價格適中,除不支持多模數據類型、高級安全能力等企業級功能,該版本包含YashanDB數據庫所有基礎核心能力,支持單機主備、分布式、集群部署形態,配套完整數據遷移和監控運維工具,可以為政府或中小企業提供支持其操作所需的基本能力。
  • 企業版:YashanDB面向大規模用戶推出的商業版本,該版本包含YashanDB數據庫完整核心能力,支持PB級海量數據存儲和大量的并發用戶,支持模數據類型、高級安全能力,支持單機主備、分布式、集群部署形態,配套完整數據遷移和監控運維工具,可以滿足支撐各類企業應用。

二、 YashanDB 新版本評測

YashanDB 功能很多,覆蓋多種架構及形態,可滿足多種場景。受個人精力所限,此次評測僅針對發布版本的亮點功能-Oracle兼容性,進行了簡單測試。從 Oracle DBA 角度來看,YashanDB 與 Oracle 的兼容度頗高,產品無論從設計理念、到核心功能、再到生態工具,都兼顧了 Oracle 的能力及操作習慣,甚至在部分能力上還有所增強。因此無論是使用者、開發者、管理者等角度看,相對上手的難度都不大。當然 Oracle 兼容性本身功能也是很復雜,可參考我之前寫的文章,想做到完全兼容是不太現實的。下面挑選了部分對比項進行評測,其中部分內容通過官網文檔內容說明,未做進一步測試。特別聲明:以下測試結果僅代表個人意見,不作為產品選型評估依據。

1、數據類型

數據類型部分,情況則相對復雜。Oracle 支持的數據類型范圍較廣,YashanDB 支持了大部分數據類型,但在處理精度、存儲空間等方面與Oracle還是有所區別。下面針對主要的數據類型進行了測試。

-- 測試字符類型
SQL> create table test_char(
country_id char,
city_id nchar(2),
address varchar2(4000),
name nvarchar2(40)
); 
Succeed.

SQL> insert into test_char values ('1', '11', '北京市海淀區', '張三');
1 row affected.

SQL> select * from test_char;
COUNTRY_ID CITY_ID   ADDRESS                  NAME                                                             
---------- --------- ------------------------ ------------------------------------- 
1          11        北京市海淀區              張三                                                          

-- 測試數字類型
SQL> create table test_num(
n1 number,
n2 number(38),
n3 number(9,2),
n4 int,
n5 smallint,
n6 decimal(5,2),
n7 float,
n8 float(2),
n9 real,
n10 binary_float,
n11 binary_double
); 
Succeed.

SQL> insert into test_num values (1.23, 123, 7456123.89, 573, 34, 673.43, 34.1264, 56.2, 23.231, 12.34, 34.56);
1 row affected.

SQL> select * from test_num;
         N1          N2          N3           N4       N5          N6          N7          N8          N9         N10         N11 
----------- ----------- ----------- ------------ -------- ----------- ----------- ----------- ----------- ----------- ----------- 
       1.23         123  7456123.89          573       34      673.43  3.413E+001   5.62E+001  2.323E+001  1.234E+001  3.456E+001
1 row fetched.

SQL> insert into test_num values (1.23, 123, 7456123.89, 573, 34, 673.43, 34.1264, 56.2, 23.231, 12.34f, 34.56d);
select * from test_num;
[1:98]YAS-04105 invalid number character f
// 在Oracle中可以使用f或F表示前面是個浮點數,目前YashanDB還不支持這種寫法。

-- 擴展類型
SQL> create table test_long_varchar(a varchar2(8000));
Succeed.
// YashanDB還針對部分數據類型,支持了更大的值域范圍,如示例中的VARCHAR2類型。

-- 測試日期/時間類型
SQL> create table test_date(
t1 date,
t2 timestamp(6),
t3 interval year(3) to month,
t4 interval day(3) to second(6)
); 
Succeed.

SQL> insert into test_date values(sysdate,sysdate,INTERVAL '1' YEAR,INTERVAL '1' DAY);
1 row affected.

SQL> select * from test_date;
T1            T2                                 T3              T4                               
------------- ---------------------------------- --------------- -----------------------
2023-10-27    2023-10-27 16:52:49.000000         +01-00          +01 00:00:00.000000    

SQL> create table test_date_timezone(
t1 timestamp(9) with time zone,
t2 timestamp with local time zone
);
[2:17]YAS-04209 unexpected word with
// 目前YashanDB還不支持帶有時區的類型

-- 測試布爾型
SQL> create table test_bool ( a boolean);
Succeed.

SQL> insert into test_bool values(true);
1 row affected.

SQL> insert into test_bool values(false);
1 row affected.

SQL> select * from test_bool;
A                    
-------------------- 
true                
false               
// YashanDB 增加了 Oracle 不支持的布爾類型。

-- 測試大對象類型
SQL> create table test_bigfile(
f1 long,f2 blob,f3 clob,f4 nclob,f5 bfile);
[2:1]YAS-04229 invalid datatype

SQL> create table test_bigfile(
f1 blob,f2 clob); 
Succeed.

SQL> insert into test_bigfile (f1, f2) values ('1', '2');
1 row affected.

SQL> select * from test_bigfile;
F1                                                               F2                                                               
---------------------------------------------------------------- ---------------------------------------------------------------- 
01                                                               2                                                               
1 row fetched.

2、字符集及排序

字符集方面,常見的中文字符集(gbk、gb18030)及utf8系列字符集是支持重點。從官網上查看YashanDB支持的字符集,具體如下。針對字符集排序方面,YashanDB 支持部分Oracle排序能力,還有部分尚不支持。

-- 查看當前字符集
SQL> select userenv('language') from dual;
USERENV('LANGUAGE')                                              
---------------------------------------------------------------- 
UTF8  

-- 測試排序
SQL> create table test_sort(name varchar2(20));
Succeed.

SQL> insert into test_sort values('張三');
SQL> insert into test_sort values('李四');

SQL> select * from test_sort;
NAME                  
--------------------- 
張三               
李四               

SQL> SELECT name FROM test_sort ORDER BY NLSSORT(name,'NLS_SORT=SCHINESE_PINYIN_M');
NAME                  
--------------------- 
李四               
張三               

-- 按偏旁部首排序(不支持)
SQL> SELECT name FROM test_sort ORDER BY NLSSORT(name,'NLS_SORT=SCHINESE_RADICAL_M');
[3:23]YAS-04352 invalid NLS parameter string used in SQL function

-- 按筆畫排序(不支持)
SQL> SELECT name FROM test_sort ORDER BY NLSSORT(name,'NLS_SORT=SCHINESE_STROKE_M');
[3:23]YAS-04352 invalid NLS parameter string used in SQL function

3、數據庫對象

在數據庫對象方面,Oracle 支持非常豐富的對象類型,包括但不限于表、索引、分區、視圖、序列、同義詞、觸發器、DB Link等等。YashanDB 支持了大部分數據類型,支持部分的對象尚有部分能力與Oracle還是有所區別。

-- 【測試表】 
---- 堆表
SQL> create table test_heap ( id int,name varchar2(10));
Succeed.
-- 索引組織表(不支持)
SQL> create table test_iot(id varchar2 (10),name varchar2(20),
       constraint pk_id primary key(id)
) organization index;  
[6:14]YAS-04247 invalid table type

-- 簇表(不支持)
SQL> create cluster test_cluster(id number);
[1:16]YAS-04115 "DATABASE" expected but missing

-- 臨時表
SQL> create global temporary table test_temp_tran (
  tid number(3), tname varchar2(30)
) on commit delete rows;
Succeed.
SQL> create global temporary table test_temp_sess(
   tid number(3), tname varchar2(30)
) on commit preserve rows; 
Succeed.

SQL> create private temporary table yas$ptt_privatetemtable(c1 int,c2 int);
Succeed.
// YashanDB還支持一種新的臨時表類型-private temporary。
// 該語句只作用于單機HEAP/TAC表,用于指定創建的表為私有臨時表。
// 在某個會話中創建的私有臨時表,其表結構及數據只對本會話可見。
// 私有臨時表的名稱必須為YAS$PTT_開頭。

--壓縮表
SQL> create table test_compress(id number,name varchar2(20)) compress;
Succeed.

-- 分區
SQL> create table test_partition(product_id varchar2(5), sales_count number(10,2))
partition by range(sales_count)
(
  partition p1 values less than(1000),
  partition p2 values less than(2000),
  partition p3 values less than(3000)
);

SQL> SELECT PARTITION_NAME,HIGH_VALUE FROM USER_TAB_PARTITIONS WHERE TABLE_NAME='TEST_PARTITION';
PARTITION_NAME      HIGH_VALUE       
------------------- ---------------- 
P1                  1000            
P2                  2000            
P3                  3000                                       

SQL> insert into test_partition values('1',600);
1 row affected.
SQL> insert into test_partition values('2',1000);
1 row affected.
SQL> insert into test_partition values('3',2300);
1 row affected.
SQL> insert into test_partition values('4',6000);
YAS-02115 partition key does not map to any partition
SQL> commit;

SQL> select * from test_partition partition(p1);
PRODUCT_ID SALES_COUNT 
---------- ----------- 
1                  600

-- 增加一個分區
SQL> alter table test_partition add partition p4 values less than(maxvalue);
SQL> insert into test_partition values('4',6000);
1 row affected.
SQL> SELECT PARTITION_NAME,HIGH_VALUE FROM USER_TAB_PARTITIONS WHERE TABLE_NAME='TEST_PARTITION';
PARTITION_NAME      HIGH_VALUE       
------------------- ---------------- 
P1                  1000            
P2                  2000            
P3                  3000            
P4                  maxvalue  

-- 復合分區(List+Hash)
CREATE TABLE TEST_LIST_HASH (vl1 varchar2(20),vl2 number(12))
PARTITION BY LIST (vl1)
SUBPARTITION BY HASH (vl2) 
SUBPARTITION TEMPLATE 
(
SUBPARTITION SP1, 
SUBPARTITION SP2, 
SUBPARTITION SP3, 
SUBPARTITION SP4
)
(
PARTITION P1 VALUES ('MIN', 'HOUR','SECOND'), 
PARTITION P2 VALUES ('DAY', 'MONTH','YEAR'), 
PARTITION P3 VALUES (DEFAULT)
);  

-- 【索引】 
---- BTree索引
SQL> create table test_index( a int,b int,c int,d int);
Succeed.
SQL> create index idx_test_a on test_index(a);
Succeed.
SQL> create index idx_test_ab on test_index(a,b);
Succeed.
SQL> create index idx_test_c on test_index(c desc);
Succeed.

-- Bitmap索引(不支持)
SQL> create table test_bitmap_index(a int,b int);
Succeed.

SQL> create bitmap index on test_bitmap_index(a);
[1:8]YAS-04225 invalid word bitmap

-- 基于函數的索引
SQL> create table test_fbi(a int,b int);
Succeed.

SQL> create index idx_fbi on test_fbi(abs(a));
Succeed.

SQL> explain plan for select * from test_fbi where abs(a)=1;                                                       
+----+--------------------------------+----------------------+------------+----------+
| Id | Operation type                 | Name                 | Owner      | Rows     |
+----+--------------------------------+----------------------+------------+----------+
|  0 | SELECT STATEMENT               |                      |            |          |
|  1 |  TABLE ACCESS BY INDEX ROWID   | TEST_FBI             | HFUSER1    |          |
|* 2 |   INDEX RANGE SCAN             | IDX_FBI              | HFUSER1    |       100|
+----+--------------------------------+----------------------+------------+----------+-- 視圖SQL> create table test_view( a int,b int);
Succeed.

SQL> insert into test_view values(1,1);
SQL> insert into test_view values(1,1);
SQL> insert into test_view values(2,2);

SQL> create view v1_simple as select * from test_view where a=1;
Succeed.

SQL> create view v2_complex as select a,count(*) cnt from test_view group by a;
Succeed.

SQL> select * from v1_simple;
 A            B 
------------ ------------ 
 1            1
 1            1

SQL> select * from v2_complex;
 A                   CNT 
------------ --------------------- 
 1                     2
 2                     1
           
SQL> update v1_simple set b=3;  
[1:8]YAS-02012 table or view does not exist
// 視圖更新還不支持

-- 序列
SQL> create sequence test_seq1 increment by 2 start with 100;
Succeed.

SQL> select test_seq1.currval,test_seq1.nextval from dual;
TEST_SEQ1.CURRVAL TEST_SEQ1.NEXTVAL 
----------------- ----------------- 
100               100

SQL> /
TEST_SEQ1.CURRVAL TEST_SEQ1.NEXTVAL 
----------------- -----------------
102               102

-- 同義詞
SQL> create or replace synonym test_syn for user_tables;
Succeed.

-- 觸發器
SQL> create table test_trigger(a int,b int);
Succeed.

SQL> create or replace trigger test_trigger1
before insert on test_trigger
for each row
begin
 :new.b:=:new.a+100;
end;
/

SQL> insert into test_trigger(a) values(1);
SQL> select * from test_trigger;
 A            B 
------------ ------------
1          101          

-- 存儲過程
SQL> create or replace procedure test_procas
begin
  dbms_output.put_line('hello word');
end; 
/
Succeed.

SQL> set serveroutput on
SQL> call test_proc();hello word

-- DB Link
SQL> create user hfuser2 identified by 123456;
SQL> grant dba to hfuser2;
SQL> conn hfuser2/123456
SQL> create database link test_lnk connect to hfuser1 identified by 123456 using '172.16.31.8:1688';
Succeed.

SQL> select * from test_partition@test_lnk;
PRODUCT_ID SALES_COUNT 
---------- ----------- 
1       600
2       1000
3       2300
4       6000

SQL> insert into test_partition@test_lnk values(5,700);
1 row affected.

SQL> select * from test_partition@test_lnk;
PRODUCT_ID SALES_COUNT 
---------- ----------- 
1       600
5       700
2       1000
3       2300
4       6000

-- 【測試表】

4、內置函數

函數部分,Oracle支持數百種函數,可以說極大豐富了數據庫處理數據的能力。YashanDB 兼容支持了大部分函數,這樣可以大幅降低代碼改造的工作量。

-- 數學函數
SQL> SELECT ABS(-5) AS abs_test FROM DUAL;
ABS_TEST 
--------------------- 
5

SQL> select cos(0) from dual;
COS(0) 
----------- 
   1.0E+000
   
SQL> select acos(-1) from dual; 
ACOS(-1) 
----------- 
 3.142E+000

SQL> SELECT MOD(15, 4) AS mod_test FROM DUAL;
 MOD_TEST 
--------------------- 
 3
                    
-- 日期函數
SQL> SELECT SYSDATE AS sysdate_test FROM DUAL;
SYSDATE_TEST                     
-------------------------------- 
2023-10-16                      

SQL> SELECT DATE('2022-08-01') AS date_test FROM DUAL;
DATE_TEST                        
-------------------------------- 
2022-08-01                      

SQL> SELECT EXTRACT(MONTH FROM SYSDATE) AS extract_test FROM DUAL;
EXTRACT_TEST 
------------ 
10

SQL> SELECT TRUNC(SYSDATE, 'MONTH') AS trunc_test FROM DUAL; 
TRUNC_TEST                       
-------------------------------- 
2023-10-01    

-- 字符函數
SQL> SELECT LENGTH('Hello, World!') AS length_test FROM DUAL; 
LENGTH_TEST 
--------------------- 
13

SQL> SELECT SUBSTR('Hello, World!', -4) AS substr_test FROM DUAL;
SUBSTR_TEST 
----------- 
rld!       

SQL> SELECT INSTR('Hello, World!', 'o') AS instr_test FROM DUAL;
INSTR_TEST 
--------------------- 
5

SQL> SELECT UPPER('Hello, World!') AS upper_test FROM DUAL;
UPPER_TEST        
----------------- 
HELLO, WORLD!    

SQL> SELECT TRIM('  Hello, World!  ') AS trim_test FROM DUAL;
TRIM_TEST         
----------------- 
Hello, World!

-- 其他函數
SQL> SELECT NVL('true', 'false') AS nvl_test FROM DUAL;
NVL_TEST 
-------- 
true          

SQL> SELECT USERENV('CLIENT_INFO') res FROM DUAL;
RES                                                              
---------------------------------------------------------------- 
user: HFUSER1
program path: /data1/yashan/yasdb_home/yashandb/23.1.0.309/bin/yasql    
    
SQL> SELECT DECODE('',1,1,2) res1,
DECODE(1,1,1,'1',2,3) res2,
DECODE(1,'',1,'1',2,3) res3,
DECODE('','',1,3) res4
FROM DUAL; 
RES1      RES2      RES3      RES4 
------------ ------------ ------------ ------------ 
 2        1        2         1
           
SQL> SELECT SYS_CONTEXT('USERENV', 'IP_ADDRESS') res FROM DUAL;
RES                                                              
---------------------------------------------------------------- 
172.16.31.8

5、SQL語法

SQL 語法部分,是 Oracle 頗為復雜的部分,也是很多后續改造遷移工作的重點難點。這部分涉及的情況比較多,僅做了部分簡單的測試。

SQL> select * from test1;
A        B 
------------ ------------ 
1        1
2        2
3        3

SQL> select * from test2;
A        B 
------------ ------------ 
1        1
2        2
4        4

-- 表連接(ANSI寫法)
SQL> select * from test1 full outer join test2 on test1.a=test2.a;
A        B        A        B 
------------ ------------ ------------ ------------ 
1         1        1        1
2         2        2        2
                  4        4
3         3    
-- 表連接(Oracle方言)       
SQL> select * from test1,test2 where test1.a(+)=test2.a;
 A       B        A        B 
------------ ------------ ------------ ------------ 
1        1        1        1
2        2        2        2
                 4        4
                                     
-- 子查詢
SQL> select * from test1 where test1.a in (select test2.a from test2);
A        B 
------------ ------------ 
1        1
2        2

-- 窗口函數
SQL> select test1.*, rank() over(order by test1.a desc) as ranks
     from test1;
A        B        RANKS 
------------ ------------ --------------------- 
3        3         1
2        2         2
1        1         3
           
-- 聚合函數
SQL> select a from test1 group by a having count(*)<2;
A 
------------ 
1
2
3
           
-- 集合查詢
SQL> select * from test1 minus select * from test2;
A         B 
------------ ------------ 
3         3

-- 使用偽列     
SQL> select * from test1 where rownum<2;
A        B 
------------ ------------ 
1        1
           
SQL> select rowid,* from test1;
ROWID            A        B 
---------------------- ------------ ------------ 
2281:4:0:212:0      1        1
2281:4:0:212:1      2        2
2281:4:0:212:2      3        3

6、過程化語言

過程化語言,是指在數據庫端處理數據的一種語言,也是很多國產數據庫的痛點。從用戶角度來看,過程化語言確實大大豐富了數據處理能力,是一種不可或缺的能力。YashanDB 這方面做了很大程度的兼容,常用的過程化語言用法都支持。

-- 包與存儲過程
SQL> create package my_package as
  procedure my_procedure (
    p_input_param in integer,
    p_output_param out integer
  );
end my_package;
/
Succeed.

SQL> create package body my_package as
  procedure my_procedure (
    p_input_param in integer,
    p_output_param out integer
  ) as
  begin
    p_output_param := p_input_param * 2;
  end my_procedure;
end my_package;
/ 
Succeed.

SQL> set serveroutput on
SQL> declare
  v_output_param integer;
begin
  my_package.my_procedure(10, v_output_param);
  dbms_output.put_line('output parameter value: ' || v_output_param);
end;
/
output parameter value: 20
PL/SQL Succeed.

-- Java UDF
SQL> create or replace library ya_lib is '/home/yashan/example/UDFexample.class';
Succeed.

$ cat UDFexample.java
package example;
public class UDFexample {
    public static String execJdbcexample(int ctrls) {
        switch (ctrls) {
        case 1:return "Hello";
        case 2:return "World";
        default:return "!";
        }
    }

    public static void main(String[] args) {
       String a = execJdbcexample(1);
    }
}

$ javac UDFexample.java
$ ls -lrt
-rw-rw-r--. 1 yashan yashan 322 Oct 31 11:44 UDFexample.java
-rw-rw-r--. 1 yashan yashan 477 Oct 31 11:45 UDFexample.class
SQL> CREATE OR REPLACE FUNCTION udf_func_java(argu INT) RETURN VARCHAR IS
LANGUAGE java
NAME 'example.UDFexample.execJdbcexample(int) return string'
LIBRARY ya_lib;
/
Succeed.

SQL> SELECT udf_func_java(1) FROM dual;
UDF_FUNC_JAVA(1)                                                 
---------------------------------------------------------------- 
Hello                                                           

SQL> SELECT udf_func_java(2) FROM dual;
UDF_FUNC_JAVA(2)                                                 
---------------------------------------------------------------- 
World

7、數據字典/系統視圖

數據字典,是元數據的存儲。系統視圖,則是反映系統運行狀態的一個窗口。YashanDB 提供了動態視圖和系統視圖支持。其中,動態視圖為系統提供的以V$、GV$或DV$開頭的視圖,用于實時展現正處于數據庫運行中的各項數據,尤其與性能相關數據,用戶通過查詢這些視圖,對系統進行管理和優化。

  • V$視圖:本地動態視圖,查詢當前所在實例節點的數據,在單機、分布式、共享集群部署中的表現一致。
  • GV$視圖:全局動態視圖,在共享集群部署中,GV$視圖查詢的是所有實例數據進行匯聚的結果,在單機/分布式部署中,GV$視圖等同于V$視圖,查詢的是本地數據。
  • DV$視圖:分布式動態視圖,DV$視圖只在分布式部署中存在,查詢的是所有節點數據進行匯聚的結果。
-- 動態視圖
SQL> select database_name,log_mode,open_mode,status,current_scn from v$database;
DATABASE_NAME    LOG_MODE       OPEN_MODE      STATUS    CURRENT_SCN 
------------------ ----------------- ----------------- ----------- --------------------- 
yashandb        ARCHIVELOG      READ_WRITE      NORMAL    489941942425038848

SQL> select startup_time,host_name,data_home,instance_name from v$instance;
STARTUP_TIME            HOST_NAME    DATA_HOME                  INSTANCE_NAME      
---------------------------- ------------- ----------------------------------- -------------------
2023-10-12 17:31:41.069135  host-23-8    /data1/yashan/yasdb_data/db-1-1    yasdb       

SQL> select name, thread_id,status from v$process;
NAME                    THREAD_ID             STATUS                            
--------------------------------- --------------------- --------------------------------- 
TIMER                    96616                 Working                          
BUFFER_POOL                96617                 Working                          
PRELOADER                 96618                Working                          
PRELOADER                 96619                 Working                          
SMON                    96620                 Working                          
CKPT                    96621                 Working                          
DBWR                    96622                 Working                          
DBWR                    96623                 Working                          
SCHD_TIMER                96624                 Working                          
TCP_LSNR                  96625                 Working                          
LISTENER_LOG               96627                 Working                          
TCP_LSNR                  96628             Working                          
TCP_LSNR                  96629             Working                          
MMON                    96630             Working                          
JOB_QUEUE                 96631             Working                          
RD_ARCH                  96636             Working                          
ARCH_DATA                 96637             Working                          
HEALTH_MONITOR              96639             Working                          
PARAL_WORKER_0              96641             Working                          
PARAL_WORKER_1              96642             Working                          
LOGW                    96643             Working                          
XFMR                    96644             Working 

-- DBA/ALL/USER視圖
SQL> select username,account_status,profile from dba_users;
USERNAME  ACCOUNT_STATUS      PROFILE    
--------- ------------------- -----------
SYS      OPEN            DEFAULT    
HFUSER2   OPEN            DEFAULT    
HFUSER1   OPEN            DEFAULT    
MDSYS    LOCKED          DEFAULT    

SQL> select owner,object_type,count(*) from dba_objects group by owner,object_type order by 1,3 desc;
OWNER      OBJECT_TYPE       COUNT(*) 
----------- --------------------- --------- 
HFUSER1     TABLE          16
HFUSER1     INDEX          6
HFUSER1     TABLE PARTITION    4
HFUSER1     VIEW           2
HFUSER1     LOB            2
HFUSER1     SYNONYM         1
HFUSER1     TRIGGER         1
HFUSER1     SEQUENCE        1
HFUSER1     PROCEDURE        1
HFUSER2     UNDEFINED        1

8、SQL/PLSQL引擎

SQL 引擎部分,是 Oracle 內核最為強大的組件,提供如查詢改寫、預編譯、CBO、執行計劃(展示、緩存、綁定、管理)、自適應游標、提示等非常豐富的能力,可對 SQL 語句及執行做到全方位的管理。YashanDB的優化器采用CBO(Cost Based Optimizer)優化模式。優化器的目標是為SQL語句生成最有效的執行計劃傳遞給執行器,執行計劃包含數據訪問路徑、表連接順序等執行算子信息。YashanDB的CBO優化器基于統計信息,計算數據訪問和處理所需要的代價,選擇代價最低的方案生成執行計劃。其統計信息主要包括表、列、索引的統計信息,例如表的行數、列的平均長度、索引包含的列數等。統計信息有動態收集、實時收集、在線收集、定時任務及手動觸發等多種收集方式,同時,可通過并行統計、抽樣統計等技術加快統計效率,為優化器提供及時更新的信息。在執行算子上,支持了掃描、表連接、查詢、排序、輔助、PX并行執行等多種算子。同時支持利用Hint,對優化器對算子的選擇和執行方式提出干預,例如指定表掃描的方式、指定執行順序、指定并行度等,優化器將根據這些提示,結合統計信息,生成最優的執行計劃。Oracle特有的PL/SQL能力,能夠靈活高效地訪問數據庫對象,其語法基于SQL語言擴展,可編程性強,支持用戶將業務邏輯下沉到數據層,更接近數據更高效,并可通過多級封裝實現安全、隔離、簡潔的接口供多應用系統調用。YashanDB也支持了包括存儲過程、匿名塊、函數、JOB、觸發器和高級包功能。這部分未做詳細測試。

-- 統計信息
SQL> exec dbms_stats.gather_schema_stats('hfuser1');
PL/SQL Succeed.

SQL> select table_name,num_rows,blocks,last_analyzed,partitioned,temporary from user_tables;
TABLE_NAME         NUM_ROWS   BLOCKS      LAST_ANALYZED   PARTITIONED TEMPORARY 
---------------------- ----------- ---------- ----------------- ----------- --------- 
TEST_TEMP_SESS                                  N        Y        
TEST_TEMP_TRAN                                  N        Y        
T_PROC            0        1      2023-10-18      N        N        
TEST2            3        1      2023-10-18      N        N        
TEST1            3        1      2023-10-18      N        N        
TEST_TRIGGER        1        1      2023-10-18      N        N        
TEST_VIEW          3        1      2023-10-18      N        N        
TEST_FBI          0       0      2023-10-18      N        N        
TEST_BITMAP_INDEX    0       0      2023-10-18      N        N        
TEST_INDEX         3       1      2023-10-18      N        N        
TEST_COMPRESS       0       0      2023-10-18      N        N        
TEST_PARTITION      4       4      2023-10-18      Y        N        
TEST_HEAP          0       0      2023-10-18      N        N        
TEST_BIGFILE        1       1      2023-10-18      N        N        
TEST_DATE          1       1      2023-10-18      N        N        
TEST_NUM          1       1      2023-10-18      N        N        
TEST_CHAR          1       1      2023-10-18      N        N        
TEST_TBS          1       1      2023-10-18      N        N    SQL> select index_name,table_name,blevel,distinct_keys,status from user_indexes;INDEX_NAME            TABLE_NAME BLEVEL     DISTINCT_KEYS    STATUS    
--------------------- ---------------- ------------ ----------------- --------- 
SYS_IL2248C00001$$    TEST_BIGFILE                               VALID    
SYS_IL2248C00000$$    TEST_BIGFILE                       VALID    
IDX_FBI               TEST_FBI    0                 0 VALID    
IDX_TEST_C            TEST_INDEX   0                 0 VALID    
IDX_TEST_AB           TEST_INDEX    0                 0 VALID    
IDX_TEST_A            TEST_INDEX   0                 0 VALID   

-- 優化器
SQL> show parameter optimizer_mode;
NAME             VALUE                                                            
---------------- ----------------
0 rows fetched.
//YashanDB 目前尚不支持修改優化器行為。

9、系統調優

系統調優是 DBA 常規需要完成的工作,包括實例調優、語句調優等。實例調優通常通過診斷報告進行分析后調整,語句調優通常包括查看執行計劃、語句調優、結構優化等。對于不易調整的計劃,也可以采用如Hint、Outline的方式進行改寫。下圖是 YashanDB 生成的 AWR 報告,形式上與 Oracle AWR 十分類似。通過這一報告可以快速了解快照間系統整體運行狀況,當然目前 YashanDB 支持的指標還沒有那么多,相信未來會不斷完善。

下面是針對語句調優,可完成的一些工作。

-- 查看執行計劃(EXPLAIN)
SQL> explain plan for select * from test_partition where product_id=2;
PLAN_DESCRIPTION                                                 
---------------------------------------------------------------- 
SQL hash value: 3275967159                                      
Optimizer: ADOPT_C                                                                                                              
+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+
| Id | Operation type            | Name            | Owner    | Rows    | Cost(%CPU)  | Partition info                 |
+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+
|  0 | SELECT STATEMENT          |               |        |       |         |                                |
|  1 |  PART SCAN ALL          |               |        |       1|    34( 0)| [0,3]                          |
|* 2 |   TABLE ACCESS FULL        | TEST_PARTITION     | HFUSER1   |       1|    34( 0)|                                |
+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+
Operation Information (identified by operation id):             
---------------------------------------------------                                                                             
   2 - Predicate : filter("TEST_PARTITION"."PRODUCT_ID" = 2)    

SQL> set autotrace on
SQL> select * from test_partition where product_id=2;
Execution Plan                                                   
---------------------------------------------------------------- 
SQL hash value: 3275967159                                      
Optimizer: ADOPT_C                                              
+----+--------------------------------+----------------------+------------+----------+----------+-------------+----------+----------+----------+----------+--------------------------------+
| Id | Operation type            | Name            | Owner    | E - Rows | A - Rows | Cost(%CPU)  | A - Time | Loops   | Memory  | Disk    | Partition info            |
+----+--------------------------------+----------------------+------------+----------+----------+-------------+----------+----------+----------+----------+--------------------------------+
|  0 | SELECT STATEMENT          |               |        |       |       |         |       |       |       |       |                      |
|  1 |  PART SCAN ALL          |               |        |       1|       |     34( 0)|       |       |       |       | [0,3]                 |
|* 2 |   TABLE ACCESS FULL        | TEST_PARTITION     | HFUSER1   |      1|       |     34( 0)|       |       |       |       |                     |
+----+--------------------------------+----------------------+------------+----------+----------+-------------+----------+----------+----------+----------+--------------------------------+                                                             
Operation Information (identified by operation id):             
---------------------------------------------------                                                                        
   2 - Predicate : filter("TEST_PARTITION"."PRODUCT_ID" = 2)    

-- 查看執行計劃(AutoTrace)
SQL> set autotrace on
SQL> select count(*) from test1;

             COUNT(*) 
--------------------- 
                    3
Execution Plan                                                   
---------------------------------------------------------------- 
SQL hash value: 860157296                                       
Optimizer: ADOPT_C                                                                
+----+----------------------+--------+---------+----------+----------+-------------+----------+----------+----------+----------+----------------+
| Id | Operation type     | Name   | Owner  | E - Rows | A - Rows | Cost(%CPU)  | A - Time | Loops    | Memory   | Disk     | Partition info |
+----+----------------------+--------+---------+----------+----------+-------------+----------+----------+----------+----------+----------------+
|  0 | SELECT STATEMENT   |      |       |      |      |         |       |      |      |      |            |
|  1 |  AGGREGATE      |      |       |      1|      |     13( 0)|       |      |      |      |            |
|  2 |   TABLE ACCESS FULL | TEST1  | HFUSER1  |      3|      |     13( 0)|       |      |      |      |            |
+----+----------------------+--------+---------+----------+----------+-------------+----------+----------+----------+----------+----------------+
Statistics
----------------------------------------------------------------------------------------------------
11 rows fetched.

-- Hint
SQL> select * from test_index where a=2;
+----+--------------------------------+----------------------+------------+
| Id | Operation type            | Name            | Owner    |
+----+--------------------------------+----------------------+------------+
|  0 | SELECT STATEMENT          |               |        |
|  1 |  TABLE ACCESS BY INDEX ROWID | TEST_INDEX       | HFUSER1   |
|* 2  |   INDEX RANGE SCAN        | IDX_TEST_A        | HFUSER1   |
+----+--------------------------------+----------------------+------------+

SQL> select /*+ full(test_index) */ * from test_index where a=2;
+----+--------------------------------+----------------------+------------+
| Id | Operation type            | Name            | Owner    |
+----+--------------------------------+----------------------+------------+
|  0 | SELECT STATEMENT          |                |        |
|* 1 |  TABLE ACCESS FULL        | TEST_INDEX        | HFUSER1   |
+----+--------------------------------+----------------------+------------+

10、安全特性

YashanDB實現了用戶、角色、權限管理,支持包括三權分離等能力。特別是針對DBA關注的安全需求,如審計、防火墻、數據加密等能力也有實現。雖然相較于Oracle還有著不小的差距,如數據加密僅支持表空間,但初步安全能力都已具備,可滿足日常安全需求。以用戶及角色為例,簡單測試了一下。

SQL> CREATE USER hfuser1 IDENTIFIED BY 123456;
Succeed.

SQL> GRANT CONNECT TO hfuser1;
Succeed.

SQL> GRANT RESOURCE TO hfuser1;
Succeed.

SQL> GRANT CONNECT,RESOURCE TO hfuser1;
YAS-02216 invalid privilege or role specified
//這點與Oracle有差異,無法單次授予多個角色權限

SQL> CONN hfuser1/123456
Connected to:
YashanDB Server Enterprise Edition Release 23.1.0.309 x86_64 - X86 64bit Linux

SQL> select username,user_id,account_status,default_tablespace from user_users;
USERNAME     USER_ID     ACCOUNT_STATUS    DEFAULT_TABLESPACE        
-------------- ------------ ------------------- ------------------------- 
HFUSER1        3         OPEN             USERS

11、實例管理

實例管理,是DBA日常對數據庫實例的運維類操作,包括對實例狀態、參數、日志、控制文件等的管理。

-- 實例啟停
SQL> select status from v$instance;
STATUS        
------------- 
OPEN         

SQL> shutdown;
Succeed.

[mys@host-23-8 ~]$ nohup yasdb open &
[1] 110817

[mys@host-23-8 ~]$ yasql sys/xxx@<ip>:<port>
YashanDB SQL Enterprise Edition Release 23.1.0.309 x86_64
Connected to:
YashanDB Server Enterprise Edition Release 23.1.0.309 x86_64 - X86 64bit Linux
SQL> select status from v$instance;
STATUS        
------------- 
OPEN    

--在線與歸檔日志
SQL> SELECT database_name,log_mode,open_mode FROM v$DATABASE;
DATABASE_NAME       LOG_MODE          OPEN_MODE         
------------------- ----------------- ----------------- 
yashandb            ARCHIVELOG        READ_WRITE       

SQL> SELECT * FROM v$archived_log;                  
NAME                            SEQUENCE# THREAD# RESETLOGS_ID         FIRST_CHANGE# 
---------------------------- ------------ ------- ------------ --------------------- 
/data1/yashan/arch_0_1.ARC              1       1            0                     0 
/data1/yashan/arch_0_2.ARC              2       1            0    488514779900493824 
/data1/yashan/arch_0_3.ARC              3       1            0    488993590743019520 
/data1/yashan/arch_0_4.ARC              4       1            0    489347488660754432 
/data1/yashan/arch_0_5.ARC              5       1            0    490055274011684864 
/data1/yashan/arch_0_6.ARC              6       1            0    490314622336798720 
/data1/yashan/arch_0_7.ARC              7       1            0    490409186952015872 
/data1/yashan/arch_0_8.ARC              8       1            0    490528754307604480 

SQL> select * from v$logfile;
THREAD#    ID NAME                BLOCK_SIZE  BLOCK_COUNT  USED_BLOCKS    SEQUENCE# STATUS    
------- ----- ----------------- ------------ ------------ ------------ ------------ --------- 
      1     0 /data1/redo1              4096        32768          192            9 CURRENT  
      1     1 /data1/redo2              4096        32768        32768            6 INACTIVE 
      1     2 /data1/redo3              4096        32768         2749            7 INACTIVE 
      1     3 /data1/redo4              4096        32768          174            8 INACTIVE 

-- 參數
SQL> show parameter;
NAME                                                             VALUE                                                            
---------------------------------------------------------------- ---------------------------------------------------------------- 
MAX_SESSIONS                                                     1024                                                            
MAX_WORKERS                                                      0                                                               
MAX_PARALLEL_WORKERS                                             32                                                              
MAX_REACTOR_CHANNELS                                             0                                                               
WORK_AREA_STACK_SIZE                                             1024K                                                           
...                                               
ENABLE_ARCH_DATA_IGNORE_BACKUP                                   FALSE                                                           
176 rows fetched.
//YashanDB 包含了176個參數

SQL> alter system set MAX_SESSIONS=1000 scope=spfile;
Succeed.

--控制文件
SQL> select * from v$controlfile;
   ID NAME                                                               BLOCK_SIZE FILE_SIZE_BLKS                 BYTES 
----- ---------------------------------------------------------------- ------------ -------------- --------------------- 
    0 /data1/yashan/yasdb_data/db-1-1/dbfiles/ctrl1                            8192           3097              25370624
    1 /data1/yashan/yasdb_data/db-1-1/dbfiles/ctrl2                            8192           3097              25370624
    2 /data1/yashan/yasdb_data/db-1-1/dbfiles/ctrl3                            8192           3097              25370624

12、存儲管理

YashanDB 使用與Oracle類似的層次存儲,包含Tablespace-Datafile-Segment-Extent-Block多個級別。

-- 表空間管理
[mys@host-23-8 ~]$ yasql sys/xxx@<ip>:<port>
YashanDB SQL Enterprise Edition Release 23.1.0.309 x86_64
Connected to:
YashanDB Server Enterprise Edition Release 23.1.0.309 x86_64 - X86 64bit Linux

SQL> select tablespace_name from dba_tablespaces;
TABLESPACE_NAME                                                  
---------------------------------------------------------------- 
SYSTEM                                                          
SYSAUX                                                          
TEMP                                                            
SWAP                                                            
USERS                                                           
UNDO        

SQL> create tablespace tbs_test datafile '.../dbfiles/tbs_test.dbf' size 10m autoextend on;
Succeed.

mys@host-23-8 ~]$ yasql hfuser1/<ip>:<port>

SQL> create table test_tbs ( a int) tablespace tbs_test;
Succeed.

SQL> insert into test_tbs values(1);
1 row affected.

13、備份恢復

備份恢復能力是數據庫的基礎,也是保護數據的最重要手段。YashanDB提供了多種備份及恢復方式,有基于SQL(BACKUP、RESTORE語句)、基于工具YasRMAN(類似RMAN)或者通過圖形化終端發起備份。備份支持全量及多級增量備份,同時可支持備份壓縮與加密。恢復方面,支持全量及基于時點的還原,后者僅支持單機版本。下面針對備份做個簡單測試

SQL> BACKUP DATABASE FULL FORMAT '/tmp/backup_full_20231017';
Succeed.

[mys@host-23-8 ~]$ ls -al /tmp/backup_full_20231017/*
-rw-r----- 1 mys mys 124387328 Oct 17 20:07 /tmp/backup_full_20231017/arch0_0_5_0.bak
-rw-r----- 1 mys mys      5632 Oct 17 20:07 /tmp/backup_full_20231017/backup_filelist
-rw-r----- 1 mys mys  16777216 Oct 17 20:07 /tmp/backup_full_20231017/backup_profile
-rw-r----- 1 mys mys  25370624 Oct 17 20:07 /tmp/backup_full_20231017/ctrl_0_0_0.bak
-rw-r----- 1 mys mys  67108864 Oct 17 20:07 /tmp/backup_full_20231017/data_0_0_0.bak
-rw-r----- 1 mys mys  67108864 Oct 17 20:07 /tmp/backup_full_20231017/data_1_0_0.bak
-rw-r----- 1 mys mys      8192 Oct 17 20:07 /tmp/backup_full_20231017/data_2_0_0.bak
-rw-r----- 1 mys mys      8192 Oct 17 20:07 /tmp/backup_full_20231017/data_3_0_0.bak
-rw-r----- 1 mys mys  67108864 Oct 17 20:07 /tmp/backup_full_20231017/data_4_0_0.bak
-rw-r----- 1 mys mys 134217728 Oct 17 20:07 /tmp/backup_full_20231017/data_5_0_0.bak
-rw-r----- 1 mys mys 134217728 Oct 17 20:07 /tmp/backup_full_20231017/data_5_0_1.bak
-rw-r----- 1 mys mys  67108864 Oct 17 20:07 /tmp/backup_full_20231017/data_5_0_2.bak

14、高可用

在高可用方面,YashanDB支持多種高可用架構,包括主備模式(類似Oracle DataGuard)、共享模式(類似Oracle RAC)、分布式模式。其中主備模式支持一主多備和級聯備模式(不限層級),當主機發生故障的時候,業務可以轉移到備機上繼續執行,降低故障對業務的影響,提高數據庫的可用性。共享模式則是在共享存儲與共享內存技術實現一個單庫多實例的多活數據庫系統。支持在線故障自動切換和故障自動恢復,集群任一實例異常都不影響正常實例對外提供的服務。分布式則是采用Shared-Nothing 架構,由管理節點組、協調節點組與數據節點組組成。這些節點部署在不同主機上,有不同的安裝目錄、數據目錄,并且通過一些網絡端口進行內部通訊或對外提供服務。此外,針對對象級的誤操作等,也提供了閃回功能。受限于測試環境,未做高可用測試。

15、生態接口與工具

YashanDB 可通過很多的數據訪問接口,如常見的JDBC、ODBC、C、Python、ADO.NET 等,幾乎面對不同訪問語言都有對應的訪問接口可用。同時支持持久化框架-Mybatis、SQL開發工具(如DataGrip、DBeaver)、BI工具(如FineBI)及大數據分析工具(如Spark、Kafka等)。為了方便運維,其也支持很多獨立小工具,很多如 Oracle 的工具集,如yasql(命令行管理工具)、imp/exp(導入導出工具)、yasboot(安裝部署與運維工具)、yasrman(備份工具)、yasldr(文本加載工具)等。

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

2025-05-15 07:31:51

2024-03-08 07:36:30

2011-11-04 14:07:40

存儲

2011-03-11 09:26:13

2011-03-11 09:14:18

國產數據庫

2010-09-28 11:11:09

Flachcache

2025-04-08 06:00:00

2023-03-31 17:02:28

2011-03-11 12:51:48

國產數據庫安全

2023-03-06 21:19:19

2022-10-21 07:07:33

TiDBHTAP數據庫

2011-05-24 14:27:42

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 免费的色网站 | 日韩欧美在线视频播放 | 九九精品久久久 | 一区视频 | 国产乱码精品一区二区三区av | 伊人成人免费视频 | 全部免费毛片在线播放网站 | 欧美视频一区二区三区 | 成人国产精品色哟哟 | 日本精品免费在线观看 | 亚洲福利在线观看 | 午夜国产一级片 | 成人久久久 | 欧美福利一区 | 国产精品久久 | 日韩精品成人网 | 亚洲视频在线一区 | 日韩a| 欧美成视频 | 中文字幕一区二区三区四区 | 欧美国产一区二区 | 综合中文字幕 | 欧美精品一区二区三区在线四季 | 男女羞羞网站 | 亚洲+变态+欧美+另类+精品 | 成人久久 | 鸳鸯谱在线观看高清 | 在线精品亚洲欧美日韩国产 | 国产精品特级毛片一区二区三区 | 精品欧美二区 | 最新日韩欧美 | 黄 色 毛片免费 | 97超碰人人草 | 久久88 | 91在线播| 一区二区在线免费观看 | 久久夜视频| 天天干视频 | 国产精品久久亚洲 | 国产精品国产a级 | 国产精品久久久久久 |