
💂作者简介: THUNDER王,一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学本科在读,同时任汉硕云(广东)科技有限公司ABAP开发顾问。在学习工作中,我通常使用偏后端的开发语言ABAP,SQL进行任务的完成,对SAP企业管理系统,SAP ABAP开发和数据库具有较深入的研究。
💅文章概要: 在本节内容中,我们将继续学习ABAP OPEN SQL的知识,今天带来的内容是T-CODE:SAT的简介,SAT事务码是ABAP中用于对语句性能监控的一个工具,可以帮助我们更好地针对SQL语句进行性能优化,跟着我的脚步,一起来看看吧!本文是ABAP SQL性能优化系列的开篇,主要学习SAT的使用方法。
🤟每日一言: 永远年轻,永远热泪盈眶!
目录

在本节内容中,我们将继续学习ABAP OPEN SQL的知识,今天带来的内容是T-CODE:SAT的简介,SAT事务码是ABAP中用于对语句性能监控的一个工具,可以帮助我们更好地针对SQL语句进行性能优化,跟着我的脚步,一起来看看吧!本文是ABAP SQL性能优化系列的开篇,主要学习SAT的使用方法。

SAT是SAP提供的用来替代SE30的程序性能优化分析工具( runtime analysis),功能比SE30更加强大,使用起来也很方便。它的初始屏幕如下图所示:

PS:下面将分成以下几个板块来对
SAT主屏幕界面元素进行详细地讲解:
SAT主屏幕有两个页签,它们分别是:Measr.和Evaluate。应用工具栏中有一个应用:Tips & Tricks。下面分别来进行介绍:
打开Tips & Tricks,会进入到另外一个屏幕ABAP对象的操作提示和技巧,在里面可以学习到一些语句性能对比知识,大家可以点进去详细研究研究。

Measr.页签主要用于对SAT运行属性进行配置,包括:SAT变式设置,指定SAT监控入口,指定工作进程(work process),设置后台监控SAT,设置内表命名规则
Evaluate页签主要用于查看SAT结果文件,双击条目即可进入性能分析屏幕Display Measurement

PS:所有创建的SAT结果文件都可以在这里找到,但是注意每个结果文件都有保存时间,超过保存时间会被删除,最长保存时间截止到
Deleted On字段所展示的时间

PS:Short Description主要用于维护结果文件的
短文本描述,会显示在这里:

Settings主要用于设置SAT变式,默认为DEFAULT,可以参照创建一个符合自己需求的变式。
PS:下面讲解如何参照创建一个符合自己需求的变式
(一)双击复制按钮,参照DEFAULT复制一个新的变式

(二)弹出Copy Variant对话框,维护变式文本描述

(三)点击更改按钮,修改变式属性

(四)进入后,拥有三个页签 ,下面分别来进行介绍:

在Duration and Type页签中,我们可以进行Size Limits,Aggregation,Options的设置,Options用的不多,在这里不做讲解,后面有用到的机会再讲讲。
Size Limits
Maximum Size of File:文件最大容量Maximum Execution Time:最大SAT运行时间
Aggregation
None:选择这个,只会把程序中的调用显示出来,一般用None就够用了。Per Call Position:选择这个,只会把程序中的调用显示出来,一般用None就够用了。
在Statements页签中,我们可以选择需要跟踪的ABAP语句,有时候不需要跟踪所有的内容,比如只跟踪SQL。

在Program Parts页签中,我们可以设置SAT跟踪的范围:

在In Dialog中我们要指定需要监控的程序种类,是TCode(事务码),Program(程序),还是Function(函数)。

PS:单击
Execute按钮便开始执行SAT

通过Switch On/off可以跟踪后台job(background job),下面展示一个具体的例子:
(一)打开【T-CODE:SE38】,进入ABAP编辑器,创建一个程序,复制粘贴以下代码到程序中
DO 50000000 TIMES.
SELECT * FROM sflight INTO TABLE @DATA(gt_sflight).
ENDDO.
(二)在ABAP编辑器:初始屏幕中,点击菜单栏中的程序—>执行—>后台

(三)进入后,如下图所示,单击立即运行按钮

(四)程序被挂起在后台运行

(五)在【T-CODE:SAT】中,单击Switch On/Off按钮

(六)在这里可以看到所有后台运行的报表

(七)选中我们刚刚创建的在后台运行的报表,单击激活按钮

(八)SAT程序开始跟踪,打开字段变为绿灯表示正在跟踪报表程序,并且生成了一个性能文件名

(九)双击性能文件名,我们可以进入Hit List

PS:在
Hit List中,我们可以看到完整的程序性能分析,并且能够看到源代码的底层运作逻辑,我们之前的代码是通过不断循环来从数据库表sflight中取出数据放入临时内表gt_sfllight中,这其中ABAP SQL的底层逻辑包括了DB:FETCH(游标)操作,ABAP SQL Setup操作等等
(十)若想取消报表程序后台作业,打开【T-CODE:SM50】,找到我们报表运行的该条目

(十一)菜单栏中选择管理—>删除会话

(十二)弹出对话框。选择是

(十三)该报表程序被取消在后台作业,工作进程状态变为等待

(十四)返回【T-CODE:SAT】中检查,确认该报表程序已被取消后台运行


PS:在Schedule中,我们可以对报表程序设定
定时监控
(一)单击Schedule按钮,进入Overview of Scheduled Measurements (Local Server)

(二)单击Schedule Measurement按钮,进入对话框


各字段参数含义如下:
User:用户Cilent:集团AS实例:应用服务器实例External Session:在哪个External Session 中执行的程序被记录数据。1表示只在1号进程执行的程序被记录数据,而其他的进程的不记录,0表示所有的都记录Process Type:程序的类型,Dialog,Update,RFC等。
Object Type:Transaction, Report, Function等,与下面的对象配合,确定相应的启动方式。Object Name:tcode, 程序名, 功能函数名。已调度测量的最大数量:在统计时间有效期内,最多记录的性能跟踪次数Expiration Date:创建时间(年月日)Run time:创建日期(小时/分钟/秒数)Description:短文本描述

勾选上这个按钮后,所有内表都会被识别;如果不勾选,那么只有IT前缀开头的内表会被识别出来

译文如下:
ABAP 运行时环境不适用于内部表的名称,而是处理IT<no.>格式的内存对象标识符。
选择此选项后,将确定 ABAP 源代码中显示的内部表的真实名称,并使用内存对象标识符显示在数据评估中。
这使得性能数据的处理更加密集,但评估更易于阅读。

在上面我们花费了大量篇幅来对SAT初始屏幕中的界面元素进行了详细的介绍,接下来我们要讲解的是性能分析屏幕Display Measurement
PS:
Display Measurement大致样式如下:、

左边是profile窗口,右边是Hit List屏幕,下面先对Display Measurement的Tab页签进行介绍,Tab页签包含了Desktop 1,Hit List,DB tables,Profl.,Times。

Desktop 1为一个桌面工作台,里面集成了Profile窗口和Hit List屏幕

Hit List屏幕展示出了所有的跟踪结果,双击某行能跳转到源代码处。除此之外还有一排应用工具栏可以对各个字段进行操作(排序,筛选等等),在这里我们可以对语句性能进行分析,其中各个字段的解释如下:
各个字段含义:
Hits:被调用的次数。Gross[microsec]:该语句,子程序以及被其调用的子程序,语句所消耗的时间。(以微秒记)Net[microsec]:该语句,子程序不包括被其调用的子程序,语句的消耗时间。(以微秒记)Gross[%]:显示为 Gross Time 在总时间中占用的时间比。Net [%]:显示为 Net time 在总的时间中占用的时间比。Statement/Event:调用事件,与Profile窗口里的事件相对应Program Called:程序名或事务码名称(通常情况下与Calling Program相同)Calling Program:程序名或事务码名称(通常情况下与Program Called相同)
展现各个SQL的运行时间。
PS:Profl.对应Desktop 1中的Profile窗口,它的结构为树形结构,如下图所示:

Profile窗口能将SAT的跟踪结果多维度的展现(function,subroutines,rfc,SQl,screen,当点击对应的节点,对应的Hit List就展现在屏幕下方。


在Times页签中,我们可以按照不同的条件来展现各个事件的跟踪时间,比如可以对Gross或者Net进行降序或升序排序

介绍了这么多,相信各位小伙伴们对于SAT事务码已经了解了很多了吧!下面我们来进行一次Demo尝试,试着用SAT来分析一下我们的ABAP SQL!
PS:让我们一起看看相比
SELECT *操作来说,只SELECT我们自己要用的字段速度是否会快一些!
进入【T-CODE:SE38】ABAP编辑器,复制以下测试代码到程序中,保存并激活!
PS:这里使用了ABAP SQL的新语法!
FORM test_01 .
SELECT * FROM sflight INTO TABLE @DATA(gt_sflight).
LOOP AT gt_sflight INTO DATA(gs_sflight).
WRITE: / gs_sflight-carrid,gs_sflight-connid,gs_sflight-fldate.
ENDLOOP.
ENDFORM.
FORM test_02 .
SELECT carrid,connid,fldate FROM sflight INTO TABLE @DATA(gt_sflight).
LOOP AT gt_sflight INTO DATA(gs_sflight).
WRITE: / gs_sflight-carrid,gs_sflight-connid,gs_sflight-fldate.
ENDLOOP.
ENDFORM.
START-OF-SELECTION.
PERFORM test_01.
WRITE:sy-uline.
PERFORM test_02.
(一)弹出对话框。选择是进入SAT初始屏幕,在In Dialog中,选择Program,输入刚刚我们自己创建的测试程序,单击Execute执行按钮

(二)进入Display Measurement性能分析屏幕

(三)在Profile窗口中,按照如下图所示路径选择:

(四)Hit List中,选中Calling Program字段,应用工具栏中单击筛选按钮(漏斗一样的那个图标)

(五)在确定过滤值窗口中输入我们创建的测试程序名,单击右下角执行按钮(绿色的√)

(六)操作成功后,便会是如下图所示:

PS:可以看到:
TEST_01的Gross Time比TEST_02的Gross Time多了近35%,证实了SELECT *操作确实会耗用更多的时间!
文章到这里就接近尾声啦!如果喜欢博主的话可以给我一键三连支持一下啦!
本文花费大量时间介绍了SAT事务码,非常的详细全面啦,希望能帮助到各位小伙伴,码文不易,还望各位大佬们多多支持哦,你们的支持是我最大的动力!

✨ 原创不易,还希望各位大佬支持一下 \textcolor{blue}{原创不易,还希望各位大佬支持一下} 原创不易,还希望各位大佬支持一下
👍 点赞,你的认可是我创作的动力! \textcolor{9c81c1}{点赞,你的认可是我创作的动力!} 点赞,你的认可是我创作的动力!
⭐️ 收藏,你的青睐是我努力的方向! \textcolor{ed7976}{收藏,你的青睐是我努力的方向!} 收藏,你的青睐是我努力的方向!
✏️ 评论,你的意见是我进步的财富! \textcolor{98c091}{评论,你的意见是我进步的财富!} 评论,你的意见是我进步的财富!
我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的
我有一个涉及多台机器、消息队列和事务的问题。因此,例如用户点击网页,点击将消息发送到另一台机器,该机器将付款添加到用户的帐户。每秒可能有数千次点击。事务的所有方面都应该是容错的。我以前从未遇到过这样的事情,但一些阅读表明这是一个众所周知的问题。所以我的问题。我假设安全的方法是使用两阶段提交,但协议(protocol)是阻塞的,所以我不会获得所需的性能,我是否正确?我通常写Ruby,但似乎Redis之类的数据库和Rescue、RabbitMQ等消息队列系统对我的帮助不大——即使我实现某种两阶段提交,如果Redis崩溃,数据也会丢失,因为它本质上只是内存。所有这些让我开始关注erlang和
目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称
@作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors 1、什么是behaviors 2、behaviors的工作方式 3、创建behavior 4、导入并使用behavior 5、behavior中所有可用的节点 6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors 1、什么是behaviorsbehaviors是小程序中,用于实现
遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg
目录第1题连续问题分析:解法:第2题分组问题分析:解法:第3题间隔连续问题分析:解法:第4题打折日期交叉问题分析:解法:第5题同时在线问题分析:解法:第1题连续问题如下数据为蚂蚁森林中用户领取的减少碳排放量iddtlowcarbon10012021-12-1212310022021-12-124510012021-12-134310012021-12-134510012021-12-132310022021-12-144510012021-12-1423010022021-12-154510012021-12-1523.......找出连续3天及以上减少碳排放量在100以上的用户分析:遇到这类
ES一、简介1、ElasticStackES技术栈:ElasticSearch:存数据+搜索;QL;Kibana:Web可视化平台,分析。LogStash:日志收集,Log4j:产生日志;log.info(xxx)。。。。使用场景:metrics:指标监控…2、基本概念Index(索引)动词:保存(插入)名词:类似MySQL数据库,给数据Type(类型)已废弃,以前类似MySQL的表现在用索引对数据分类Document(文档)真正要保存的一个JSON数据{name:"tcx"}二、入门实战{"name":"DESKTOP-1TSVGKG","cluster_name":"elasticsear
我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时
我已经开始使用mysql2gem。我试图弄清楚一些基本的事情——其中之一是如何明确地执行事务(对于批处理操作,比如多个INSERT/UPDATE查询)。在旧的ruby-mysql中,这是我的方法:client=Mysql.real_connect(...)inserts=["INSERTINTO...","UPDATE..WHEREid=..",#etc]client.autocommit(false)inserts.eachdo|ins|beginclient.query(ins)rescue#handleerrorsorabortentirelyendendclient.commi
我找到了这样的东西:Rails:Howtolistdatabasetables/objectsusingtheRailsconsole?这一行没问题:ActiveRecord::Base.connection.tables并返回所有表但是ActiveRecord::Base.connection.table_structure("users")产生错误:ActiveRecord::Base.connection.table_structure("projects")我认为table_structure不是Postgres方法。如何列出Postgres数据库的Rails控制台中表中的所有