as400总结mlek

在参数Amounttoroll位置输入要修改的值,下面列出了所有Amounttoroll的参数解释:H=Half->按PgUp或PgDn键后,屏幕滚动半页。

F=Full->按PgUp或PgDn键后,屏幕滚动整页。

C=Cursor->按PgUp、PgDn键或F19、F20后,屏幕按照光标位置进行滚动。

D=Data->按PgUp、PgDn键或F19、F20后,屏幕按照数据位置进行滚动。

1-999->按PgUp、PgDn键或F19、F20后,屏幕按照选定的具体值进行滚动,例如,若此值为10,则进行翻页时,一次翻10行。

2.修改字体大小写输入方式。在缺省情况,PDM只可按大写方式输入,但有时要输入小写字符,可以按F13进入“ChangeSessionDefaults”

画面。修改“Uppercaseinputonly”参数为N,即大小写都准许。

3.修改行序号的步长在“Incrementofinsertrecord”位置添入行序号的步长。例如:Incrementofinsertrecord.....--2.00--0.01-999.99如下图所示:修改前的步长为1,修改后的补偿为2。4.全屏显示在“Fullscreenmode”位置输入“Y”,PDM的编辑画面变成全屏显示。

librarylist分为systemlibraries;productlibraries;currentlibrary;userlibrary四个部分。其中,systemlibraries可以用QSYSLIBL系统值决定,也可以用CHGSBSD进行修改;userlibrary可以用QUSRLIBL决定,也可以用CHGJOBD进行修改。currentLibrary一般由userprofile决定,也可以在signon时进行指定。而productlibraries是在执行CL程序的时候由系统自动引入的,例如在编译RGP程序的时候会自动引入QRPG库等。

系统作业是在系统IPL时初始化的,但是,只要OS/400系统处于活动状态,作业QWCBTCLNUP和QDCPOBJx也将与之同样保持活动。系统作业不能被用户启动,停止或改变(除了少数系统作业可以用命令CHGSYSJOB来改变,并且唯一可以由该命令改变的属性就是这些系统作业的运行优先级。)

以下就是介绍所有系统作业的详细信息:

--QALERT-AlertManager报警管理该系统作业使作业能够处理报警,包括处理从其他系统上接收到的报警,本机产生的报警,并且维护系统的控制。QALERT的作业运行优先级可以用命令CHGSYSJOB改变。该作业在OS/400R220时就被加入到操作系统中,用于支持报警信息的处理。

系统值QCMNARB决定有多少通讯仲裁作业启动。如果QCMNARB设置成*CALC,系统将为每一个处理器启动两个通讯仲裁作业,如果QCMNARB设置成0,该作业将在QSYSARB中运行。QCMNARBxx的作业运行优先级可以用命令CHGSYSJOB改变。在作业QCMNARBxx被加入OS/400R420以前,这些工作是在QSYSARB中运行的。

--QDBSRVXR-DatabaseCross-Reference数据库交叉参照该作业是用于维护QSYS中的文件级的系统交叉参照文件,这些文件中存放着数据库文件的交叉参照信息,并且这些文件是库QSYS中以QADB开头的。首要被维护的文件是文件交叉参照文件QADBXREF,它包含了数据库中每一个物理文件,逻辑文件,DDM文件,ALIAS文件的记录。当一个文件被创建,改变,删除,恢复,更名,或者改变所有权时,作业QDBSRVXR就会被激活。该作业在OS/400R310被加入操作系统。

--QDBSRV01-DatabaseServer数据库服务器该作业可以被视为数据库维护任务的分配器。通常地,当恢复一个包含数据库文件的库时,QDBSRV01将立刻被激活。它的功能包括:*发信号给SMAPP(系统管理的访问路径保护机制),告知新的访问路径被恢复,并且由AMAPP来决定是否需要被保护。*由于访问路径没有被恢复时,该作业准备需要被重新创建的访问路径的列表。该列表可以用命令EDTRBDAP浏览。

数据库服务器作业的数量是(1+2*CPU数)与(1+2*ASP数)两者中较大的那一个。最少启动的数量是5。QDBSRV01是主要的系统作业,用于分配其他作业工作,剩下的作业,一半是用来处理高优先级的请求,另一半是用来处理低优先级的请求。例如:在一个有4路CPU的系统上,应该有9个QDBSRVxx作业,由QDBSRV01来分配工作,QDBSRV02-05用来处理高优先级的作业,QDBSRV06-09用来处理低优先级的作业。该作业是在OS/400R210被加入操作系统的。

--QDBSRVxx-DatabaseServer(highpriority)这些作业维护系统的日志和提交控制。

--QDBSRVxx-DatabaseServer(lowpriority)这些作业用于维护用户的数据库文件的访问路径。这些作业通常不活动,但是,在特定的条件下,它们被激活用于访问路径的重建。这些被重建的访问路径可以用命令EDTRBDAP浏览。这些作业被激活的原因包括:*恢复那些没有保存访问路径的数据库文件;*恢复那些没有物理文件的逻辑文件;*取消正在运行的命令RGZPFM;*由于被破坏而成为无效的索引;*加速OS/400安装来完成交叉参照,或者其他DB2升级的动作;*验证约束。用命令EDTCPCST可以显示那些正在等待验证的约束。

--QDCPOBJx-DecompressSystemObject系统对象解压缩这些作业是用于对新安装的操作系统对象进行解压缩的,它们的运行是需要一定的空间的。当剩余您的系统空间低到一定程度,这些作业就会结束。系统对象解压缩作业的数量=CPU数+1。该作业是在OS/400R210被加入操作系统的。

--QFILESYS1-FileSystem文件系统该作业用于支持文件系统作业的后台运行,它保证对文件的改动都写入存储介质中,并执行常规的文件系统清除活动。该作业是在OS/400R210被加入操作系统的。

--QJOBSCD-JobSchedule作业调度该作业控制作业调度功能,并由系统监控作业调度项的计时器和调度的作业。该作业是在OS/400R220被加入操作系统的。

--QLUR-LU6.2Resynchronization(LU6.2重新同步)该作业处理两段式提交的重新同步。该作业是在OS/400R310被加入操作系统的,并作为LU6.2通讯协议的一部分。

--QLUS-LogicalUnitServices逻辑单元服务该作业处理为逻辑单元设备(通讯设备)处理的事件,它还负责将设备定位到正确的通讯子系统中去。QLUS是AS/400上原始的系统作业之一。

--QPFRADJ-PerformanceAdjustment性能调整性能调整系统作业管理存储池大小和活动级别的变化。所有要求改变存储池大小的请求都有该作业处理。此外,如果系统值QPFRADJ设为2或3,该作业将动态地改变存储池大小和活动级别,由此提高系统的性能。在OS/400R430,IPL性能调整(系统值QPFRADJ设为1或2)是由QPFRADJ来处理的,在OS/400R430前,IPL性能调整由SCPF处理。QPFRADJ是在OS/400R210被加入操作系统的。

--QSPLMAINT-SystemSpoolMaintenance假脱机管理该作业实现维护系统假脱机的功能。

--QSYSARB-SystemArbiter系统仲裁系统仲裁提供运行高优先权功能的环境,它处理系统资源并保持对系统状态的追踪。QSYSARB是操作系统核心作业。系统仲裁负责系统一级的,需要立即处理和能更有效地被一个作业处理的任务,系统仲裁还负责处理通讯请求,设备锁定,线/控制器/设备的配置。系统仲裁是OS/400最原始的作业之一。

--QSYSCOMM1-SystemCommunications系统通讯该作业处理系统通讯和I/O。QSYSCOMM1的作业优先权可以用命令CHGSYSJOB改变,它是在OS/400R320中被加入操作系统的。

--QWCBTCLNUP-JobTableCleanup作业表清空QWCBTCLNUP是用于在IPL过程中确保作业结构可以被使用。通常在IPL结束时,该作业也结束处理了,但是,如果有许多作业结构需要清除,它可以在IPL结束后继续运行。该系统作业在处理完成后就结束了。QWCBTCLNUP是在OS/400R210中当作业表的清除从SCPF中被移走后加入系统的。

--Q400FILSVR-RemoteFileSystemCommunications远程文件系统通讯该作业处理远程文件系统APPN/APPC的通用编程接口通讯。Q400FILSVR是在OS/400R360中作为远程文件支持被加入操作系统的。

--SCPF-StartControlProgramFunction启动控制程序功能该作业是操作系统IPL是的中心处理任务,提供启动OS/400的环境和所直接需要的功能。SCPF启动所有其他系统作业(除了QLUS),并将系统带入可用状态。SCPF是OS/400最原始的作业之一。

2、使用命令WRKOBJLCKOBJ(QDOC/sysobjname)OBJTYPE(*DOC),其中,sysobjname为上一条命令输出结果中的Systemobjectname值。

---------------------------------------------------------------------------------------------WorkwithActiveJobs------------------S102xxxx-----------------------------------------------------11/30/0313:24:38CPU%:.3---Elapsedtime:00:13:10---Activejobs:116

Typeoptions,pressEnter.2=Change3=Hold4=End5=Workwith6=Release7=Displaymessage8=Workwithspooledfiles13=Disconnect...

OptSubsystem/Job-User---Type--CPU%-Function------StatusQBATCH------------QSYS---SBS---.0-----------------DEQWQCMN--------------QSYS---SBS---.0------------------DEQWQCTL--------------QSYS---SBS---.0------------------DEQWQSYSSCD-----------QPGMR--BCH---.0---PGM-QEZSCNEP--EVTWQINTER------------QSYS---SBS---.0------------------DEQWQPADEV000F--------test---INT---.1---CMD-WRKACTJOB-RUNQSERVER-----------QSYS---SBS---.0------------------DEQWQPWFSERVSD-------QUSER--BCH---.0------------------SELWQSERVER-----------QPGMR--ASJ---.0------------------EVTWMore...Parametersorcommand===>F3=ExitF5=RefreshF7=FindF10=RestartstatisticsF11=DisplayelapseddataF12=CancelF23=MoreoptionsF24=Morekeys---------------------------------------------------------------------

2、强大的PF功能键使用PF24,用户可以发现,WRKACTJOB提供一些有用的PF功能:

例,PF7用于发现含某些字符的作业---------------------------------------------------------------------Findastring

String........SHANJDColumn........*USER---*SBS,*JOB,*USER,*NUMBER,--------------------------------*TYPE,*STS,*FUNCTION,*PTY--------------------------------*POOL

F8=RepeatfindF12=CancelF17=TopF18=Bottom----------------------------------------------------------------------

PF20用于只列出符合条件的作业:-----------------------------------------------------------------------------------------------SubsetActiveJobs

Typechoices,pressEnter.Sequence........*SBS--------F4forlistJobname........*ALL--------Name,*ALL,*SYS,*SBSCPUpercentlimit....*NONE------.1-99.9,*NONEResponsetimelimit...*NONE------.1-999.9,*NONESubsystems*ALL

------------------------------------------------------------------------

1.FTPAS400-IP地址2.输入用户名,回车,再输入口令.3.CD/qsys.lib/***.lib,***为AS/400存放SAVF库名.4.LCDPC机本地存放SAVF的目录5.BIN6.QUOTESITENA17.PUTpcSAVF.savfasSAVF.savf,其中:pcSAVF为PC中SAVF文件名;asSAVF为AS/400中文件名.8.QUIT

//Loopthroughallrecordsoffilereadfile;

downot%eof(file);//Processuntilendoffileif%error;dsply'Readerror:processaborting.';leave;else;pos=%scan(',':name);ifpos>0;firstname=%trimr(%subst(name:1:pos-1));updatefile;endif;readfile;enddo;

/end-freeC*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

1)parm1(7S0)=276,parm2(7S2)=15.73

传递方式:CALLPGMAPARM('0000276''0001573')

2)parm1(7S0)=-276,parm2(6S2)=-15.73

传递方式:CALLPGMAPARM('-000276''-01573')

3)parm1(7P0)=276,parm2(7P2)=15.73

传递方式:CALLPGMAPARM(X'0000276F'X'0001573F')

4)parm1(6P0)=276,parm2(6P2)=15.73

传递方式:CALLPGMAPARM(X'F000276F'X'F001573F')

5)parm1(7P0)=-276,parm2(6P2)=-15.73

传递方式:CALLPGMAPARM(X'0000276B'X'F001573B')

总结:

对于S类型的参数,只要按照字符串的形式,在没有数字的位置补0,不用输入小数点,就可以得到正确的结果,如果是负数,在第一位输入负号-即可,但是会占用一个数字位,7位的负数就只能输入6位数字了。

对于P类型的参数,数字部分按照S类型的一样输入,还需要在字符串前加X,并且如果长度为奇数,需要给字符串加F后缀,如果长度为偶数,需要在字符串的前后都加F。如果是负数的,需要把字符串后面的F变为B。(X表示按16进制取值,由于P类型的数据存储方式是半个字节存储一个数字,所以需要在前后加其它的字母补齐空位。)

我应邀在全球范围内宣传SQL技巧。我相信您将至少学到表表达式的一种用法,而您所学到的东西将对您的应用产生一定的影响,所以还请继续读下去。

预过滤全外连接

最近几年来,随着工作文件的移除和并行性的加入,全外连接在性能方面已得到了增强。然而,其语法并没有得到像左连接和右连接所得到的那样的魔力,例如自动谓语下推和谓语传递闭包。图1中所显示的全外连接没有产生预期的结果,例如,给出在指定日期范围内的所有订单,不管这些订单是否具有少于40个字符的描述,以及给出所有少于40个字符的描述,而不管是否有与之对应的订单:

图1.该语句不会产生预期的结果

SELECTCOALESCE(O.ORDER_NO,'OrderNumbernotAvailable'),COALESCE(D.DESC,'DescriptionnotAvailable')FROMORDEROFULLJOINDESCRIPTIONSDONO.ORDER_NO=D.ORDER_NOWHEREO.ORDER_DATEBETWEEN'1999-01-01'ANDCURRENTDATEANDLENGTH(D.DESC<40)

相反,以上SQL的结果看上去像是一个内连接(innerjoin),因为图1中所使用的语法迫使局部过滤在第二阶段才应用——换句话说,是在连接之后才应用。这意味着很多将要参与连接操作的行其实在后面的阶段就要被删除。为了强制性地在连接(第一阶段)之前应用局部过滤,可以使用表表达式,如图2中所示。

图2.在连接之前强制执行过滤,以获得正确结果

SELECTCOALESCE(O.ORDER_NO,'OrderNumbernotAvailable'),COALESCE(D.DESC,'DescriptionnotAvailable')FROM(SELECTO.ORDERFROMORDEROWHEREO.ORDER_DATEBETWEEN'1999-01-01'ANDCURRENTDATE)ASOFULLJOIN(SELECTD.DESC,D.ORDER_NOFROMDESCRIPTIONSDWHERELENGTH(D.DESC<40)ASDONO.ORDER_NO=D.ORDER_NO

'O'表表达式显式地预过滤外部表,'D'表表达式则显式地预过滤内部表。该语法将给出指定日期范围内的所有订单,不管这些订单是否具有少于40个字符的描述,以及给出所有少于40个字符的描述,不管是否有与之对应的订单。连接前条件(beforejoincondition)可以确保只有最后的结果行才会在连接操作中被处理。

预过滤左连接和右连接的替换null的表

对于左连接和右连接,如果替换null的表放在WHERE子句中过滤,那么就是一个真正的内连接,而这可能并不是您在编写连接时所想要的。如果您真的想要一个左连接或者右连接,那么有两种选择:

将替换null的表的局部过滤放在ON子句中。

这样将把过滤放入到一个连接中条件(during-joincondition)。然而,这并不会消除最后的结果行。对于替换null的表的连接中条件,它们只对“nullout”行(保留下来的但是以null填充的行)有作用,而最后的结果行,包括来自受保护表的值,是由连接前条件预先决定的。请参阅TerryPurcell的前一期专家会谈专栏,以查看有关连接中条件的例子。

将替换null的表的局部过滤放到一个表表达式中。这将只对替换null的表中的“nullout”行有作用。图3中的查询演示了表表达式的使用,很可能,这正是开发人员所需的:

图3.使用表表达式来强制在连接之前应用局部过滤

SELECTO.ORDER_NO,COALESCE(D.DESC,'ShortDescriptionnotAvailable')FROMORDEROLEFTJOIN(SELECTD.DESC,D.ORDER_NOFROMDESCRIPTIONSDWHERELENGTH(D.DESC)<40)ASDONO.ORDER_NO=D.ORDER_NOWHEREO.ORDER_DATEBETWEEN'1999-01-01'ANDCURRENTDATE

图3中的查询返回指定日期范围内的所有订单,不管这些订单是否具有少于40个字符的描述。

分离GROUPBY操作

如果您是在DB2平台、而不是0S/390和z/0S平台上开发,那么可以略过这一节,因为要么优化器会自动重写GROUPBY语句来分离GROUPBY操作并消除排序,要么您可以构造自动总结表(automaticsummarytable,AST),这种表可以消除排序。对于所有的大型主机(mainframe),您需要考虑重写自己的查询。

一般的报告往往必须提供详细信息,以及总结信息。GROUPBY在DB2中是非常严格的子句:

GROUPBY的第一条规则是,必须首先SELECT要分组的行。第二条规则是必须用内置的列函数聚集(aggregate)所有其他的行。

这两条规则的组合通常迫使您去连接表,以便将详细信息和总结信息融合成一个结果行,如以下查询所示:

SELECTC.CUST_ID,MIN(C.CUST_NAME)ASCUST_NAME,MIN(C.CUST_PHONE)ASCUST_PHONE,SUM(S.SALES)ASTOTAL_SALESFROMCUSTOMERC,SALESSWHEREC.CUST_ID=S.CUST_IDANDS.SALES_DATEBETWEEN:date-loAND:date-hiGROUPBYC.CUST_ID

这通常意味着在处理GROUPBY操作之前,来自每个表的符合标准的详细行要预先进行连接。假设在这个例子中,有1000个来自CUSTOMER的行与200,000个来自SALES的行相连接,然后再处理GROUPBY操作。相反,您可以使用表表达式来迫使优化器一个表一个表地进行聚集操作。图4中所示的查询显式地使优化器提早了GROUPBY处理:

图4.将GROUPBY移入表表达式以减少要连接的行数

SELECTC.CUST_NAME,C.CUST_PHONE,S.TOTAL_SALESFROMCUSTOMERC,,(SELECTS.CUST_ID,SUM(S.SALES)ASTOTAL_SALESFROMSALESSWHERES.SALES_DATEBETWEEN:date-loAND:date-hiGROUPBYS.CUST_ID)ASSWHEREC.CUST_ID=S.CUST_ID

例子中表表达式'S'显式地分离了GROUPBY操作。这样往往只需在一两个表上进行聚集操作,详细行来自不同的表。该语法允许优化器搜索SALES表CUST_ID列上的索引支持,以执行GROUPBY。可能的话,排序将避免。不管是否执行了排序,这都大大减少了参与连接的行数。这里不再像上一个例子中那样将1000个来自CUSTOMER的行与200,000个来自SALES的行相连接,现在是将1000个来自CUSTOMER的行只与10,000个salessummary行相连接。GROUPBY处理将表表达式结果压缩到一些总结行。

从已有源生成数据

至此,表表达式最强大的一个用途可以引用一位客户的话来解释:“当我们需要DB2中没有提供的数据时,我们用表表达式造出这样的数据来。”图5中所示的查询包含一个表表达式,它计算出对应于在该表表达式中生成的分组的销售额。

图5.在表表达式中生成子类(subcategory)数据

SELECTC.SUBCATEGORY,SUM(S.SALES)ASS.TOTAL_SALESFROMSALESS,(SELECTC.CUST_ID,SUBSTR(C.COLX,:hvstart,:hvlngth)ASSUBCATEGORYFROMCUSTOMERCWHEREC.CUST_REGIONBETWEEN:reg-loAND:reg-high)ASCWHEREC.CUST_ID=S.CUST_IDGROUPBYC.SUBCATEGORY

该查询对于周期性的报告很有效,即使需要排序,它也可以胜任。当需要弄清楚在列值中是否存在隐含意义时,该查询也同样很棒。然而,如果终端用户要频繁地请求一个公共起始位置和长度,即SUBSTR(C.COLX,2,4),那么应该将这一部分添加到表中,作为表自己的列。这将允许为这个新列提供一个索引,以避免排序。

图6是使用表表达式为季度报表生成正确季度的例子。

图6.为季度报表生成子类数据

SELECTC.SUBCATEGORY,SUM(S.SALES)ASS.TOTAL_SALESFROMSALESS,(SELECTC.CUST_ID,(CASEWHENMONTH(SALE_DT)BETWEEN2AND4THEN'Q1'WHENMONTH(SALE_DT)BETWEEN5AND7THEN'Q2'WHENMONTH(SALE_DT)BETWEEN8AND10THEN'Q3'ELSE'Q4'END)ASSUBCATEGORYFROMCUSTOMERCWHEREC.CUST_REGIONBETWEEN:reg-loAND:reg-high)ASCWHEREC.CUST_ID=S.CUST_IDGROUPBYC.SUBCATEGORY

只要在表表达式内使用了AS标识符命名所生成的数据,就可以在表表达式外的任何地方引用生成的数据。这意味着您也可以按照那个标识符排序,可以将其放入计算中,还可以将它放在表达式可以出现的任何地方。我们可以扩展图6中的例子,使其通过使用主机变量(hostvariable)处理更多的选项,如图7所示。

图7.使用主机变量以获得扩展的灵活性

SELECTC.SUBCATEGORY,SUM(S.SALES)ASS.TOTAL_SALESFROMSALESS,(SELECTC.CUST_ID,(CASEWHENMONTH(SALE_DT)BETWEEN:hv1aAND:hv1bTHEN:hv1WHENMONTH(SALE_DT)BETWEEN:hv2aAND:hv2bTHEN:hv2WHENMONTH(SALE_DT)BETWEEN:hv3aAND:hv3bTHEN:hv3WHENMONTH(SALE_DT)BETWEEN:hv4aAND:hv4bTHEN:hv4WHENMONTH(SALE_DT)BETWEEN:hv5aAND:hv5bTHEN:hv5WHENMONTH(SALE_DT)BETWEEN:hv6aAND:hv6bTHEN:hv6WHENMONTH(SALE_DT)BETWEEN:hv7aAND:hv7bTHEN:hv7WHENMONTH(SALE_DT)BETWEEN:hv8aAND:hv8bTHEN:hv8WHENMONTH(SALE_DT)BETWEEN:hv9aAND:hv9bTHEN:hv9WHENMONTH(SALE_DT)BETWEEN:hv10aAND:hv10bTHEN:hv10WHENMONTH(SALE_DT)BETWEEN:hv11aAND:hv11bTHEN:hv11ELSE:hv12END)ASSUBCATEGORYFROMCUSTOMERCWHEREC.CUST_REGIONBETWEEN:reg-loAND:reg-high)ASCWHEREC.CUST_ID=S.CUST_IDGROUPBYC.SUBCATEGORY

现在该查询可以处理对于按月分组的无止境的请求——如今您想要GROUPBY什么呢?前4个月作为一段时期,接下来的两个月归为另一时期,第6个月加上第12个月一起作为第三段时期,剩下的月份作为第四段时期,这样如何?在构建应用程序时一定要记住这一点。模拟相同的选项需要用到几百个视图。这就是为什么在我的大多数客户机上,视图都从生产应用程序中消声匿迹了,而只允许出现在终端用户环境中。

为获得更大的威力和灵活性,可添加一个用户定义函数,如图8所示。

图8.使用UDF来允许访问非关系数据

SELECTC.SUBCATEGORY,SUM(S.SALES)ASS.TOTAL_SALESFROMSALESS,(SELECTC.CUST_ID,UDFUNC2(:hvparm1,:hvparm2)ASSUBCATEGORYFROMCUSTOMERCWHEREC.CUST_REGIONBETWEEN:reg-loAND:reg-high)ASCWHEREC.CUST_ID=S.CUST_IDGROUPBYC.SUBCATEGORY

现在,该查询可以访问大型主机平台上任何可用源中的数据。例如,UDFUNC2可以访问存储在分布式环境中的平面文件(flatfile)中的数据,在表表达式'C'中引用它,将其称为SUBCATEGORY,还可以对其使用GROUPBY。现在您真正想要对什么使用GROUPBY呢?每当您需要获得或创建DB2环境本地没有的数据,但是又需要在关系操作(join、union、subquery、ORDERBY、GROUPBY,等等)中包括这种数据并且该数据只需用于查询的一次执行的时候,就应该想起使用表表达式。对于多次执行或者迭代,我建议使用全局临时表(这就是以后某天要讲的话题了)。

使用表表达式来帮助调优查询

查询调优是一个很大的主题,所以这里我只讨论表表达式在调优中发挥的作用。首先,将视图从SYSIBM.SYSVIEWS中移出并放入到FROM子句中,这样有助于查询调优器更加清楚该查询将要达到的目标。如果您往往凌晨时还在工作,那么这一点就很重要了。移除视图的间接好处是,使用主机变量具有更大的可扩展性。

为了演示使用表表达式进行前瞻性调优,我将向您展示一个查询,并一一介绍一些性能问题,之后再给出问题的解决方案。第一个查询是以下5个表的连接:

SELECTColumns.FROMTABX,TABY,TABZ,TAB1,TAB2WHEREjoinconditions

上面查询中的问题是表连接顺序。优化器分析每个表中参与连接的行数,估计不同顺序和连接方法所需的代价,并保持以TABX、TABY和TABZ的组合开始。期望的连接顺序从TAB1和TAB2开始。对于静态查询,影响连接顺序的方法有很多。但是,动态查询就没那么幸运了。还好有表表达式这个救星!表表达式通过使用DISTINCT关键字,迫使优化器预先连接表(也要求进行一次排序),从而发挥了其作用。如下所示:

SELECTColumnsFROMTABX,TABY,TABZ,(SELECTDISTINCTCOL1,COL2.FROMTAB1,TAB2WHEREjoinconditions)ASPREJOINWHEREremainingjoinconditions

现在该查询:

连接TAB1和TAB2。排序以除去可能存在的重复行。处理其他表。

这种技术惟一的缺点就是排序以及创建和扫描一个逻辑工作文件会带来额外的开销。但是大多数情况下,这一缺点可以用优化的连接顺序来弥补。

下面的场景更可能出现在非OS/390平台上,但是这一解决方案对于所有平台都是适用的。在下面的例子中,优化器选择物化(materialize)整个表表达式T2,然后使用合并扫描连接技术与T1相连接:

SELECTColumnsfromeithersetofdataFROMtable1T1,(SELECTT2.STUDENT_YEAR,SUM(C8)ASSUM8,MAX(C9)ASMAX9FROMtable2T2GROUPBYT2.STUDENT_YEAR)AST2WHERET1.MAJOR_ID=T2.MAJOR_ID

该解决方案要求在表表达式之前插入关键字TABLE。这使得表表达式可以与外部表相互关联。这种相互关联会影响优化器倾向于嵌套循环连接,并大大减少物化。在下面的例子中,通过将连接条件移入到表表达式里面来,可以使表表达式与外部表相互关联:

SELECTColumnsfromeithersetofdataFROMtable1T1,TABLE(SELECTT2.STUDENT_YEAR,SUM(C8)ASSUM8,MAX(C9)ASMAX9FROMtable2T2WHERET1.MAJOR_ID=T2.MAJOR_IDGROUPBYT2.STUDENT_YEAR)AST2

该查询现在一次处理一个T1.MAJOR_ID。只有符合那个MAJOR_ID的那些行才会在逻辑工作文件中物化。优化器认为工作文件越小,就越会选择嵌套循环连接。如果是在OS/390或z/OSTM平台下的DB2上尝试这一解决方案,就要小心了,因为该解决方案并不总能提高性能。请检查EXPLAIN输出,使用评测工具,或者运行基准测试来验证这一调优行动是否成功。

THE END
1.windows常用快捷键快捷键Win + I 可以唤出Windows设置界面——也就是以前的Windows控制面板。这里可以更详细的的设置win10。 打开文件管理器(Win+ E) 我们可以从“我的电脑”或者任务栏的图标中点击「文件资源管理器」,还可以用 快捷键Win+ E在任何情况下呼出文件管理器,这样操作似乎更加方便。 https://www.ctyun.cn/zhishi/p-429777
2.win11组合键怎么设置方法一: 可以直接通过按win+R组合键,不管windows是什么版本,windows+R组合键都可以快速打开运行框。其中windows是windows徽标键,位于键盘上的Ctrl和Alt中间。 方法二: 可以同时按住Win+X组合键调出快捷菜单,也可以鼠标右键点击下角【开始】图标,调出快捷菜单,这边就有【运行(R)】选项,点击即可打开运行。 https://www.dingshops.com/pub/21kxldwjl.html
3.windowswindows系统提高效率的实用的技巧1【windows】windows系统提高效率的实用的技巧-1 1.快速打开“任务管理器”快捷键 同时按下“Ctrl + Shift + Esc”。 2.快速打开CMD(命令提示符) 窗口 打开一个目录(文件夹),在地址栏中,键入“cmd”,然后按 Enter。命令行窗口将在指定的目录中打开。https://blog.csdn.net/Best_lgx/article/details/144365848
4.你了解Windows10的快捷键有哪些吗?F10 显示快捷键提示 Shift+F10 显示当前快捷菜单 F1 打开“写字板”帮助 在计算器中的快捷键 Alt+1 切换到标准模式 Alt+2 切换到科学型模式 Alt+3 切换到程序员模式 Alt+4 切换到统计信息模式 Ctrl+E 打开日期计算 Ctrl+H 将计算历史记录打开或关闭 http://www.situedu.com/news/uid/2092.html
5.450性能提升指南:简单技巧瞬间加速电脑运行手机教程系统版本:Windows 11 品牌型号:联想B450 软件版本:Lenovo Vantage最新版本,CCleaner最新版本 一、优化启动程序 1、在Windows 11中,启动项管理变得更加直观。首先,打开任务管理器(可以通过按下Ctrl + Shift + Esc快捷键),选择“启动”选项卡。这里列出了所有开机时自动启动的程序。通过禁用不必要的启动项,可以显著提https://smart.163987.com/shouji/163631.html
6.W7怎么硬件加速2、在打开的个性化窗口中的左侧找到并单击显示;3、在新打开的显示中窗口左侧中找到并单击调整分辩率;4、在新调出的屏幕分辨率窗口中,找到并单击窗口右下角所示的更改设置;5、在新出来的通用非即插即用监视器窗口中,找到并单击切换到疑难解答选项卡中,单击更改设置,在新出的窗口中即可调节硬件加速https://zhidao.baidu.com/question/724111257927625285.html
7.windows11键盘设置在哪里请继续阅读以了解如何自定义您的键盘设置,优化您的 windows 11 体验。 1. 首先我们打开开始菜单,然后点击设置进去。 2. 然后我们在辅助功能里面,下划就能找到键盘设置选项。 3. 点击进去我们能看到粘滞键、过滤键、切换键的设置开关。https://www.xz3.com.cn/rjjc/k9q62dj37.html
8.如何设置自定义运行快捷键提高工作效率?步骤详解教你轻松掌握2、不同于用户界面的复杂性,自定义快捷键提供了更直接的交互方式,适合希望在工作流程中最大化利用时间的用户。 总结: 本文详细介绍了如何在 Windows 11、macOS、Android 和 iOS 等主流系统平台上设置自定义快捷键的具体步骤。通过善用这些技巧,可以提高日常工作的流畅性和效率,确保我们在快节奏的时代始终保持领先。随https://smart.958358.com/itother/148922.html
9.應用程式中的鍵盤快速鍵播放或暫停 (當視訊在焦點中時) Alt + 向左鍵 或 Windows 標誌鍵+ 退格鍵 返回 Ctrl + T 開啟或關閉重複播放 F7 靜音 F8 降低音量 F9 增強音量 [小畫家] 鍵盤快速鍵 ? 按這個按鍵 執行事項 F11 以全螢幕模式檢視圖片 https://support.microsoft.com/zh-tw/help/13805/windows-keyboard-shortcuts-in-apps
10.期望收益率与标准差的关系期望收益率最近这段时间总有小伙伴问小编期望收益率与标准差的关系_期望收益率是什么,小编为此在网上搜寻了一些有关于期望收益率与标准差的关系_期望收益率的知识送给大家,希望能解答各位小伙伴的疑惑。 今天小编肥嘟来为大家解答以上的问题。期望收益率与标准差的关系,期望收益率相信很多小伙伴还不知道,现在让我们一起来看看吧http://m.kepu365.cn/xinwen/kpxw/112969.html
11.综合CAD常用技巧与问题六、使用命令别名和加速键 AutoCAD为一些比较常用的命令或菜单项定义了别名和加速键。使用命令别名和加速键可以明显节省访问命令的时间。命令别名是在acad.pgp文件中定义的。用任何文本编辑器打开并编辑该文件,就可以添加、删除或更改命令别名。用这种方法定义的别名,当重新进入AutoCAD时即可使用。在最新的软件版本中,用户https://www.360doc.cn/article/2577035_87140643.html
12.windows的140个技巧经验技巧Windows XP提供了批量重命名文件的功能,在资源管理器中选择几个文件,接着按F2键,然后重命名这些文件中的一个,这样所有被选择的文件将会被重命名为新的文件名(在末尾处加上递增的数字)。 14. 快速锁定计算机 在桌面上单击鼠标右键,在随后出现的快捷菜单上选择新建“快捷方式”,接着系统便会启动创建快捷方式向导,https://www.west.cn/www/?p=65544
13.完整版的WindowsVista系统开机加速全攻略VistaWindows系列不管转几圈,总有办法去优化,如果你用了Vista优化大师(最新版下载)的优化向导,那么可以在此直接告诉您,Vista优化大师的优化向导不会对您开机启动速度改善很多,你还要手动去设置和关闭一些系统级别的服务,这个我们今天会特别会在《Windows Vista系统开机加速全攻略》之后的内容里专门解说,做到骨灰级别的优化系统服务来彻底https://www.jb51.net/os/Vista/11513_all.html
14.AdobePremiereProCC2017经典教程在开始使用本书之前,请确保系统已经正确设置并安装了所需的软件和硬件。可以访问helpx.adobe.com/premiere-pro/system-requirements.html来查看更新的系统要求。 你应该具备计算机和操作系统方面的知识,而且应该知道如何使用鼠标和标准的菜单与命令,以及如何打开、保存和关闭文件。如果需要复习一下这些内容,请参见Windows或https://www.epubit.com/bookDetails?id=N37977
15.笔记本电脑基础知识一、风扇在开机时转一下就不转了,是故障码? 不是,由于笔记本电脑内部有温控设计,所以风扇在开机自检时转一会儿就会停止旋转,只有当笔记本内部达到一定温度时才会加速旋转。 所以,如果你开机后并未执行一些占资源的程序,你基本上听不到风扇声音,而一旦进行高负荷工作,诸如播放高解码率视频、运行3D游戏时,风扇就会高速https://www.jy135.com/diannao/260899.html
16.快捷键AltiumDesigner22.0技术文档然而,虽然这是菜单定义的加速键,这样做会弹出选择子菜单(来自主编辑菜单)。通过使用Alt+S,可以访问预期的模拟菜单。 主菜单的加速键可以用作不同子菜单的弹出键。使用Alt+<MenuAcceleratorKey>将始终访问该主菜单。 在许多情况下,主菜单也会有一个弹出键分配(通常是与其加速键相同的键)。在这种情况下,使用该键https://www.altium.com/cn/documentation/altium-designer/shortcut-keys?version=22.0
17.wm2SOFTWAREMicrosoftWindowsCurrentVersion主键,在下面建立一项键值,命名为:“explorer”,再到“explorer”底下新建一个名为“AlwaysUnloadDll”的字符串值,然后将“AlwaysUnloadDll”的键值写为“1”,退出注册表重启即可。 7.改变屏幕最下面那两个触摸软键的功能 https://www.douban.com/note/176448624/
18.VRAR行业深度报告:VRAR是中场,Metaverse是终局–道可云2020,VR/AR 产业发展按下加速键;巨头亮剑,新赛季排位之战拉开帷幕。2020 年因疫情 造成的社交隔离激发了 VR 游戏、虚拟会议、AR 测温等需求崛起,Steam 平台 VR 活跃用 户翻倍增长,虚拟会议,云端展览案例层出不穷。2020 年全球 VR 头显出货量达 670 万台, 较 2019 年增长 72%,AR 眼镜出货量 40 万台,增https://www.daokeyun.com/index.php/1853
19.>第3章Solaris运行时问题特别地,如果 Compose 键序列需要使用 Shift 键以键入这些字符中的一个字符,则在这些系统中该键序列不可用。 解决方法:选择下列选项之一: 使用不包括 Shift 键的替换 Compose 键序列。 有关更多信息,请参见《Solaris Common Desktop Environment: User’s Guide》中的附录 C“Compose Key Sequences”。该附录提供可https://docs.oracle.com/cd/E19253-01/819-0307/6n2o9v7ml/index.html
20.WIN32汇编之菜单加速键快捷键对菜单的快键进行预处理,将WM_KEYDOWN或WM_SYSKEYDOWN消息处理成为WM_COMMAND或WM_SYSCOMMAND,并直接将消息送到窗口过程处理,直到窗口过程处理该消息后才返回. Syntax int TranslateAccelerator( HWND hWnd, HACCEL hAccTable,加速键表的资源句柄 LPMSG lpMsg https://www.iteye.com/blog/deepfuture-599095
21.二万五千字解读车载OTASOTA是在操作系统的基础上对应用程序进行升级,整个过程相当于我们在电脑上对一个程序进行了升级,特别指出只是程序的升级,WINDOWS系统更新打补丁的技术都比SOTA要难。市面上的安卓车机,如果想要对APP进行升级,只要找几个开发和测试就能干完,几乎没有技术壁垒。也许有人问,既然实现起来很简单,也没有什么技术含量,那https://www.dongchedi.com/article/7285377485301760546
22.N73最全面最强最实用的使用技巧全攻略顺便说一下:旧版handay clock闹钟软件和N73不兼容,开启闹钟响过N73的多媒体键就失效!请大家换用4.02以上版本 所以只要是正常的JAR程序N73都能运行,只有屏幕全屏半屏之分。 5.在N73中可对DOC文档缩放浏览;XLS文档能够调整行列大小、平移、冻结窗口等操作;PPT文档则能够全屏演示。FLASH播放器版本低,很多稍大的flash拷https://supplier.alibaba.com/article/CTGQ9BNUJ58.htm
23.CAD制图的80个神技巧,助你快速绘图,别让速度限制你的工资比如CTRL+C(复制) CTRL+V(粘贴) CTRL+A(全选)等一系列和CTRL键有关的命令都会失效 这时你只需到OP选项里调一下 操作:OP(选项)---用户系统配置---WINDOWS标准加速键(打上勾) 标准加速键打上勾后,和CTRL键有关的命令则有效,反之失灵。 CAD资料大https://zhuanlan.zhihu.com/p/455624052
24.让Windows11更好用,我用这些设置插件把它“打磨”了一遍对于单次虚拟桌面切换来说动画是更加丝滑了——Windows 11 非线性动画的加速、减速比起 Windows 10 更加自然。但多次切换就有点灾难了,在 Windows 10 按住 Ctrl + Win 并多次按左右方向键时,滑动动画经历「加速 > 连续的桌面滑动(哪怕有来回)> 减速」停到目标桌面,而在 Windows 11 中,多次切换时,每次都会https://36kr.com/p/2966370858258697