注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

PostgreSQL 中文网

 
 
 

日志

 
 

A very strange SQL of PostgreSQL  

2011-03-28 18:23:54|  分类: Postgres基础 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

      

           今天这篇贴子讲述的问题我以前也遇到过,只因发生在一测试环境下,所以没有深究,今天在一生产
环境下也遇到了这个问题,所以应该重视了,这个问题困扰了我一阵子,事情是这样的,在生产库上有一
个 SQL 非常奇怪,从SQL语句来看,很像是PostgreSQL SERVER 内部执行的,可事实却不是,下面看下今天
的分析步骤。


--1 连接到数据库里查询
postgres=# select procpid,datname,client_addr,client_port,current_query from pg_stat_activity where current_query !='<IDLE>';
   25858 | uims      | XXX.XXX.XXX.XXX |       57791 | SELECT NULL AS TABLE_CAT, n.nspname AS TABLE_SCHEM, c.relname AS TABLE_NAME, 
CASE n.nspname ~ '^pg_' OR n.nspname = 'information_schema'  WHEN true THEN CASE  WHEN n.nspname = 'pg_catalog' OR n.nspname = 'info
rmation_schema' THEN CASE c.relkind   WHEN 'r' THEN 'SYSTEM TABLE'   WHEN 'v' THEN 'SYSTEM VIEW'   WHEN 'i' THEN 'SYSTEM INDEX'   EL
SE NULL   END  WHEN n.nspname = 'pg_toast' THEN CASE c.relkind   WHEN 'r' THEN 'SYSTEM TOAST TABLE'   WHEN 'i' THEN 'SYSTEM TOAST IN
DEX'   ELSE NULL   END  ELSE CASE c.relkind   WHEN 'r' THEN 'TEMPORARY TABLE'   WHEN 'i' THEN 'TEMPORARY INDEX'   ELSE NULL   END  E
ND  WHEN false THEN CASE c.relkind  WHEN 'r' THEN 'TABLE'  WHEN 'i' THEN 'INDEX'  WHEN 'S' THEN 'SEQUENCE'  WHEN 'v' THEN 'VIEW'  EL
SE NULL  END  ELSE NULL  END  AS TABLE_TYPE, d.description AS REMARKS  FROM pg_catalog.pg_namespace n, pg_catalog.pg_class c  LEFT J
OIN pg_catalog.pg_description d ON (c.oid = d.objoid AND d.objsubid = 0)  LEFT JOIN pg_catalog.pg_class dc ON (d.classoid=dc.oid AND
 dc.relname='pg_class')
 
           这个SQL看上去像PostgreSQL SERVER发出的系统维护SQL,但找不出是什么进程,后来根据 client_addr咨询了
下应用人员,回复说这是 APPLICATION 机器, 难道这个SQL是应用程序发出?

--2 格式化下 sql   
SELECT NULL AS TABLE_CAT,
       n.nspname AS TABLE_SCHEM,
       c.relname AS TABLE_NAME, 
       CASE n.nspname ~ '^pg_' OR n.nspname = 'information_schema' 
          WHEN true THEN
            CASE
               WHEN n.nspname = 'pg_catalog' OR n.nspname = 'information_schema' THEN
                 CASE c.relkind  
                   WHEN 'r' THEN 'SYSTEM TABLE'  
                   WHEN 'v' THEN 'SYSTEM VIEW'  
                   WHEN 'i' THEN 'SYSTEM INDEX'  
                   ELSE NULL  
                 END 
               WHEN n.nspname = 'pg_toast' THEN
                 CASE c.relkind
                   WHEN 'r' THEN 'SYSTEM TOAST TABLE'  
                   WHEN 'i' THEN 'SYSTEM TOAST INDEX'  
                   ELSE NULL  
                 END 
               ELSE
                 CASE c.relkind  
                   WHEN 'r' THEN 'TEMPORARY TABLE'  
                   WHEN 'i' THEN 'TEMPORARY INDEX'  
                   ELSE NULL  
                 END 
             END 
             WHEN false THEN
               CASE c.relkind 
                 WHEN 'r' THEN 'TABLE' 
                 WHEN 'i' THEN 'INDEX' 
                 WHEN 'S' THEN 'SEQUENCE' 
                 WHEN 'v' THEN 'VIEW' 
                 ELSE NULL 
               END 
             ELSE NULL 
           END  AS TABLE_TYPE,
           d.description AS REMARKS 
      FROM pg_catalog.pg_namespace n,
           pg_catalog.pg_class c 
 LEFT JOIN pg_catalog.pg_description d ON (c.oid = d.objoid
                                      AND d.objsubid = 0) 
 LEFT JOIN pg_catalog.pg_class dc ON (d.classoid = dc.oid  AND dc.relname='pg_class');

--3 执行这个SQL, 取一条数据
 table_cat | table_schem |            table_name             |     table_type     | remarks
-----------+-------------+-----------------------------------+--------------------+---------
           | pg_toast    | pg_foreign_data_wrapper_oid_index | SYSTEM TOAST INDEX |
(1 row)
      这个SQL执行很快,毫秒级,从查询结果来看,应该是查 TABLE 列表。

--4 国外PostgreSQL社区论坛发贴求助
    实在找不出什么原因,后来在国外 PostgreSQL 社区论坛发贴,从上面的解释终于得到了答案。

   解释: 1 后来在一国外论坛上发贴,上面回复说这个SQL是 PostgreSQL JDBC driver 发出的一个
               getTables()函数,原文如下 :It is part of the getTables() implementation in the
              postgresql JDBC driver.
          
         2   后来也咨询了下我们的开发人员,也解释说这是 PostgreSQL JDBC driver 发出的函数,
              用来获取TABLE列表,这个函数在连接进程空闲时会执行,也可以通过配置JDBC配置,
              禁止执行这函数。
        

  评论这张
 
阅读(26012)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016