当前位置: 首页 > news >正文

是时候给ABAP SELECT * 平平反了

小甲:老师救命!我又被代码评审的大佬喷了!说我用SELECT * 是纯纯的新手行为,是性能毒瘤,必须把所有字段都写出来!可我偷偷测了一下,性能好像没啥区别啊?上次说不让我用子查询,我用事实打了丫的脸,这次再怎么打脸呢?

老白:哈哈,又是这个ABAP圈的政治正确。很多人都把SELECT * 当成了过街老鼠,人人喊打,但今天咱们就用代码和数据说话,看看它是不是像传说中的那么不堪。

一、先上测试,用数据打脸

我准备了一段华山论剑式的对比代码,让各种SELECT写法同台竞技,结果非常颠覆认知:

REPORT ztest NO STANDARD PAGE HEADING. DATA: gt_mara TYPE TABLE OF mara.DATA: BEGIN OF gt_matnr OCCURS 0, matnr TYPE mara-matnr, ersda TYPE mara-ersda, END OF gt_matnr.DATA: t1 TYPE i, t2 TYPE i. START-OF-SELECTION. WRITE 'SELECT * + gt_mara + INTO CORRESPONDING'. GET RUN TIME FIELD t1. SELECT * INTO CORRESPONDING FIELDS OF TABLE gt_mara FROM mara UP TO 10000 ROWS. GET RUN TIME FIELD t2. t1 = t2 - t1. WRITE / t1.SKIP. CLEAR gt_mara[]. WRITE / 'SELECT * + gt_mara + INTO TABLE'. GET RUN TIME FIELD t1. SELECT * INTO TABLE gt_mara FROM mara UP TO 10000 ROWS. GET RUN TIME FIELD t2. t1 = t2 - t1. WRITE / t1.SKIP. CLEAR gt_mara[]. WRITE / 'SELECT matnr + gt_mara + INTO CORRESPONDING'. GET RUN TIME FIELD t1. SELECT matnr ersda INTO CORRESPONDING FIELDS OF TABLE gt_mara FROM mara UP TO 10000 ROWS. GET RUN TIME FIELD t2. t1 = t2 - t1. WRITE / t1. SKIP. CLEAR gt_matnr[]. WRITE / 'SELECT matnr + gt_matnr + INTO CORRESPONDING'. GET RUN TIME FIELD t1. SELECT matnr ersda INTO CORRESPONDING FIELDS OF TABLE gt_matnr FROM mara UP TO 10000 ROWS. GET RUN TIME FIELD t2. t1 = t2 - t1. WRITE / t1. SKIP. CLEAR gt_matnr[]. WRITE / 'SELECT * + gt_matnr + INTO CORRESPONDING'. GET RUN TIME FIELD t1. SELECT * INTO CORRESPONDING FIELDS OF TABLE gt_matnr FROM mara UP TO 10000 ROWS. GET RUN TIME FIELD t2. t1 = t2 - t1. WRITE / t1. SKIP. CLEAR gt_matnr[]. WRITE / 'SELECT matnr + gt_matnr + INTO TABLE'. GET RUN TIME FIELD t1. SELECT matnr ersda INTO TABLE gt_matnr FROM mara UP TO 10000 ROWS. GET RUN TIME FIELD t2. t1 = t2 - t1. WRITE / t1. SKIP.

运行结果如下,多运行几次看看

然后ST05看执执行计划。

SELECT * + gt_mara + INTO CORRESPONDING 的执行实际执行SQL:

SELECT * + gt_matnr + INTO CORRESPONDING 的实际执行SQL:

SELECT matnr + gt_matnr + INTO TABLE 的实际执行SQL:

可以看出来,在使用SELECT *以及内表字段很多的时候,SQL的取数字段非常多,是数据库表的所有字段,而在内表只有两个字段的时候,SELECT * INTO...和SELECT matnr ersda...的在实际执行SQL是一样的。

二、打破认知:SELECT * 并没有那么蠢

1、很多人以为SELECT * 会一股脑把表中所有字段都查出来,就像把整个超市的货都扛回家。但实际上,在ABAP里,它并没有那么蠢。

当你用SELECT * 配合INTO CORRESPONDING FIELDS时,它会偷偷根据目标内表的结构,只查询内表的字段。

从执行计划就能实锤:我们用 SELECT * ,内表为gt_matnr时,数据库实际执行的是:

SELECT "MATNR", "ERSDA" FROM "MARA" WHERE ...

这和你显式写SELECT matnr ersda...的效果,不能说是毫无区别,那简直是一模一样!

2. 真正拖后腿的是谁?

从本例可以看出来,内表定义的字段数非常大的影响了取数速度,在执行路径一样的前提下,取的字段越多,所用时间就长,其实也很好理解,COPY文件的时候也是越大的文件越慢不是。

测试中,gt_mara包含 MARA 表的全部字段,而gt_matnr只包含两个字段。后者的查询速度直接快了N多倍!

这就像你搬家,一个是把整个家都搬走,一个是只搬两个行李箱,速度能一样吗?

还有INTO CORRESPONDING,相比INTO TABLE也能够微微的影响性能

这个关键字会在ABAP层面做字段映射,就像给每个字段都贴个标签再分类,需要额外的计算开销。

对比INTO TABLE和INTO CORRESPONDING的执行时间,你会发现 INTO TABLE会快那么一丢丢,当然差别很小,毕竟这个比对只需要对比一次,而不是每条记录都对比。

三、平反结论:别再冤枉 SELECT * 了!

SELECT * 不是洪水猛兽:当目标内表的结构是你需要的全部字段时,SELECT * 不仅代码更简洁,而且性能上和显式字段列表没有区别。

内表设计才是重中之重:只定义你需要的字段,避免不必要的数据传输,这才是提升性能的关键。

优先使用 INTO TABLE:如果内表结构和查询结果的字段完全匹配,就用 INTO TABLE,避免 INTO CORRESPONDING 的额外开销。

性能优化要抓主要矛盾,看执行路径是不是全表扫描、表的访问顺序对不对、有没有使用正确的索引,USE_NL还是USE_HASH等等,这才是优化的王道。当然今天我们主要是给SELECT *平反,这个就不展开了。

小甲:原来如此!我之前一直以为 SELECT * 是个坑,现在才明白,真正的坑是我自己定义的内表太臃肿,我错怪它了啊!

老白:对嘛!技术这东西,不能人云亦云,得自己动手测试,用事实打脸,慢SQL需要看执行计划,才能找到真正的原因。以后再被代码评审说 SELECT * 不好,你就把这篇文章甩给他,顺便问问他:“大佬,你知道执行计划吗?”

http://www.jsqmd.com/news/419778/

相关文章:

  • 上海清竹园墓园联系方式:信息核实与使用建议 - 十大品牌推荐
  • DroPE:不进行长上下文微调实现无缝的零样本上下文扩展 | 直播预约
  • 上海清竹园墓园联系方式:使用建议与环境特色介绍 - 十大品牌推荐
  • 上海清竹园墓园联系方式:沟通准备与整体情况说明 - 十大品牌推荐
  • 为AI 构建一个“理想人格“模板:知识渊博、乐于助人、透明坦诚、谦逊自省#从 Alignment 到 Constitution 的范式转移
  • 当开发者变成“消费者“:Vibe Coding 时代的一人生存指南
  • 传统上位机升级:C# WinForms/WPF 集成 YOLO 实现视觉智能化改造
  • LiuJuan Z-Image部署指南:Streamlit可视化界面+显存碎片治理保姆级教程
  • 上海清竹园墓园联系方式:主要联系途径说明 - 十大品牌推荐
  • C# 上位机 + YOLO在车载监控场景中实现行车道检测 + 障碍物检测** 的完整工业级实战代码与指南
  • 上海清竹园墓园联系方式:服务窗口与园区概况简述 - 十大品牌推荐
  • 仓储物流场景下 C# 上位机集成 YOLOv9 实现货物识别与定位
  • 中文情感分析新选择:StructBERT WebUI快速上手指南
  • 基于Java+SSM+Flask法律咨询系统(源码+LW+调试文档+讲解等)/法律咨询/法律问答/法律顾问/法律在线/法律查询/法律解答/法律指南/法律帮助/法律服务平台/法律咨询热线
  • RexUniNLU环境配置避坑指南:让部署不再困难
  • OFA-VE性能优化实战:利用CUDA加速视觉分析推理
  • 基于Java+SSM+Flask网上订餐管理系统(源码+LW+调试文档+讲解等)/在线订餐系统/网络订餐软件/订餐管理平台/外卖订餐系统/网上订餐服务/订餐系统开发/订餐网站设计/网上订餐平台
  • 百川2-13B-4bits量化模型教程:4bit权重文件结构(.safetensors)与加载机制解析
  • 上海清竹园墓园联系方式:咨询指南与注意事项参考 - 十大品牌推荐
  • Qwen3-ASR-0.6B开源ASR工具实操手册:纯本地运行、隐私安全、多格式音频支持
  • 企业级应用:用Qwen3-VL:30B和Clawdbot升级飞书智能办公
  • 这个软件我开发了11年,终于赚钱了!
  • DeepSeekV4爆炸了,中国可以对英伟达说“不”
  • OpenClaw 再升级,OpenFang 重磅开源!
  • 2026年02月27日全球AI前沿动态
  • (一)走进阿里云实时计算Flink版|产品能力篇【上篇】
  • agent 即服务
  • 用 AI 写的串口工具
  • 前英伟达工程师 Chip Huyen :当模型不再稀缺,工程能力才是真正的分水岭
  • 从人机环境系统智能角度分析美四校“自主Coding Agent错了”