gooderp18绿色标准版
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

300 行
25KB

  1. <?xml version="1.0" encoding="UTF-8" standalone="no"?>
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>F.29. pg_stat_statements</title><link rel="stylesheet" type="text/css" href="stylesheet.css" /><link rev="made" href="pgsql-docs@lists.postgresql.org" /><meta name="generator" content="DocBook XSL Stylesheets V1.79.1" /><link rel="prev" href="pgrowlocks.html" title="F.28. pgrowlocks" /><link rel="next" href="pgstattuple.html" title="F.30. pgstattuple" /></head><body><div xmlns="http://www.w3.org/TR/xhtml1/transitional" class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="5" align="center">F.29. pg_stat_statements</th></tr><tr><td width="10%" align="left"><a accesskey="p" href="pgrowlocks.html" title="F.28. pgrowlocks">Prev</a> </td><td width="10%" align="left"><a accesskey="u" href="contrib.html" title="Appendix F. Additional Supplied Modules">Up</a></td><th width="60%" align="center">Appendix F. Additional Supplied Modules</th><td width="10%" align="right"><a accesskey="h" href="index.html" title="PostgreSQL 12.4 Documentation">Home</a></td><td width="10%" align="right"> <a accesskey="n" href="pgstattuple.html" title="F.30. pgstattuple">Next</a></td></tr></table><hr></hr></div><div class="sect1" id="PGSTATSTATEMENTS"><div class="titlepage"><div><div><h2 class="title" style="clear: both">F.29. pg_stat_statements</h2></div></div></div><div class="toc"><dl class="toc"><dt><span class="sect2"><a href="pgstatstatements.html#id-1.11.7.38.6">F.29.1. The <code class="structname">pg_stat_statements</code> View</a></span></dt><dt><span class="sect2"><a href="pgstatstatements.html#id-1.11.7.38.7">F.29.2. Functions</a></span></dt><dt><span class="sect2"><a href="pgstatstatements.html#id-1.11.7.38.8">F.29.3. Configuration Parameters</a></span></dt><dt><span class="sect2"><a href="pgstatstatements.html#id-1.11.7.38.9">F.29.4. Sample Output</a></span></dt><dt><span class="sect2"><a href="pgstatstatements.html#id-1.11.7.38.10">F.29.5. Authors</a></span></dt></dl></div><a id="id-1.11.7.38.2" class="indexterm"></a><p>
  3. The <code class="filename">pg_stat_statements</code> module provides a means for
  4. tracking execution statistics of all SQL statements executed by a server.
  5. </p><p>
  6. The module must be loaded by adding <code class="literal">pg_stat_statements</code> to
  7. <a class="xref" href="runtime-config-client.html#GUC-SHARED-PRELOAD-LIBRARIES">shared_preload_libraries</a> in
  8. <code class="filename">postgresql.conf</code>, because it requires additional shared memory.
  9. This means that a server restart is needed to add or remove the module.
  10. </p><p>
  11. When <code class="filename">pg_stat_statements</code> is loaded, it tracks
  12. statistics across all databases of the server. To access and manipulate
  13. these statistics, the module provides a view, <code class="structname">pg_stat_statements</code>,
  14. and the utility functions <code class="function">pg_stat_statements_reset</code> and
  15. <code class="function">pg_stat_statements</code>. These are not available globally but
  16. can be enabled for a specific database with
  17. <code class="command">CREATE EXTENSION pg_stat_statements</code>.
  18. </p><div class="sect2" id="id-1.11.7.38.6"><div class="titlepage"><div><div><h3 class="title">F.29.1. The <code class="structname">pg_stat_statements</code> View</h3></div></div></div><p>
  19. The statistics gathered by the module are made available via a
  20. view named <code class="structname">pg_stat_statements</code>. This view
  21. contains one row for each distinct database ID, user ID and query
  22. ID (up to the maximum number of distinct statements that the module
  23. can track). The columns of the view are shown in
  24. <a class="xref" href="pgstatstatements.html#PGSTATSTATEMENTS-COLUMNS" title="Table F.21. pg_stat_statements Columns">Table F.21</a>.
  25. </p><div class="table" id="PGSTATSTATEMENTS-COLUMNS"><p class="title"><strong>Table F.21. <code class="structname">pg_stat_statements</code> Columns</strong></p><div class="table-contents"><table class="table" summary="pg_stat_statements Columns" border="1"><colgroup><col /><col /><col /><col /></colgroup><thead><tr><th>Name</th><th>Type</th><th>References</th><th>Description</th></tr></thead><tbody><tr><td><code class="structfield">userid</code></td><td><code class="type">oid</code></td><td><code class="literal"><a class="link" href="catalog-pg-authid.html" title="51.8. pg_authid"><code class="structname">pg_authid</code></a>.oid</code></td><td>OID of user who executed the statement</td></tr><tr><td><code class="structfield">dbid</code></td><td><code class="type">oid</code></td><td><code class="literal"><a class="link" href="catalog-pg-database.html" title="51.15. pg_database"><code class="structname">pg_database</code></a>.oid</code></td><td>OID of database in which the statement was executed</td></tr><tr><td><code class="structfield">queryid</code></td><td><code class="type">bigint</code></td><td> </td><td>Internal hash code, computed from the statement's parse tree</td></tr><tr><td><code class="structfield">query</code></td><td><code class="type">text</code></td><td> </td><td>Text of a representative statement</td></tr><tr><td><code class="structfield">calls</code></td><td><code class="type">bigint</code></td><td> </td><td>Number of times executed</td></tr><tr><td><code class="structfield">total_time</code></td><td><code class="type">double precision</code></td><td> </td><td>Total time spent in the statement, in milliseconds</td></tr><tr><td><code class="structfield">min_time</code></td><td><code class="type">double precision</code></td><td> </td><td>Minimum time spent in the statement, in milliseconds</td></tr><tr><td><code class="structfield">max_time</code></td><td><code class="type">double precision</code></td><td> </td><td>Maximum time spent in the statement, in milliseconds</td></tr><tr><td><code class="structfield">mean_time</code></td><td><code class="type">double precision</code></td><td> </td><td>Mean time spent in the statement, in milliseconds</td></tr><tr><td><code class="structfield">stddev_time</code></td><td><code class="type">double precision</code></td><td> </td><td>Population standard deviation of time spent in the statement, in milliseconds</td></tr><tr><td><code class="structfield">rows</code></td><td><code class="type">bigint</code></td><td> </td><td>Total number of rows retrieved or affected by the statement</td></tr><tr><td><code class="structfield">shared_blks_hit</code></td><td><code class="type">bigint</code></td><td> </td><td>Total number of shared block cache hits by the statement</td></tr><tr><td><code class="structfield">shared_blks_read</code></td><td><code class="type">bigint</code></td><td> </td><td>Total number of shared blocks read by the statement</td></tr><tr><td><code class="structfield">shared_blks_dirtied</code></td><td><code class="type">bigint</code></td><td> </td><td>Total number of shared blocks dirtied by the statement</td></tr><tr><td><code class="structfield">shared_blks_written</code></td><td><code class="type">bigint</code></td><td> </td><td>Total number of shared blocks written by the statement</td></tr><tr><td><code class="structfield">local_blks_hit</code></td><td><code class="type">bigint</code></td><td> </td><td>Total number of local block cache hits by the statement</td></tr><tr><td><code class="structfield">local_blks_read</code></td><td><code class="type">bigint</code></td><td> </td><td>Total number of local blocks read by the statement</td></tr><tr><td><code class="structfield">local_blks_dirtied</code></td><td><code class="type">bigint</code></td><td> </td><td>Total number of local blocks dirtied by the statement</td></tr><tr><td><code class="structfield">local_blks_written</code></td><td><code class="type">bigint</code></td><td> </td><td>Total number of local blocks written by the statement</td></tr><tr><td><code class="structfield">temp_blks_read</code></td><td><code class="type">bigint</code></td><td> </td><td>Total number of temp blocks read by the statement</td></tr><tr><td><code class="structfield">temp_blks_written</code></td><td><code class="type">bigint</code></td><td> </td><td>Total number of temp blocks written by the statement</td></tr><tr><td><code class="structfield">blk_read_time</code></td><td><code class="type">double precision</code></td><td> </td><td>
  26. Total time the statement spent reading blocks, in milliseconds
  27. (if <a class="xref" href="runtime-config-statistics.html#GUC-TRACK-IO-TIMING">track_io_timing</a> is enabled, otherwise zero)
  28. </td></tr><tr><td><code class="structfield">blk_write_time</code></td><td><code class="type">double precision</code></td><td> </td><td>
  29. Total time the statement spent writing blocks, in milliseconds
  30. (if <a class="xref" href="runtime-config-statistics.html#GUC-TRACK-IO-TIMING">track_io_timing</a> is enabled, otherwise zero)
  31. </td></tr></tbody></table></div></div><br class="table-break" /><p>
  32. For security reasons, only superusers and members of the
  33. <code class="literal">pg_read_all_stats</code> role are allowed to see the SQL text and
  34. <code class="structfield">queryid</code> of queries executed by other users.
  35. Other users can see the statistics, however, if the view has been installed
  36. in their database.
  37. </p><p>
  38. Plannable queries (that is, <code class="command">SELECT</code>, <code class="command">INSERT</code>,
  39. <code class="command">UPDATE</code>, and <code class="command">DELETE</code>) are combined into a single
  40. <code class="structname">pg_stat_statements</code> entry whenever they have identical query
  41. structures according to an internal hash calculation. Typically, two
  42. queries will be considered the same for this purpose if they are
  43. semantically equivalent except for the values of literal constants
  44. appearing in the query. Utility commands (that is, all other commands)
  45. are compared strictly on the basis of their textual query strings, however.
  46. </p><p>
  47. When a constant's value has been ignored for purposes of matching the query
  48. to other queries, the constant is replaced by a parameter symbol, such
  49. as <code class="literal">$1</code>, in the <code class="structname">pg_stat_statements</code>
  50. display.
  51. The rest of the query text is that of the first query that had the
  52. particular <code class="structfield">queryid</code> hash value associated with the
  53. <code class="structname">pg_stat_statements</code> entry.
  54. </p><p>
  55. In some cases, queries with visibly different texts might get merged into a
  56. single <code class="structname">pg_stat_statements</code> entry. Normally this will happen
  57. only for semantically equivalent queries, but there is a small chance of
  58. hash collisions causing unrelated queries to be merged into one entry.
  59. (This cannot happen for queries belonging to different users or databases,
  60. however.)
  61. </p><p>
  62. Since the <code class="structfield">queryid</code> hash value is computed on the
  63. post-parse-analysis representation of the queries, the opposite is
  64. also possible: queries with identical texts might appear as
  65. separate entries, if they have different meanings as a result of
  66. factors such as different <code class="varname">search_path</code> settings.
  67. </p><p>
  68. Consumers of <code class="structname">pg_stat_statements</code> may wish to use
  69. <code class="structfield">queryid</code> (perhaps in combination with
  70. <code class="structfield">dbid</code> and <code class="structfield">userid</code>) as a more stable
  71. and reliable identifier for each entry than its query text.
  72. However, it is important to understand that there are only limited
  73. guarantees around the stability of the <code class="structfield">queryid</code> hash
  74. value. Since the identifier is derived from the
  75. post-parse-analysis tree, its value is a function of, among other
  76. things, the internal object identifiers appearing in this representation.
  77. This has some counterintuitive implications. For example,
  78. <code class="filename">pg_stat_statements</code> will consider two apparently-identical
  79. queries to be distinct, if they reference a table that was dropped
  80. and recreated between the executions of the two queries.
  81. The hashing process is also sensitive to differences in
  82. machine architecture and other facets of the platform.
  83. Furthermore, it is not safe to assume that <code class="structfield">queryid</code>
  84. will be stable across major versions of <span class="productname">PostgreSQL</span>.
  85. </p><p>
  86. As a rule of thumb, <code class="structfield">queryid</code> values can be assumed to be
  87. stable and comparable only so long as the underlying server version and
  88. catalog metadata details stay exactly the same. Two servers
  89. participating in replication based on physical WAL replay can be expected
  90. to have identical <code class="structfield">queryid</code> values for the same query.
  91. However, logical replication schemes do not promise to keep replicas
  92. identical in all relevant details, so <code class="structfield">queryid</code> will
  93. not be a useful identifier for accumulating costs across a set of logical
  94. replicas. If in doubt, direct testing is recommended.
  95. </p><p>
  96. The parameter symbols used to replace constants in
  97. representative query texts start from the next number after the
  98. highest <code class="literal">$</code><em class="replaceable"><code>n</code></em> parameter in the original query
  99. text, or <code class="literal">$1</code> if there was none. It's worth noting that in
  100. some cases there may be hidden parameter symbols that affect this
  101. numbering. For example, <span class="application">PL/pgSQL</span> uses hidden parameter
  102. symbols to insert values of function local variables into queries, so that
  103. a <span class="application">PL/pgSQL</span> statement like <code class="literal">SELECT i + 1 INTO j</code>
  104. would have representative text like <code class="literal">SELECT i + $2</code>.
  105. </p><p>
  106. The representative query texts are kept in an external disk file, and do
  107. not consume shared memory. Therefore, even very lengthy query texts can
  108. be stored successfully. However, if many long query texts are
  109. accumulated, the external file might grow unmanageably large. As a
  110. recovery method if that happens, <code class="filename">pg_stat_statements</code> may
  111. choose to discard the query texts, whereupon all existing entries in
  112. the <code class="structname">pg_stat_statements</code> view will show
  113. null <code class="structfield">query</code> fields, though the statistics associated with
  114. each <code class="structfield">queryid</code> are preserved. If this happens, consider
  115. reducing <code class="varname">pg_stat_statements.max</code> to prevent
  116. recurrences.
  117. </p></div><div class="sect2" id="id-1.11.7.38.7"><div class="titlepage"><div><div><h3 class="title">F.29.2. Functions</h3></div></div></div><div class="variablelist"><dl class="variablelist"><dt><span class="term">
  118. <code class="function">pg_stat_statements_reset(userid Oid, dbid Oid, queryid bigint) returns void</code>
  119. <a id="id-1.11.7.38.7.2.1.1.2" class="indexterm"></a>
  120. </span></dt><dd><p>
  121. <code class="function">pg_stat_statements_reset</code> discards statistics
  122. gathered so far by <code class="filename">pg_stat_statements</code> corresponding
  123. to the specified <code class="structfield">userid</code>, <code class="structfield">dbid</code>
  124. and <code class="structfield">queryid</code>. If any of the parameters are not
  125. specified, the default value <code class="literal">0</code>(invalid) is used for
  126. each of them and the statistics that match with other parameters will be
  127. reset. If no parameter is specified or all the specified parameters are
  128. <code class="literal">0</code>(invalid), it will discard all statistics. By
  129. default, this function can only be executed by superusers. Access may be
  130. granted to others using <code class="command">GRANT</code>.
  131. </p></dd><dt><span class="term">
  132. <code class="function">pg_stat_statements(showtext boolean) returns setof record</code>
  133. <a id="id-1.11.7.38.7.2.2.1.2" class="indexterm"></a>
  134. </span></dt><dd><p>
  135. The <code class="structname">pg_stat_statements</code> view is defined in
  136. terms of a function also named <code class="function">pg_stat_statements</code>.
  137. It is possible for clients to call
  138. the <code class="function">pg_stat_statements</code> function directly, and by
  139. specifying <code class="literal">showtext := false</code> have query text be
  140. omitted (that is, the <code class="literal">OUT</code> argument that corresponds
  141. to the view's <code class="structfield">query</code> column will return nulls). This
  142. feature is intended to support external tools that might wish to avoid
  143. the overhead of repeatedly retrieving query texts of indeterminate
  144. length. Such tools can instead cache the first query text observed
  145. for each entry themselves, since that is
  146. all <code class="filename">pg_stat_statements</code> itself does, and then retrieve
  147. query texts only as needed. Since the server stores query texts in a
  148. file, this approach may reduce physical I/O for repeated examination
  149. of the <code class="structname">pg_stat_statements</code> data.
  150. </p></dd></dl></div></div><div class="sect2" id="id-1.11.7.38.8"><div class="titlepage"><div><div><h3 class="title">F.29.3. Configuration Parameters</h3></div></div></div><div class="variablelist"><dl class="variablelist"><dt><span class="term">
  151. <code class="varname">pg_stat_statements.max</code> (<code class="type">integer</code>)
  152. </span></dt><dd><p>
  153. <code class="varname">pg_stat_statements.max</code> is the maximum number of
  154. statements tracked by the module (i.e., the maximum number of rows
  155. in the <code class="structname">pg_stat_statements</code> view). If more distinct
  156. statements than that are observed, information about the least-executed
  157. statements is discarded.
  158. The default value is 5000.
  159. This parameter can only be set at server start.
  160. </p></dd><dt><span class="term">
  161. <code class="varname">pg_stat_statements.track</code> (<code class="type">enum</code>)
  162. </span></dt><dd><p>
  163. <code class="varname">pg_stat_statements.track</code> controls which statements
  164. are counted by the module.
  165. Specify <code class="literal">top</code> to track top-level statements (those issued
  166. directly by clients), <code class="literal">all</code> to also track nested statements
  167. (such as statements invoked within functions), or <code class="literal">none</code> to
  168. disable statement statistics collection.
  169. The default value is <code class="literal">top</code>.
  170. Only superusers can change this setting.
  171. </p></dd><dt><span class="term">
  172. <code class="varname">pg_stat_statements.track_utility</code> (<code class="type">boolean</code>)
  173. </span></dt><dd><p>
  174. <code class="varname">pg_stat_statements.track_utility</code> controls whether
  175. utility commands are tracked by the module. Utility commands are
  176. all those other than <code class="command">SELECT</code>, <code class="command">INSERT</code>,
  177. <code class="command">UPDATE</code> and <code class="command">DELETE</code>.
  178. The default value is <code class="literal">on</code>.
  179. Only superusers can change this setting.
  180. </p></dd><dt><span class="term">
  181. <code class="varname">pg_stat_statements.save</code> (<code class="type">boolean</code>)
  182. </span></dt><dd><p>
  183. <code class="varname">pg_stat_statements.save</code> specifies whether to
  184. save statement statistics across server shutdowns.
  185. If it is <code class="literal">off</code> then statistics are not saved at
  186. shutdown nor reloaded at server start.
  187. The default value is <code class="literal">on</code>.
  188. This parameter can only be set in the <code class="filename">postgresql.conf</code>
  189. file or on the server command line.
  190. </p></dd></dl></div><p>
  191. The module requires additional shared memory proportional to
  192. <code class="varname">pg_stat_statements.max</code>. Note that this
  193. memory is consumed whenever the module is loaded, even if
  194. <code class="varname">pg_stat_statements.track</code> is set to <code class="literal">none</code>.
  195. </p><p>
  196. These parameters must be set in <code class="filename">postgresql.conf</code>.
  197. Typical usage might be:
  198. </p><pre class="programlisting">
  199. # postgresql.conf
  200. shared_preload_libraries = 'pg_stat_statements'
  201. pg_stat_statements.max = 10000
  202. pg_stat_statements.track = all
  203. </pre><p>
  204. </p></div><div class="sect2" id="id-1.11.7.38.9"><div class="titlepage"><div><div><h3 class="title">F.29.4. Sample Output</h3></div></div></div><pre class="screen">
  205. bench=# SELECT pg_stat_statements_reset();
  206. $ pgbench -i bench
  207. $ pgbench -c10 -t300 bench
  208. bench=# \x
  209. bench=# SELECT query, calls, total_time, rows, 100.0 * shared_blks_hit /
  210. nullif(shared_blks_hit + shared_blks_read, 0) AS hit_percent
  211. FROM pg_stat_statements ORDER BY total_time DESC LIMIT 5;
  212. -[ RECORD 1 ]--------------------------------------------------------------------
  213. query | UPDATE pgbench_branches SET bbalance = bbalance + $1 WHERE bid = $2
  214. calls | 3000
  215. total_time | 25565.855387
  216. rows | 3000
  217. hit_percent | 100.0000000000000000
  218. -[ RECORD 2 ]--------------------------------------------------------------------
  219. query | UPDATE pgbench_tellers SET tbalance = tbalance + $1 WHERE tid = $2
  220. calls | 3000
  221. total_time | 20756.669379
  222. rows | 3000
  223. hit_percent | 100.0000000000000000
  224. -[ RECORD 3 ]--------------------------------------------------------------------
  225. query | copy pgbench_accounts from stdin
  226. calls | 1
  227. total_time | 291.865911
  228. rows | 100000
  229. hit_percent | 100.0000000000000000
  230. -[ RECORD 4 ]--------------------------------------------------------------------
  231. query | UPDATE pgbench_accounts SET abalance = abalance + $1 WHERE aid = $2
  232. calls | 3000
  233. total_time | 271.232977
  234. rows | 3000
  235. hit_percent | 98.5723926698852723
  236. -[ RECORD 5 ]--------------------------------------------------------------------
  237. query | alter table pgbench_accounts add primary key (aid)
  238. calls | 1
  239. total_time | 160.588563
  240. rows | 0
  241. hit_percent | 100.0000000000000000
  242. bench=# SELECT pg_stat_statements_reset(0,0,s.queryid) FROM pg_stat_statements AS s
  243. WHERE s.query = 'UPDATE pgbench_branches SET bbalance = bbalance + $1 WHERE bid = $2';
  244. bench=# SELECT query, calls, total_time, rows, 100.0 * shared_blks_hit /
  245. nullif(shared_blks_hit + shared_blks_read, 0) AS hit_percent
  246. FROM pg_stat_statements ORDER BY total_time DESC LIMIT 5;
  247. -[ RECORD 1 ]--------------------------------------------------------------------
  248. query | UPDATE pgbench_tellers SET tbalance = tbalance + $1 WHERE tid = $2
  249. calls | 3000
  250. total_time | 20756.669379
  251. rows | 3000
  252. hit_percent | 100.0000000000000000
  253. -[ RECORD 2 ]--------------------------------------------------------------------
  254. query | copy pgbench_accounts from stdin
  255. calls | 1
  256. total_time | 291.865911
  257. rows | 100000
  258. hit_percent | 100.0000000000000000
  259. -[ RECORD 3 ]--------------------------------------------------------------------
  260. query | UPDATE pgbench_accounts SET abalance = abalance + $1 WHERE aid = $2
  261. calls | 3000
  262. total_time | 271.232977
  263. rows | 3000
  264. hit_percent | 98.5723926698852723
  265. -[ RECORD 4 ]--------------------------------------------------------------------
  266. query | alter table pgbench_accounts add primary key (aid)
  267. calls | 1
  268. total_time | 160.588563
  269. rows | 0
  270. hit_percent | 100.0000000000000000
  271. -[ RECORD 5 ]--------------------------------------------------------------------
  272. query | vacuum analyze pgbench_accounts
  273. calls | 1
  274. total_time | 136.448116
  275. rows | 0
  276. hit_percent | 99.9201915403032721
  277. bench=# SELECT pg_stat_statements_reset(0,0,0);
  278. bench=# SELECT query, calls, total_time, rows, 100.0 * shared_blks_hit /
  279. nullif(shared_blks_hit + shared_blks_read, 0) AS hit_percent
  280. FROM pg_stat_statements ORDER BY total_time DESC LIMIT 5;
  281. -[ RECORD 1 ]---------------------------------------
  282. query | SELECT pg_stat_statements_reset(0,0,0)
  283. calls | 1
  284. total_time | 0.189497
  285. rows | 1
  286. hit_percent |
  287. </pre></div><div class="sect2" id="id-1.11.7.38.10"><div class="titlepage"><div><div><h3 class="title">F.29.5. Authors</h3></div></div></div><p>
  288. Takahiro Itagaki <code class="email">&lt;<a class="email" href="mailto:itagaki.takahiro@oss.ntt.co.jp">itagaki.takahiro@oss.ntt.co.jp</a>&gt;</code>.
  289. Query normalization added by Peter Geoghegan <code class="email">&lt;<a class="email" href="mailto:peter@2ndquadrant.com">peter@2ndquadrant.com</a>&gt;</code>.
  290. </p></div></div><div class="navfooter"><hr /><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="pgrowlocks.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="contrib.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="pgstattuple.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">F.28. pgrowlocks </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> F.30. pgstattuple</td></tr></table></div></body></html>
上海开阖软件有限公司 沪ICP备12045867号-1