一、M_EXPENSIVE_STATEMENTS的概念及使用方法
系统视图M_EXPENSIVE_STATEMENTS提供所有执行时间超过指定阈值的语句,即查看在系统上执行的最耗时和最耗内存的语句。
需要关注字段是CPU_TIME和MEMORY_SIZE,可以使用以下的语句找出内存或者cpu占比较高的语句,注意,你能看到的信息取决于你的DB_USER权限。
参考语句如下,根据下边的语句,你可以根据MEMORY_SIZE或CPU_TIME排序,并对不理想的模型进行优化。
SELECT
DB_USER,
SCHEMA_NAME,
to_decimal(CPU_TIME/1000000,8,2) as CPU_TIME, --指定计算语句消耗的 CPU 时间(秒为单位)
to_decimal(MEMORY_SIZE/1024/1024/1024,8,2) as MEMORY_SIZE,--指定语句执行期间的峰值内存使用量(G为单位)
TO_CHAR(STATEMENT_STRING) AS STATEMENT_STRING --执行语句
FROM "M_EXPENSIVE_STATEMENTS"
WHERE 1=1
--AND "STATEMENT_STRING" LIKE '%部分查询语句%' --这里写具体的语句可以找到
--AND SCHEMA_NAME = 'HANABI_SCHEMA' --可以指定schema名
ORDER BY CPU_TIME DESC
--ORDER BY MEMORY_SIZE DESC
二、M_EXPENSIVE_STATEMENTS记录的信息
要在SAP HANA studio中配置阈值,可以在SAP HANA studio的Performance Expensive Statements Trace屏幕中激活耗时语句跟踪。点击Configure以打开Trace Configuration对话框。在那里,你可以激活跟踪并调整阈值。
可能会被记录的操作或语句
2.1 操作
COMPILE:编译语句。
FETCH:获取结果集。
CURSOR_CLOSE:关闭光标。
AGGREGATED_EXECUTION:计算SELECT查询的总执行时间,包括编译时间。
2.2 DML语句
CALL
DELETE
DEQUEUE
EXPLAIN_PLAN
INSERT
SELECT
SELECT_FOR_UPDATE
UPDATE
EXECUTE_DML:表示上述未列出的较少见的DML语句。
2.3 DDL语句
CREATE_TABLE
CREATE_VIEW
EXECUTE_DDL:表示上述未列出的较少见的DDL语句。
2.4 除DML和DDL之外的语句:
EXECUTE:表示较少见的SQL语句。
考虑一个客户端发送的包含4个会话请求的查询:
Prepare:10毫秒
Execute:20毫秒
Fetch:15毫秒
Close:5毫秒
假设所有操作的时间都超过阈值,它们会显示为:OPERATION DURATION COMPILE 10 SELECT 20 FETCH 15 CURSOR_CLOSE 5 AGGREGATED_EXECUTION 40 (20+15+5)。
附加信息
Column name | Description | |
HOST | 指定主机名 | |
PORT | 指定内部端口 | |
CONNECTION_ID | 指定连接 ID | |
TRANSACTION_ID | 指定事务对象 ID | |
UPDATE_TRANSACTION_ID | 指定写入事务 ID | |
STATEMENT_ID | 指定语句 ID | |
PARENT_STATEMENT_ID | 指定父语句 ID | |
STATEMENT_HASH | 指定 SQL 字符串的唯一标识符 | |
DB_USER | 指定用户名 | |
SCHEMA_NAME | schema名字 | |
APP_USER | 指定应用程序用户名 | |
START_TIME | 指定语句开始时间 | |
DURATION_MICROSEC | 指定语句持续时间 | |
OBJECT_NAME | 指定相关对象 | |
OPERATION | 指定操作类型(准备、执行、获取或关闭) | |
RECORDS | 指定记录数 | |
STATEMENT_STRING | 指定语句字符串 | |
PARAMETERS | 指定语句参数 | |
ERROR_CODE | 指定错误代码 | |
ERROR_TEXT | 指定错误消息 | |
LOCK_WAIT_COUNT | 指定累积锁等待计数 | |
LOCK_WAIT_DURATION | 指定累积锁等待持续时间 | |
ALLOC_MEM_SIZE_ROWSTORE | 已弃用,请勿使用 | |
ALLOC_MEM_SIZE_COLSTORE | 已弃用,请勿使用 | |
MEMORY_SIZE | 指定语句执行期间的峰值内存使用量。在查询在分布式系统(即查询在多个主机上分布执行)中执行的情况下,MEMORY_SIZE 是所有涉及主机中最高的峰值内存使用量。因此,如果主机 A 的峰值使用量为 2 GB,主机 B 的峰值使用量为 3 GB,则 MEMORY_SIZE 显示为 3 GB。 此值由于缓存原因而保留或在语句执行后释放。 | |
REUSED_MEMORY_SIZE | 指定从缓存的数据结构中重用的内存。如果缓存为空,则该值为 0。 | |
CPU_TIME | 指定计算语句消耗的 CPU 时间(以微秒为单位)。 | |
PASSPORT_ROOT_CONTEXT_ID | 指定标识请求来源的 SAP EPP Passport GUID。 | |
PASSPORT_TRANSACTION_ID | 指定标识业务交易的 SAP EPP Passport GUID。 | |
PASSPORT_CONNECTION_ID | 指定标识连接的 SAP EPP Passport GUID | |
PASSPORT_CONNECTION_COUNTER | 指定 SAP EPP Passport 连接计数器。 | |
STATEMENT_START_TIME | 指定语句执行的第一个操作开始的时间。语句执行的所有操作(准备、执行、获取或关闭)共享相同的语句开始时间。 | |
APPLICATION_SOURCE | 指定应用程序定义 SAP HANA 调用的源文件。使用由应用程序确定。该值还显示在 M_PREPARED_STATEMENTS.APPLICATION_SOURCE 中。 | |
APPLICATION_NAME | 指定应用程序的名称。 | |
NETWORK_MESSAGE_ID | 指定物理服务器连接上的客户端消息 ID,也可在 M_SQL_CLIENT_NETWORK_IO 和 MESSAGE_ID 中找到 | |
WORKLOAD_CLASS_NAME | 指定有效的工作负载类的名称 | |
PRIORITY | 指定有效的语句优先级 | |
STATEMENT_THREAD_LIMIT | 指定有效的语句线程限制 | |
STATEMENT_MEMORY_LIMIT | 指定有效的语句内存限制 | |
SESSION_VARIABLES | 指定语句的会话变量 |