为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。 【DM版本】:8 【操作系统】:win10 【CPU】: 【问题描述】*:类似oracle,怎么通过dba_tab_columns.hight_value列查询一批表对应列的最大值,目前统计收集的结果都是空,无法获取
如果已经收集了统计信息,可以在 SYSSTATS 表中查看 T_FLAG = 'C' 的记录,其中 V_MIN,V_MAX 两个字段是统计出的该字段最大最小值,通过 ID列能得到对应表名,COLID列得到对应列名。 或者,调用 DBMS_STATS.COLUMN_STATS_SHOW 过程来查看列统计信息及直方图。
不过我觉得用过程查起来不方便,刚写了个测试的查询,你可以试一下,看看是否满足需求
SELECT USR.NAME AS OWNER_NAME ,SCH.NAME AS SCHEMA_NAME ,TAB.NAME AS TABLE_NAME ,COL.NAME AS COLUMN_NAME ,COL.TYPE$ AS COLUMN_TYPE ,COL.COLID AS COLUMN_ID ,CASE COL.TYPE$ WHEN 'NUMBER' THEN ROUND(CAST(SF_BIN_GET_DOUBLE(S.V_MIN,0) AS NUMBER),COL.SCALE) WHEN 'INT' THEN SF_BIN_GET_INT(S.V_MIN,0) WHEN 'INTEGER' THEN SF_BIN_GET_INT(S.V_MIN,0) WHEN 'BIGINT' THEN SF_BIN_GET_BIGINT(S.V_MIN,0) WHEN 'SMALLINT' THEN SF_BIN_GET_SMALLINT(S.V_MIN,0) WHEN 'TINYINT' THEN SF_BIN_GET_TINYINT(S.V_MIN,0) WHEN 'CHAR' THEN BINTOCHAR2(S.V_MIN) WHEN 'NCHAR' THEN BINTOCHAR2(S.V_MIN) WHEN 'NVARCHAR' THEN BINTOCHAR2(S.V_MIN) WHEN 'NVARCHAR2' THEN BINTOCHAR2(S.V_MIN) WHEN 'VARCHAR2' THEN BINTOCHAR2(S.V_MIN) WHEN 'VARCHAR' THEN BINTOCHAR2(S.V_MIN) WHEN 'VARBINARY' THEN NVL2(S.V_MIN,'0x'||RAWTOHEX(SUBSTRBLB(S.V_MIN,5,SF_BIN_GET_INT(S.V_MIN,0))),NULL) WHEN 'DATE' THEN TO_CHAR(BINTODATE(S.V_MIN),'yyyy-mm-dd') WHEN 'DATETIME' THEN TO_CHAR(BINTODATE(S.V_MIN),'yyyy-mm-dd hh24:mi:ss') WHEN 'DATETIME WITH TIME ZONE' THEN TO_CHAR(BINTODATE(S.V_MIN),'yyyy-mm-dd hh24:mi:ss TZH:TZM') WHEN 'TIMESTAMP' THEN TO_CHAR(BINTODATE(S.V_MIN),'yyyy-mm-dd hh24:mi:ss.ff6') ELSE RAWTOHEX(S.V_MIN) END AS VALUE_MIN ,CASE COL.TYPE$ WHEN 'NUMBER' THEN ROUND(CAST(SF_BIN_GET_DOUBLE(S.V_MAX,0) AS NUMBER),COL.SCALE) WHEN 'INT' THEN SF_BIN_GET_INT(S.V_MAX,0) WHEN 'INTEGER' THEN SF_BIN_GET_INT(S.V_MAX,0) WHEN 'BIGINT' THEN SF_BIN_GET_BIGINT(S.V_MAX,0) WHEN 'SMALLINT' THEN SF_BIN_GET_SMALLINT(S.V_MAX,0) WHEN 'TINYINT' THEN SF_BIN_GET_TINYINT(S.V_MAX,0) WHEN 'CHAR' THEN BINTOCHAR2(S.V_MAX) WHEN 'NCHAR' THEN BINTOCHAR2(S.V_MAX) WHEN 'NVARCHAR' THEN BINTOCHAR2(S.V_MAX) WHEN 'NVARCHAR2' THEN BINTOCHAR2(S.V_MAX) WHEN 'VARCHAR2' THEN BINTOCHAR2(S.V_MAX) WHEN 'VARCHAR' THEN BINTOCHAR2(S.V_MAX) WHEN 'VARBINARY' THEN NVL2(S.V_MAX,'0x'||RAWTOHEX(SUBSTRBLB(S.V_MAX,5,SF_BIN_GET_INT(S.V_MAX,0))),NULL) WHEN 'DATE' THEN TO_CHAR(BINTODATE(S.V_MAX),'yyyy-mm-dd') WHEN 'DATETIME' THEN TO_CHAR(BINTODATE(S.V_MAX),'yyyy-mm-dd hh24:mi:ss') WHEN 'DATETIME WITH TIME ZONE' THEN TO_CHAR(BINTODATE(S.V_MAX),'yyyy-mm-dd hh24:mi:ss TZH:TZM') WHEN 'TIMESTAMP' THEN TO_CHAR(BINTODATE(S.V_MAX),'yyyy-mm-dd hh24:mi:ss.ff6') ELSE RAWTOHEX(S.V_MAX) END AS VALUE_MAX ,S.T_TOTAL ,S.N_SAMPLE ,S.N_DISTINCT ,S.N_NULL ,S.COL_AVG_LEN ,S.LAST_GATHERED ,S.DATA FROM SYSSTATS S ,SYSOBJECTS TAB ,SYSCOLUMNS COL ,SYSOBJECTS SCH ,SYSOBJECTS USR WHERE S.ID = TAB.ID AND S.T_FLAG = 'C' AND COL.ID = S.ID AND COL.COLID = S.COLID AND SCH.ID = TAB.SCHID AND SCH.TYPE$ = 'SCH' AND TAB.TYPE$ = 'SCHOBJ' AND TAB.SUBTYPE$ IN ('UTAB','STAB') AND USR.TYPE$ = 'UR' AND USR.ID = SCH.PID --AND SCH.NAME = '模式名' --AND TAB.NAME = '表名' ORDER BY 1,2,3,6
如果已经收集了统计信息,可以在 SYSSTATS 表中查看 T_FLAG = 'C' 的记录,其中 V_MIN,V_MAX 两个字段是统计出的该字段最大最小值,通过 ID列能得到对应表名,COLID列得到对应列名。
或者,调用 DBMS_STATS.COLUMN_STATS_SHOW 过程来查看列统计信息及直方图。
不过我觉得用过程查起来不方便,刚写了个测试的查询,你可以试一下,看看是否满足需求
SELECT USR.NAME AS OWNER_NAME ,SCH.NAME AS SCHEMA_NAME ,TAB.NAME AS TABLE_NAME ,COL.NAME AS COLUMN_NAME ,COL.TYPE$ AS COLUMN_TYPE ,COL.COLID AS COLUMN_ID ,CASE COL.TYPE$ WHEN 'NUMBER' THEN ROUND(CAST(SF_BIN_GET_DOUBLE(S.V_MIN,0) AS NUMBER),COL.SCALE) WHEN 'INT' THEN SF_BIN_GET_INT(S.V_MIN,0) WHEN 'INTEGER' THEN SF_BIN_GET_INT(S.V_MIN,0) WHEN 'BIGINT' THEN SF_BIN_GET_BIGINT(S.V_MIN,0) WHEN 'SMALLINT' THEN SF_BIN_GET_SMALLINT(S.V_MIN,0) WHEN 'TINYINT' THEN SF_BIN_GET_TINYINT(S.V_MIN,0) WHEN 'CHAR' THEN BINTOCHAR2(S.V_MIN) WHEN 'NCHAR' THEN BINTOCHAR2(S.V_MIN) WHEN 'NVARCHAR' THEN BINTOCHAR2(S.V_MIN) WHEN 'NVARCHAR2' THEN BINTOCHAR2(S.V_MIN) WHEN 'VARCHAR2' THEN BINTOCHAR2(S.V_MIN) WHEN 'VARCHAR' THEN BINTOCHAR2(S.V_MIN) WHEN 'VARBINARY' THEN NVL2(S.V_MIN,'0x'||RAWTOHEX(SUBSTRBLB(S.V_MIN,5,SF_BIN_GET_INT(S.V_MIN,0))),NULL) WHEN 'DATE' THEN TO_CHAR(BINTODATE(S.V_MIN),'yyyy-mm-dd') WHEN 'DATETIME' THEN TO_CHAR(BINTODATE(S.V_MIN),'yyyy-mm-dd hh24:mi:ss') WHEN 'DATETIME WITH TIME ZONE' THEN TO_CHAR(BINTODATE(S.V_MIN),'yyyy-mm-dd hh24:mi:ss TZH:TZM') WHEN 'TIMESTAMP' THEN TO_CHAR(BINTODATE(S.V_MIN),'yyyy-mm-dd hh24:mi:ss.ff6') ELSE RAWTOHEX(S.V_MIN) END AS VALUE_MIN ,CASE COL.TYPE$ WHEN 'NUMBER' THEN ROUND(CAST(SF_BIN_GET_DOUBLE(S.V_MAX,0) AS NUMBER),COL.SCALE) WHEN 'INT' THEN SF_BIN_GET_INT(S.V_MAX,0) WHEN 'INTEGER' THEN SF_BIN_GET_INT(S.V_MAX,0) WHEN 'BIGINT' THEN SF_BIN_GET_BIGINT(S.V_MAX,0) WHEN 'SMALLINT' THEN SF_BIN_GET_SMALLINT(S.V_MAX,0) WHEN 'TINYINT' THEN SF_BIN_GET_TINYINT(S.V_MAX,0) WHEN 'CHAR' THEN BINTOCHAR2(S.V_MAX) WHEN 'NCHAR' THEN BINTOCHAR2(S.V_MAX) WHEN 'NVARCHAR' THEN BINTOCHAR2(S.V_MAX) WHEN 'NVARCHAR2' THEN BINTOCHAR2(S.V_MAX) WHEN 'VARCHAR2' THEN BINTOCHAR2(S.V_MAX) WHEN 'VARCHAR' THEN BINTOCHAR2(S.V_MAX) WHEN 'VARBINARY' THEN NVL2(S.V_MAX,'0x'||RAWTOHEX(SUBSTRBLB(S.V_MAX,5,SF_BIN_GET_INT(S.V_MAX,0))),NULL) WHEN 'DATE' THEN TO_CHAR(BINTODATE(S.V_MAX),'yyyy-mm-dd') WHEN 'DATETIME' THEN TO_CHAR(BINTODATE(S.V_MAX),'yyyy-mm-dd hh24:mi:ss') WHEN 'DATETIME WITH TIME ZONE' THEN TO_CHAR(BINTODATE(S.V_MAX),'yyyy-mm-dd hh24:mi:ss TZH:TZM') WHEN 'TIMESTAMP' THEN TO_CHAR(BINTODATE(S.V_MAX),'yyyy-mm-dd hh24:mi:ss.ff6') ELSE RAWTOHEX(S.V_MAX) END AS VALUE_MAX ,S.T_TOTAL ,S.N_SAMPLE ,S.N_DISTINCT ,S.N_NULL ,S.COL_AVG_LEN ,S.LAST_GATHERED ,S.DATA FROM SYSSTATS S ,SYSOBJECTS TAB ,SYSCOLUMNS COL ,SYSOBJECTS SCH ,SYSOBJECTS USR WHERE S.ID = TAB.ID AND S.T_FLAG = 'C' AND COL.ID = S.ID AND COL.COLID = S.COLID AND SCH.ID = TAB.SCHID AND SCH.TYPE$ = 'SCH' AND TAB.TYPE$ = 'SCHOBJ' AND TAB.SUBTYPE$ IN ('UTAB','STAB') AND USR.TYPE$ = 'UR' AND USR.ID = SCH.PID --AND SCH.NAME = '模式名' --AND TAB.NAME = '表名' ORDER BY 1,2,3,6