在一些业务场景中,用户须要插入、更新、删除一行或者多行指标数据行,而后取得本人刚刚插入、更新、删除之后的行或者其局部字段的值,包含局部字段形成的任意非法的表达式的值。
对于MySQL用户来说,要做到这一点,用户通常须要在一个显式的事务中执行update语句,而后应用雷同的查问条件把update的语句取出来。
之所以要在显式事务中做,是为了避免其余并发的事务update了本连贯刚刚update的行,那样的话,随后的select语句失去行就不是本连贯刚刚update之后的行了,因为这些行又被其余事务更新过了。
而在Oracle和PostgreSQL数据库中,用户能够应用update/delete语句的returning子句,用一条语句实现上述工作。
这样的益处是能够晋升效率,省去的开销包含发送一条select语句以及做指标行的查找等工作;省去的开销还包含操作显式事务的开销,也就是发送begin和commit语句的开销。
因而,应用update...returning语句预期能够比在显式事务中update行,而后select进去,可能晋升性能10%以上。
所以这是一个很好的性能。事实上如果你搜寻 "mysql update returning",你还能搜到不少在MySQL中实现相似oracle/postgresql的单条update/delete语句的returning子句的文章,通过借助触发器和长期表等技巧和简单的操作。
然而这些简单的步骤导致语句执行效率也显著升高了,并且应用也不不便(须要对每个数据表创立触发器)。
为了晋升用户的程序效率,升高用户的开发难度,晋升用户应用KunlunDB的体验,咱们在KunlunDB中也实现insert/update/delete语句的returning子句。
为此,咱们在kunlun-storage中实现了insert/update/delete... returning语句供计算节点应用,并且在计算节点中基于PostgreSQL原有的insert/update/delete...returning 语句的实现,退出了对近程数据读写的反对。
这样,KunlunDB就具备了insert...returning、update...returning和delete...returning语句性能,别离返回insert语句插入的行,update语句更新后的行,以及返回delete语句删除的行,包含这些行的字段组成的任意非法的表达式的值。用户曾经能够在KunlunDB上应用这些性能。
下图展现了这个很cool的性能。
首先,建表并填充数据:
当初咱们执行update... returning语句:
而后执行delete... returning子句:
最初,explain一下update/delete... returning子句:
-END-
昆仑数据库是一个HTAP NewSQL分布式数据库管理系统,能够满足用户对海量关系数据的存储管理和利用的全方位需要。
利用开发者和DBA的应用昆仑数据库的体验与单机MySQL和单机PostgreSQL简直完全相同,因为首先昆仑数据库反对PostgreSQL和MySQL双协定,反对规范SQL:2011的 DML 语法和性能以及PostgreSQL和MySQL对规范 SQL的扩大。同时,昆仑数据库集群反对程度弹性扩容,数据主动拆分,分布式事务处理和分布式查询处理,强壮的容错容灾能力,欠缺直观的监测剖析告警能力,集群数据备份和复原等 罕用的DBA 数据管理和操作。所有这些性能无需任何利用零碎侧的编码工作,也无需DBA人工染指,不停服不影响业务失常运行。
昆仑数据库具备全面的OLAP 数据分析能力,通过了TPC-H和TPC-DS规范测试集,能够实时剖析最新的业务数据,帮忙用户发掘出数据的价值。昆仑数据库反对私有云和公有云环境的部署,能够与docker,k8s等云基础设施无缝合作,能够轻松搭建云数据库服务。
请拜访 http://www.zettadb.com/ 获取更多信息并且下载昆仑数据库软件、文档和材料。
KunlunDB我的项目已开源
【GitHub:】
https://github.com/zettadb
【Gitee:】
https://gitee.com/zettadb