点击此处---> 群内免费提供SAP练习系统(在群公告中)
加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)
嗨,
Linux上的ASE 15.7.1。
周末结束时的维护工作(重组,更新统计信息),星期一用户开始工作,并且所有存储过程和触发器都将重新编译并获得新的查询计划。 一个触发器会获得2个不同的查询计划,并且性能会有很大不同。 使用强制索引重新创建触发器,现在只有一个计划,它可以正常工作。
出于好奇,我检查了有多少个存储的proc和触发器具有一个以上的查询计划,并且发现在维护作业运行两天后,有400多个具有两个或多个查询计划且性能差异很大的已编译对象。
ASE如何管理这些不同的计划? 有什么东西可以消除最糟糕的东西吗?
select * from(
select count(*)作为"数字",ExecutionTime/RequestCnt作为" averageTime",DBName,ObjectType,ObjectName来自monCachedProcedures,其中ObjectName不像" *%*"那样按DBName,ObjectType, ObjectName)a
其中数字>按DBName,ObjectType,ObjectName,averageTime的1顺序
number averageTime DBName ObjectType ObjectName
----------- ----------- ----------------- ------------- -------------------------------- ----- -------------------------
9 9 15 MEDUSA_PROD存储过程AvailabilityUnprocessedPoll
9 17 31504 MEDUSA_PROD存储过程AvailabilityUnprocessedPoll
9 19 44073 MEDUSA_PROD存储过程 AvailabilityUnprocessedPoll
9140600 MEDUSA_PROD存储过程AvailabilityUnprocessedPoll
9 334 1 MEDUSA_PROD存储过程AvailabilityUnprocessedPoll
9 2682 32 MEDUSA_PROD存储过程AvailabilityUnprocessedPoll
9 3169 17 MEDUSA_PROD存储过程AvailabilityUnprocessedPoll
9 7048 1 AvailabilityUnprocessedPoll
9 25417 2 MEDUSA_PROD存储过程AvailabilityUnprocessedPoll
我在上面编写了查询,看一下具有9个不同查询计划的存储过程示例,平均执行时间从9毫秒变为25秒,并且速度不是最快的选择。
我知道有dbcc deleteplan,但是它不受支持,我不喜欢在生产中使用它。 还有其他最佳做法吗? 每次维护作业运行时,程序或触发器是否可能开始缓慢运行? dba可以采取什么措施来防止这种情况发生?
几个问号只是为了给您更多有关同一问题的观点。
Massimo,
您是否正在偶然打开带有ddl的sp/trigger中带有索引的#tables? 请看一下这篇KBA文章:
https://launchpad.support.sap.com/#/notes/2224058
致谢
Mehrab
感谢Mehrab的反馈。
我们最近升级到ASE 16,将使此有用的注释方便使用。
欢呼
谢谢
我阅读SAP/Sybase文档的方式,如果有多个用户并行执行存储的proc(或触发器),则将存储的proc的多个副本编译为 过程高速缓存存储器。 以下是"性能和调优系列"的引文:基础知识->内存使用和性能->过程高速缓存文档页面:
""如果内存中没有计划,或者所有副本都在使用中,那么将从sysprocedures表中读取该过程的查询树。然后使用提供给该过程的参数优化该查询树, 并放置在链的MRU末端,然后开始执行。未使用的页面链的LRU末端的计划将从缓存中过期。"
所以我的问题是,如果您有一个请求要执行存储的proc,并且需要将该proc编译(正确的单词?)到内存中,它将使用"提供给该过程的参数"来决定要执行的操作 。 我认为某些参数可能导致存储的proc进行不同的编译,从而在重新使用缓存/编译的内存副本时导致性能差异。
此外,当您说同一存储过程的不同计划的执行时间有很大差异时,是否会根据不同执行中搜索和/或返回的行数而有所不同? (即,针对不同的调用参数)。 您能判断出任何不良的存储过程计划是否包含错误的表扫描吗?
我似乎找不到一种方法来显示存储过程的缓存已编译副本的查询计划。 monCachedProcedures表具有一个PlanID字段,但似乎没有任何调用来显示ObjectID和PlanID的查询计划(有用于语句缓存的东西,但没有存储的procs)
华盛顿特区附近的本钟
回复:显示过程缓存中存储的proc的查询计划吗?
看起来应该可以使用monCachedProcedures中的PlanID来调用16.0 SP03 PL06和更高版本中的show_plan()函数。 调用语法为:
show_plan(,, [,])
https://help。 sap.com/viewer/791c41982ee345a19c4ec4b774222c4f/16.0.3.8/zh-CN/adca355a9d774e89a6850782044c9517.html?q=show_plan
一周热门 更多>