File: qlog.sql

package info (click to toggle)
virtuoso-opensource 7.2.5.1%2Bdfsg1-0.3
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 285,240 kB
  • sloc: ansic: 641,220; sql: 490,413; xml: 269,570; java: 83,893; javascript: 79,900; cpp: 36,927; sh: 31,653; cs: 25,702; php: 12,690; yacc: 10,227; lex: 7,601; makefile: 7,129; jsp: 4,523; awk: 1,697; perl: 1,013; ruby: 1,003; python: 326
file content (182 lines) | stat: -rw-r--r-- 7,570 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
--
--  $Id$
--
--  This file is part of the OpenLink Software Virtuoso Open-Source (VOS)
--  project.
--
--  Copyright (C) 1998-2018 OpenLink Software
--
--  This project is free software; you can redistribute it and/or modify it
--  under the terms of the GNU General Public License as published by the
--  Free Software Foundation; only version 2 of the License, dated June 1991.
--
--  This program is distributed in the hope that it will be useful, but
--  WITHOUT ANY WARRANTY; without even the implied warranty of
--  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
--  General Public License for more details.
--
--  You should have received a copy of the GNU General Public License along
--  with this program; if not, write to the Free Software Foundation, Inc.,
--  51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
--
--

-- Query log view

create procedure sys_query_log_pv (in qrl_file varchar := null, in qrl_start datetime := null, in qrl_end datetime := null)
{
  declare ql_start_dt datetime;
  declare ql_client_ip, ql_user, ql_sqlstate, ql_error, ql_text, ql_plan varchar;
  declare ql_node_stat, ql_params,  arr, ses any;
  declare  ql_id, ql_rt_msec, ql_rt_clocks,
    ql_swap, ql_user_cpu, ql_sys_cpu,
    ql_plan_hash,
    ql_c_clocks, ql_c_msec, ql_c_disk_reads, ql_c_disk_wait, ql_c_cl_wait, ql_cl_messages, ql_c_rnd_rows,
    ql_rnd_rows, ql_seq_rows, ql_same_seg, ql_same_page, ql_same_parent, ql_thread_clocks, ql_disk_wait_clocks, ql_cl_wait_clocks, ql_pg_wait_clocks,
    ql_disk_reads, ql_spec_disk_reads, ql_messages, ql_message_bytes, ql_qp_threads, ql_memory, ql_memory_max, ql_c_memory,
    ql_lock_waits, ql_lock_wait_msec, ql_rows_affected int;


  result_names (ql_id, ql_start_dt, ql_rt_msec, ql_rt_clocks, ql_client_ip, ql_user, ql_sqlstate, ql_error,
		ql_swap, ql_user_cpu, ql_sys_cpu,

		ql_text, ql_params, ql_plan_hash,

		ql_c_clocks, ql_c_msec, ql_c_disk_reads, ql_c_disk_wait, ql_c_cl_wait, ql_cl_messages, ql_c_rnd_rows,

		ql_rnd_rows, ql_seq_rows, ql_same_seg, ql_same_page, ql_same_parent, ql_thread_clocks, ql_disk_wait_clocks, ql_cl_wait_clocks, ql_pg_wait_clocks,
ql_disk_reads, ql_spec_disk_reads, ql_messages, ql_message_bytes, ql_qp_threads, ql_memory, ql_memory_max,
		ql_lock_waits, ql_lock_wait_msec,
		ql_plan, ql_node_stat, ql_c_memory, ql_rows_affected);

  if (qrl_file is null)
  qrl_file := 'virtuoso.qrl';
  ses := file_open (qrl_file);
  for (;;)
    {
    arr := read_object (ses);
      if (0 = isarray (arr))
	goto done;
      if (qrl_start is not null and qrl_start > arr[1])
	goto next;
      if (qrl_end is not null and qrl_end < arr[1])
	goto done;
      result (arr[0], arr[1], arr[2], arr[3], arr[4], arr[5], arr[6], arr[7], arr[8], arr[9],
	      arr[10], arr[11], arr[12], arr[13], arr[14], arr[15], arr[16], arr[17], arr[18], arr[19],
	      arr[20], arr[21], arr[22], arr[23], arr[24], arr[25], arr[26], arr[27], arr[28], arr[29],
	      arr[30], arr[31], arr[32], arr[33], arr[34], arr[35], arr[36], arr[37], arr[38], arr[39],
	      arr[40], arr[41], arr[42]);
  next: ;
    }

 done:
  return;
}
;

create procedure ql_node_pv ()
{
  declare qn_type varchar;
  declare qn_ql_id, qn_node, qn_n_in, qn_n_out, qn_clocks int;
    result_names (qn_ql_id, qn_node, qn_type, qn_n_in, qn_n_out, qn_clocks);
}
;

create procedure view SYS_QUERY_LOG as sys_query_log_pv (qrl_file, qrl_start_dt, qrl_end_dt)
     (ql_id bigint, ql_start_dt datetime, ql_rt_msec bigint, ql_rt_clocks bigint, ql_client_ip varchar, ql_user varchar, ql_sqlstate varchar, ql_error varchar,
      ql_swap bigint, ql_user_cpu bigint, ql_sys_cpu bigint,

      ql_text long varchar, ql_params any, ql_plan_hash bigint,

      ql_c_clocks bigint, ql_c_msec bigint, ql_c_disk_reads bigint, ql_c_disk_wait bigint, ql_c_cl_wait bigint, ql_cl_messages bigint, ql_c_rnd_rows bigint,

		ql_rnd_rows bigint, ql_seq_rows bigint, ql_same_seg bigint, ql_same_page bigint, ql_same_parent bigint, ql_thread_clocks bigint, ql_disk_wait_clocks bigint, ql_cl_wait_clocks bigint, ql_pg_wait_clocks bigint,
      ql_disk_reads bigint, ql_spec_disk_reads bigint, ql_messages bigint, ql_message_bytes bigint, ql_qp_threads bigint, ql_memory bigint, ql_memory_max bigint,
		ql_lock_waits bigint, ql_lock_wait_msec bigint,
      ql_plan long varchar, ql_node_stat any, ql_c_memory bigint, ql_rows_affected bigint)
;


create procedure profile (in stmt varchar, in flags varchar := '', in params any := null)
{
  declare sdate datetime;
  declare st, msg,  res, resd, plan any;
  declare e_clocks, rt_msec, rt_clocks,
    rnd_rows, seq_rows, same_seg, same_page, same_parent, thread_clocks, disk_wait_clocks, cl_wait_clocks, pg_wait_clocks,
    disk_reads, spec_disk_reads, messages, message_bytes, qp_threads, memory, memory_max int;
  declare c_clocks , c_msec , c_disk_reads , c_disk_wait , c_cl_wait , cl_messages int;
  prof_enable (1);
  sdate := curdatetime ();
  if (params is null) params := vector ();
  st := '00000';
  e_clocks := rdtsc ();
  exec (stmt, st, msg, params, 20, resd, res);
  e_clocks := rdtsc () - e_clocks;
  prof_enable (0);

  select top 1 ql_rt_msec, ql_rt_clocks, ql_plan,
    ql_rnd_rows, ql_seq_rows, ql_same_seg, ql_same_page, ql_same_parent, ql_thread_clocks, ql_disk_wait_clocks, ql_cl_wait_clocks, ql_pg_wait_clocks,
    ql_disk_reads, ql_spec_disk_reads, ql_messages, ql_message_bytes, ql_qp_threads, ql_memory, ql_memory_max,
    ql_c_clocks , ql_c_msec , ql_c_disk_reads , ql_c_disk_wait , ql_c_cl_wait , ql_cl_messages

    into rt_msec, rt_clocks,  plan,
    rnd_rows, seq_rows, same_seg, same_page, same_parent, thread_clocks, disk_wait_clocks, cl_wait_clocks, pg_wait_clocks,
    disk_reads, spec_disk_reads, messages, message_bytes, qp_threads, memory, memory_max,
    c_clocks , c_msec , c_disk_reads , c_disk_wait , c_cl_wait , cl_messages
from sys_query_log where qrl_start_dt = sdate order by ql_start_dt;

  declare result long varchar;
  declare strses, row1 any;
  declare c, r int;
 strses := string_output ();
  result_names (result);
  if (st <> '00000')
    result (sprintf ('Error: %s: %s', st, msg));
  if (isarray (res))
    {
      for (r := 0; r < length (res); r := r + 1)
	{
	row1 := res[r];
	  for (c := 0; c < length (row1); c := c + 1)
	    {
	      {declare exit handler for sqlstate '*' 
						   { http_value ('***', 0, strses); };
		http_value (row1[c], 0, strses);
	      };
	      http ('\t', strses );
	    }
	  http ('\n', strses);
    }
      result (string_output_string (strses));
    }
  result (plan);
  strses := string_output ();
  result (sprintf ('\n %d msec %d%% cpu, %9.6g rnd %9.6g seq %9.6g%% same seg %9.6g%% same pg ', 
      rt_msec, 
      case e_clocks when 0 then -1 else thread_clocks * 100.0 / e_clocks end, 
      rnd_rows, 
      seq_rows, 
      (100.0 * same_seg) / (rnd_rows + 1), 
      (100.0 * same_page) / (1 + rnd_rows)
      ));
  if (disk_reads)
    result (sprintf ('%d disk reads, %d read ahead, %9.6g%% wait', 
	disk_reads, 
	spec_disk_reads, 
	case e_clocks when 0 then -1 else 100.0 * disk_wait_clocks / e_clocks end
	));
  if (messages)
    result (sprintf (' %d messages %9.6g bytes/m, %9.2g%% clw', 
    	messages, 
	message_bytes / messages, 
	case e_clocks when 0 then -1 else cl_wait_clocks * 100.0 / e_clocks end
	));
  result (sprintf ('Compilation: %d msec %d reads %9.6g%% read %d messages %9.6g%% clw', 
  	c_msec, 
	c_disk_reads, 
	case e_clocks when 0 then -1 else 100.0 * c_disk_wait / e_clocks end,  
	cl_messages, 
	case e_clocks when 0 then -1 else 100.0 * c_cl_wait  / e_clocks end
	));
}
;