关于SQL语句的性能分析,本文中仅从运维角度出发,并不包括SQL语句的优化分析,如执行计划,visualize plan的分析等。
首先是Performance页面里的两个tab,SQL cache 和 Expensive Statements。
如性能分析的第一篇提到的,这个页面不太灵活,反应也很慢,还是直接用SQL语句查询具体视图比较好。当然,利用SAP NOTE 1969700中的SQL语句也可以获取相关信息。
SQL Cache 分析
先上参考Note:
- 2502256 - FAQ: SAP HANA Caches
- 2000002 - FAQ: SAP HANA SQL Optimization
- 2040002 - Size recommendation for the HANA SQL Plan Cache
HANA中的cache种类有很多,这里的SQL cache,指的是SQL plan cache,也就是执行SQL语句前,执行计划和SQL语句解析(SQL parsing)的缓存。Cache size的具体设置也要取决于HANA的上层应用,ABAP,JAVA或者Standalone不尽相同。
如果HANA告警中出现了如下几个:
- ID58 Plan cache size
- ID81 Cached view size
- ID91 Plan cache hit ratio
说明SQL cache需要进一步分析,有调整的空间。
SQL Cache的分析
SAP提供的一些SQL语句可以帮助定位问题。比如HANA_SQL_SQLCache_TopLists:
这个报告会输出占用资源较多的SQL语句,按照执行时间,准备时间,调用线程等多个维度分别排序,可以定位到潜在的问题语句。使用语句的哈希值定位语句(去M_SQL_PLAN_CACHE或者HOST_SQL_PLAN_CACHE里面可以找到具体的语句内容)
TP列指的是语句类型,比如SE是查询,IN是插入等等。SO列是语句来源(ABAP/DS/Crystal Report之类之类)最后一列是百分比。
另外一个语句是HANA_SQL_SQLCache_Overview,这个是用来查看SQL cache的使用状况的,输出样例如图:
其中CONF_GB为当前Cache大小,默认值为2GB。USED_GB为使用量,USED_PCT为使用率,后面两列是推荐值,根据上层应用区分(ABAP/NONABAP)HIT_PCT为命中率。
后面的条目有个小概念,Eviction。其实就是swap,条目会因为一些原因从缓存中移除。EVICT_PER_H就是每小时Eviction数量。如图观察,这个数据的Cache其实是设大了,可以调小一点。
还有一个语句是HANA_SQL_SQLCache,可以用来查看cache条目失效的原因。输出样例如图:
INV_REASON指失效原因,其中cache full是指因cache满而swap out的条目,如果cache full比例较大,且前面视图中显示的命中率不高的话,可以考虑增加cache的大小。还有一个值得提到的原因,是LOW_SCORE,这个涉及到一个机制,叫做aggresive eviction。相当于在SQL Cache还有空间的情况下,主动移除一些系统认为价值不大的缓存语句。这是HANA的一个新功能,2.0 SPS04后面默认开启,如果这个条目占比较高,可尝试关掉并观察命中率的变化。
Cache相关视图:
- M_SQL_PLAN_CACHE
- M_SQL_PLAN_STATISTICS
- M_SQL_PLAN_CACHE_RESET(M_SQL_PLAN_CACHE的可清零版本,比如想分析某段时间的sql cache,可先把此视图reset,之后分析从这个视图上收集到的信息即可)
- HOST_SQL_PLAN_CACHE