ABAP-SQL 存在性校验:查询某一数据库表是否存在一条{select single | up to 1 rows | select count(*)}

1 篇文章 0 订阅

问题描述:

当我们需要确认某一数据表中是否存在某一数据时,有多种方式,但哪种是最优的呢?
使用single : 在where语句中如果使用了全部的key字段才可以使用single
single 取第一个符合条件的数据,不需要继续再查找下去。
SELECT SINGLE *
	FROM dbtab	
	INTO (field)
	WHERE any_key.
IF sy-subrc = 0.
   …
ENDIF.
使用up to 1 rows : 在where语句中如果使用了部分或没有使用key字段,则只能使用up to 1 rows。
up to 1 rows 先查找所有数据,再取一条符合条件的数据。
up to n rows 可以取n条数据。
SELECT *
	FROM dbtab
	UP TO 1 ROWS	
	INTO (field)
	WHERE any_key.
IF sy-subrc = 0.
   …
ENDIF.
相较于前两者,貌似从性能的角度防止了数据从DB传输到ABAP(前两者某些时候甚至需要定义临时工作区或者额外的清空操作),
但同样数据库必须根据你的where条件读取所有受影响的数据。在最坏的情况下,数据库必须分析整个表数据。
SELECT COUNT(*) 
	FROM dbtab
 	WHERE any_key.
IF sy-subrc = 0.
   …
ENDIF.

问题分析:

分析条件,因为我这里没有支持abap 7.4及以上的虚拟机,一下结果搬自SAP社区,感兴趣的可以亲测测试一下,欢迎在评论区讨论。 数据库表:LIPS 数据量:450w
  • where主键时
    count(*) 要优于其他方法,select single次之但性能相差不多,up to 1 row相当差。
  • where部分或无主键时

关于single : 在where语句中如果使用了全部的key字段才可以使用single。这是对于基于要取数据的目的而言的,因为其取到一个符合条件值后就不会再查询下去了(有可能会取到错误的条目)。但如果只是确认是否存在(比如我要确定表中某一天存在业务记录),也是可以用的。

此时性能多取决于你要选取的条目在表中记录的位置,however count(*) 都是最差的。

  1. 当记录在表的开头,select single最优(@abap_true > ),up to 1 rows次之,count()相当差。
  2. 当记录在表的中间,select single @abap_true最优。
  3. 当记录在表的最末尾,select single @abap_true和count(*)相当接近,并且优于up to 1 rows和select single * INTO

当然表中记录的位置和生产数据量级通常我们是无法知晓的,所以无疑最新的select single @abap_true是最优的,不支持新语法则select single *最优。


结论:

基于上面的分析,结论如下:

当where条件为主键时,采用count(*) (说实话有些意外,我本以为count会遍历整个表的,而select single查到即终止,莫非主键时count到一条之后也会终止查询吗?有懂的欢迎评论区指摘)。

非主键时采用select single * into方式。

当然,如果查询表是自建表,你对其数据量有所了解,或者干脆是某种标识表,count(*)我觉得也可以(前面的是大前提,分析部分的原作者测试显示:非主键查询条目在最后时,查询时间从1微妙到2秒)。这点儿性能浪费相较于其他的优化来说实在不值一提。

PS:

关于select single count(),我没找到任何资料来说明它会在计数到一个之后就会停止计数,当你输出n的时候你就会发现,和select count()结果一样。包括上面的其他语句其实本身都不是作为存在性校验的sql语句存在的,那么是否真的存在某种差异?
事实上:我用主键查询一个物料时反倒是select count()更快。非主键时select single count()更快。so…

  • 4
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值