加入收藏 | 设为首页 | 会员中心 | 我要投稿 常州站长网 (https://www.0519zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

OceanBase如何获得TPC-C测试第1名?

发布时间:2019-10-14 07:12:00 所属栏目:MySql教程 来源:又是第1的
导读:副标题#e# TPC-C是TPC组织(国际事务性能委员会)制定的关于商品销售的订单创建和订单支付等的基准测试标准,是数据库联机交易处理系统的权威基准测试标准。 蚂蚁金服自研的分布式关系数据库OceanBase获得TPC-C测试第一名后,引起了大量关注,今天,我们邀请

Prepared Statement是一种二进制的请求交互协议,可以大大降低系统的交互成本。OceanBase不仅支持用户程序与数据库间使用Prepared Statement, 也支持在存储过程引擎调用SQL引擎执行时使用这种交互方式。存储过程在对SQL进行一次Prepare操作并获取唯一id后, 后续的每次执行仅需要传入该id和对应的参数,系统可以通过高速缓存找到对应的存储过程或SQL计划开始执行。该过程相比使用SQL文本的交互方式,省去了大量请求文本解析的CPU开销。

OceanBase内部实现了高速缓存来缓存存储过程的可执行代码及SQL执行计划,不同参数的存储过程和SQL可以通过这一高速缓存快速获取需要的执行对象, 耗时一般在几十微秒以内, 有效避免了重新编译带来的毫秒级的延迟和CPU消耗。

可更新视图

在OLTP场景中,通过减少应用与数据库的交互次数来实现性能提升的例子很多,可更新视图就是其中之一。我们常见的数据库视图通常是只读的,通过定义视图,用户可以定义自己感兴趣的数据以及其获取接口,但视图同时也可以作为更新操作的入口,比如在TPC-C的new order创建场景中,应用需要得到商品信息,更新库存并得到更新后的值。一般可以通过两条SQL实现这一过程:

  1. select i_price,i_name, i_data from item where i_id = ?; 

  2.   

  3.     UPDATE stock 

  4.       SET s_order_cnt = s_order_cnt + 1, 

  5.           s_ytd = s_ytd + ?, 

  6.           s_remote_cnt = s_remote_cnt + ?, 

  7.           s_quantity = (CASE WHEN s_quantity< ? + 10 THEN s_quantity + 91 ELSE s_quantity END) - ? 

  8.       WHERE s_i_id = ? 

  9.           AND s_w_id = ? 

  10.       RETURNING s_quantity, s_dist_01, 

  11.           CASE WHEN i_data NOT LIKE'%ORIGINAL%' THEN 'G' ELSE (CASE WHEN s_data NOT LIKE '%ORIGINAL%' THEN 'G'ELSE 'B' END) END 

  12.       BULK COLLECT INTO ...; 

但通过建立一个可更新视图:

  1. CREATE VIEW stock_item AS 

  2.       SELECT i_price, i_name, i_data, s_i_id,s_w_id, s_order_cnt, s_ytd, s_remote_cnt, s_quantity, s_data, s_dist_01 

  3.       FROM stock s, item i WHERE s.s_i_id =i.i_id; 

我们就可以通过一条语句更新库存并得到商品和库存信息:

  1. UPDATE stock_item 

  2.       SET s_order_cnt = s_order_cnt + 1, 

  3.           s_ytd = s_ytd + ?, 

  4.           s_remote_cnt = s_remote_cnt + ?, 

  5.           s_quantity = (CASE WHEN s_quantity< ? + 10 THEN s_quantity + 91 ELSE s_quantity END) - ? 

  6.       WHERE s_i_id = ? 

  7.           AND s_w_id = ? 

  8.       RETURNING i_price, i_name, s_quantity,s_dist_01, 

  9.           CASE WHEN i_data NOT LIKE'%ORIGINAL%' THEN 'G' ELSE (CASE WHEN s_data NOT LIKE '%ORIGINAL%' THEN 'G'ELSE 'B' END) END 

  10.       BULK COLLECT INTO ...; 

(编辑:常州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读