当使用SystemTap在x86_64-pc-linux-gnu上的PostgreSQL 11.2上跟踪postgres会话时,由gcc (GCC) 4.8.5 20150623 (RedHat4.8.5-36)编译,64位。
global livequeries
probe process("/usr/pgsql-11/bin/postgres").mark("query-start"){
printf("[%s] Query start on PID %d : %s \n", ctime(gettimeofday_s()), pid(), user_string($arg1) )
livequeries[tid(),$arg1] = gettimeofday_us()
}psql会触发这个探测,但是java驱动程序不会。
参考文献:文档
发布于 2019-04-26 14:31:52
我认为,通过psql运行查询与使用Java程序运行查询的不同之处在于,您在Java中使用了准备好的语句。处理“简单语句”和准备好的语句在Postgres后端(postgres.c)中采用不同的代码路径。
只有在执行简单语句(exec_simple_query)时才调用“query”探测,而准备好的语句处理有两个不同的阶段:解析(exec_parse_message)和执行(exec_execute_message)。
当它们在PortalRun中调用pquery.c时,这两种代码路径都会聚在一起,其中调用“query”探测。
换句话说,这两个代码路径看起来如下(省略了“完成”探测):
psql -> simple statement
query-start probe
query-parse-start probe
query-parse-done probe
query-rewrite-start probe
query-rewrite-done probe
query-plan-start probe
query-plan-done probe
query-execute-start probe
query-execute-done probe
query-done probe
JDBC -> prepared statement
prepare phase
query-parse-start probe
query-parse-done probe
execute phase
query-execute-start probe
query-execute-done probe如果您不特别关心查询解析和计划延迟,则需要捕获“query *”探测。如果您需要查询文本,也可以捕获“查询-解析-开始”。
https://dba.stackexchange.com/questions/236765
复制相似问题