服务器性能测试及调优在技术界备受关注。国产数据库与Intel服务器的性能有何不同?OceanBase在不同应用场景中应如何进行优化?让我们来共同分析讨论。
CREATE PROCEDURE test_cpu
IS
test_power number;
g_start number;
second_run number;
BEGIN
g_start:= dbms_utility.get_time;
for v in 1..1000000 loop
select power(32,64)
into test_power
from dual;
end loop;
second_run:=(dbms_utility.get_time-g_start);
dbms_output.put_line('cpu耗时(厘秒):'||second_run);
END test_cpu;
/
服务器性能测试对比
先来查看一下服务器的性能测试结果。以Intel服务器和一家国产数据库服务器为例,Intel服务器完成一个存储过程大约需要13.739秒,而那家国产数据库服务器则需要大约25.921秒。一对比之下,我们发现Intel服务器的CPU性能大约是国产服务器的CPU性能的1.96倍,这表明国产服务器CPU的性能与Intel存在显著差距。因此,那些在Intel服务器CPU上消耗较大的SQL操作,一旦迁移到国产服务器,可能会遇到性能上的问题。
OceanBase 逻辑核处理能力
select dispatchta0_.id as id1_53_, dispatchta0_.bo_actual_id as bo_actual_id2_53_, dispatchta0_.claim_variable_id as claim_variable_id3_53_,
dispatchta0_.create_time as create_time4_53_, dispatchta0_.memo as memo5_53_, dispatchta0_.message as message6_53_,
dispatchta0_.notification_no as notification_no7_53_, dispatchta0_.proc_inst_id as proc_inst_id8_53_, dispatchta0_.status as status9_53_,
dispatchta0_.task_def_key as task_def_key10_53_, dispatchta0_.task_id as task_id11_53_, dispatchta0_.task_variable_id as
task_variable_id12_53_, dispatchta0_.top_actual_id as top_actual_id13_53_, dispatchta0_.update_time as update_time14_53_ from BPM_DISPATCH_TASK_PARA
dispatchta0_ where 1=1 and dispatchta0_.status='0' and mod(dispatchta0_.top_actual_id, 13)=4 and rownum<100 order by dispatchta0_.id asc
我们来讨论一下OceanBase服务器的逻辑核处理能力。以Intel的64核x86服务器为例,得考虑到Proxy、sys租户和操作系统带来的额外负担,同时CPU使用率需保持在70%以下,这样大概可以维持在70000QPS或7000TPS的水平。若QPS或TPS中任一数值超出单服务器CPU的承载极限,就需要考虑对应用架构及代码进行优化,或者借助OceanBase的分布式特性进行分布式架构设计。
|ID|OPERATOR |NAME |EST. ROWS|COST |
-------------------------------------------------------------
|0 |SORT | |1 |20728|
|1 | SUBPLAN SCAN |VIEW1 |1 |20728|
|2 | LIMIT | |1 |20728|
|3 | PX COORDINATOR | |1 |20728|
|4 | EXCHANGE OUT DISTR |:EX10000 |1 |20728|
|5 | LIMIT | |1 |20728|
|6 | PX PARTITION ITERATOR| |1 |20728|
|7 | TABLE SCAN |DISPATCHTA0_|1 |20728|
=============================================================
|DISPATCHTA0_:table_rows:32, physical_range_rows:52480, logical_range_rows:32,
OceanBase 删除机制影响
ALTER TABLE user_table TABLE_MODE = 'queuing';
OceanBase 删除表记录的过程与众不同。在删除记录时,它并不会立即进行物理删除,而是仅在内存中为相应记录添加删除标识。只有等到 OceanBase 每日进行数据合并时,这些记录才会被真正删除。因此,在进行表调度任务参数表的全量扫描时,会扫描到大量已被标记为删除的记录,这直接导致了查询性能的显著降低。因此,在应用 OceanBase 构建表格和处理数据时,这一点必须被考虑在内。
extended select runtimeuse0_.id as id1_68_, runtimeuse0_.dispatch_task_type as dispatch_task_type2_68_, runtimeuse0_.task_def_key as
task_def_key3_68_, runtimeuse0_.task_state as task_state4_68_, runtimeuse0_.task_variable_id as task_variable_id5_68_,
runtimeuse0_.task_weight as task_weight6_68_, runtimeuse0_.unit_code as unit_code7_68_, runtimeuse0_.user_code as user_code8_68_,
runtimeuse0_.user_group as user_group9_68_, runtimeuse0_.count as count10_68_, runtimeuse0_.create_time as create_time11_68_,
runtimeuse0_.memo as memo12_68_, runtimeuse0_.status as status13_68_, runtimeuse0_.update_time as update_time14_68_
-> from bpm.BPM_USER_TASKCOUNT_DETAIL runtimeuse0_
-> where 1=1 and runtimeuse0_.status='0' and rownum<1000
-> order by runtimeuse0_.id ascG
AP 场景性能挑战
|ID|OPERATOR |NAME |EST. ROWS|COST |
-------------------------------------------------------------
|0 |SORT | |918 |44164|
|1 | SUBPLAN SCAN |VIEW1 |918 |42233|
|2 | LIMIT | |918 |42219|
|3 | PX COORDINATOR | |918 |42205|
|4 | EXCHANGE OUT DISTR |:EX10000 |918 |39576|
|5 | LIMIT | |918 |39576|
|6 | PX PARTITION ITERATOR| |918 |39562|
|7 | TABLE SCAN |RUNTIMEUSE0_|918 |39562|
在AP环境下,处理数据时常常面临海量的信息,挑战不少。数据量庞大,SQL操作逻辑复杂,子查询和外连接频繁使用,还涉及PL特性。这要求技术人员具备高超的SQL优化技巧。他们必须拥有丰富的优化经验和专业技能,才能有效应对SQL优化的复杂任务,确保服务器性能最佳。
标量子查询优化策略
标量子查询优化对于提升性能至关重要。将成本较高的标量子查询改为外连接后,性能可提高20%至30%。在Oracle 9版本中,人们常利用标量子查询优化外连接性能。然而,尽管OceanBase支持标量子查询,其性能通常不如外连接。因此,在将数据库从Oracle迁移至OceanBase的过程中,将原子查询转换为外部连接,是一种有效的逆向优化策略。这样做能够有效提高数据库的整体运行效率。
create index status_idx on BPM_USER_TASKCOUNT_DETAIL(case deleted_status when ‘0’ then ‘0’ end);
不同场景优化手段
Where status=’0’ and (case deleted_status when ‘0’ then ‘0’ end)=’0’
不同情境下,优化策略各有不同。当国产服务器CPU性能难以显著提高时,在处理大量高并发场景时,通常会采取索引设计优化和queuing表设计来提升效率;而在处理海量数据加工时,则常通过改进标量子查询和外连接、优化虚拟表处理inlist问题、优化索引设计、将全局索引改为本地索引以提升并发性能、以及清理冗余索引来优化DML操作的性能。合理用这些优化手段能提升数据库系统整体性能和稳定性。
在工作中,你是否遇到过类似提升服务器性能的挑战?若觉得本文对你有帮助,别忘了点赞和转发!
UPDATE fssc_expensebillline_ods SET status = 'S' WHERE BATCHNO =
'JB_EXPENSEBILL_W60827207_20231118_020908_03588e523ef244efae82ff5cf619565e'
|ID|OPERATOR |NAME |EST. ROWS|COST |
----------------------------------------------------------
|0 |TABLE SCAN|FSSC_EXPENSEBILLLINE_ODS|140485 |5576337|
FSSC_EXPENSEBILLLINE_ODS:table_rows:14190397, physical_range_rows:14194466, logical_range_rows:14190397, index_back_rows:0,
output_rows:140484, est_method:local_storage, optimization_method=cost_based, |7 | TABLE SCAN |RUNTIMEUSE0_|918 |39562|