在DB2上调整SQL PLAN

2020-09-05 06:39发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


您好专家

我对具有绑定变量的SQL的执行计划有疑问:

SQL1:在附加文件上按计划运行非常快

选择计数(*)

来自JHMATCH m
内连接VHBORDER bo
上m.BORDERID = bo.ORDERID
内连接VCRPTTRADINGACCVN ta
bo.CLIENTID = ta.CLIENTID
和bo.TRADINGACCSEQ = ta.TRADINGACCSEQ
和m.VALUEDATE> ='2019-06-03'
和m.VALUEDATE <='2019-06-30'

SQL2:对附件文件的计划运行非常慢

选择计数(*)

来自JHMATCH m
内连接VHBORDER bo
上m.BORDERID = bo.ORDERID
内连接VCRPTTRADINGACCVN ta
bo.CLIENTID = ta.CLIENTID
和bo.TRADINGACCSEQ = ta.TRADINGACCSEQ
和m.VALUEDATE> ='2019-06-02'
和m.VALUEDATE <='2019-06-30'

我执行了Runstats来收集表JHMATCH,THBORDER上的统计信息,并再次运行SQL1、2,但是遇到了同样的问题。 请帮助我调整SQL2。

非常感谢,

Bgs,Vinhpv。

sql1-plan.jpg (460.3 kB)

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


您好专家

我对具有绑定变量的SQL的执行计划有疑问:

SQL1:在附加文件上按计划运行非常快

选择计数(*)

来自JHMATCH m
内连接VHBORDER bo
上m.BORDERID = bo.ORDERID
内连接VCRPTTRADINGACCVN ta
bo.CLIENTID = ta.CLIENTID
和bo.TRADINGACCSEQ = ta.TRADINGACCSEQ
和m.VALUEDATE> ='2019-06-03'
和m.VALUEDATE <='2019-06-30'

SQL2:对附件文件的计划运行非常慢

选择计数(*)

来自JHMATCH m
内连接VHBORDER bo
上m.BORDERID = bo.ORDERID
内连接VCRPTTRADINGACCVN ta
bo.CLIENTID = ta.CLIENTID
和bo.TRADINGACCSEQ = ta.TRADINGACCSEQ
和m.VALUEDATE> ='2019-06-02'
和m.VALUEDATE <='2019-06-30'

我执行了Runstats来收集表JHMATCH,THBORDER上的统计信息,并再次运行SQL1、2,但是遇到了同样的问题。 请帮助我调整SQL2。

非常感谢,

Bgs,Vinhpv。

sql1-plan.jpg (460.3 kB)
付费偷看设置
发送
8条回答
风早神人
1楼 · 2020-09-05 07:20.采纳回答

嗨,

这不是SAP数据库...随着时间的推移,SAP在注册表设置DB2_WORKLOAD = SAP下添加了越来越多的优化器开关。 这可以避免许多奇怪的优化器决策……

随着VALUEDATE范围范围谓词的改变,优化器有时会切换到HSJOIN。
HSJOIN计划在您的系统上运行缓慢。

是否有理由压缩您的表和索引? 当什么都没有压缩时,查询将导致比所需更多的I/O。 这可能是性能不佳的原因。 当表和索引较小时,DB2优化器可能还会选择一个更好的访问计划。

好的访问计划看起来还可以,但是表THBORDER上的主键并不覆盖查询中的所有谓词。 因此,DB2需要在此表上执行IXSCAN/FETCH。 将STATUS列作为INCLUDE列添加到该表的主键可能是一个好主意。 这应该在表THBORDER上启用纯IXSCAN,并使HSJOIN的吸引力降低。

问候

弗兰克

nice_wp
2楼-- · 2020-09-05 07:31

嗨,弗兰克 >

我已经成为Oracle DBA多年了,但是在DB2中是新手,并且从未使用过db2look,db2exfmt ...我将研究使用它的方法。

我想向您发送更多日志(索引,表,统计信息的结构),请帮助我解决此问题。

非常感谢Frank!

Bgs,Vinhpv

愤怒的猪头君
3楼-- · 2020-09-05 07:40

嗨,

如果不了解表和索引结构以及IXCAN运算符的EXPLAIN详细信息,很难解释那些EXPLAIN屏幕截图。 我不习惯使用这个EXPLAIN工具。 如果我正确解释了屏幕快照,则查询中的某些谓词只能用作(SARG)谓词。 这些(SARG)谓词不限制需要读取的索引页的数量。 因此,也许创建更好的索引是一个选择。

要提供更合格的答案,我至少需要涉及表的db2look输出和语句EXPLAINs的完整db2exfmt输出。

通常对于SAP事件,我们建议使用" db2support ... -sf"选项一次收集所有相关的优化器支持数据(请参阅SAP注释83819)。 这样可以避免支持往返,并且除其他外还包含db2look和db2exfmt数据...。

问候

Frank



zhangjiyang1323
4楼-- · 2020-09-05 07:18

嗨,

我需要的大多数信息可能都包含在这些镜头中,但是以这种方式工作太耗时了。

如果 希望我进一步分析访问计划,请帮我一个忙,收集包括db2look和db2exfmt信息在内的db2support数据。

这是一个SAP Db2数据库。 如果是,您可以打开服务连接吗?

问候

弗兰克

Nan4612
5楼-- · 2020-09-05 07:40

嗨Vinhpv,

您 认为STATUS列的基数较低是很可笑的。 但是,在这种情况下,包括STATUS列不能提供更好的索引过滤因子。 它允许仅访问表THBORDER的索引。 我相信这对包括ORACLE在内的所有传统数据库都应该有所帮助。

表和索引的压缩会花费更多的CPU周期来进行页面压缩/解压缩。 另一方面,它可以减少不必要的I/O,从而节省CPU周期。 通常,压缩的净效果为正。 在SAP系统上,建议对所有表和索引使用压缩。

在Db2上,您可以在静态压缩和自适应压缩之间进行选择。 由于具有静态表字典和页面级字典,因此自适应压缩可提供更好的压缩率。 我看到的例子很少,但由于可用空间搜索开销(非常宽的表具有较低的压缩率和较高的DELETE/INSERT率)而导致自适应压缩会产生问题。 在您的示例中应该不是这种情况。

据我所知,ORACLE压缩仅使用页面级字典。 因此,压缩在ORACLE上的表现可能会有所不同。

Regard

Frank

lukcy2020
6楼-- · 2020-09-05 07:29

Hi Frank,

我想通过波纹管发送给您db2support的输出,请帮助我解决问题。

db2support工具的输出文件:

https://drive.google.com/file/d/1x9aoGZJbuntlFBikOMr0YU7a6hUQGBpE/view?usp = sharing

https://drive.google.com/open?id=1gpQGOT2WUpq9eMiDeoQ4aLN8SrrAEPQ

非常感谢Frank!

Bgs,Vinhpv

绿领巾童鞋
7楼-- · 2020-09-05 07:19

嗨弗兰克,

根据您的建议,我创建了一个新索引,如带有主列STATUS的主键,问题已解决。

我还有其他问题。 请帮助我解释问题。

我的数据库属于OLTP系统,因此我可以对表和索引使用压缩吗? 压缩选项是否适合DML事务?

列STATUS,STATE具有很多重复值(低基数),在我看来,在列上建立索引没有用,但这种情况并不正确。

在Oracle DB中,我看到通常不使用带有<>条件或低基数列的条件WHERE在列上创建索引,并且很难选择执行困难的简单计划。 Oracle中的Optimizer似乎比DB2更好?

非常感谢您的建议!

Bgs,Vinhpv

一周热门 更多>