为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:8.1.4
【操作系统】:Kylin V10
【CPU】:飞腾2000
【问题描述】*:
查询哪个表主键的字段名,当all_constraints和all_cons_columns的数量少时就很快。
当表数量有几万个时,这个查询就很慢。需要5秒。麻烦看看怎么优化。
SELECT column_name
FROM
all_constraints c,
all_cons_columns col
WHERE
c.constraint_name = col.constraint_name
AND c.constraint_type = 'P'
AND c.table_name = 'VC_23_TERM'
AND c.owner = 'VC_MAIN_STIES_23'
SQL> select count(*) from all_cons_columns limit 1;
LINEID COUNT(*)
---------- --------------------
1 65389
used time: 00:00:04.641. Execute id is 7384263.
SQL> select count(*) from all_constraints limit 1;
LINEID COUNT(*)
---------- --------------------
1 65271
我觉得可以更新一下系统表的统计信息
试下这个SQL,看看结果是否正确以及取数耗时情况。这个是临时写的,所以务必反复验证正确性
WITH T_CONSCOLS AS ( SELECT SCH.NAME AS OWNER ,TAB.NAME AS TABLE_NAME ,IDX.NAME AS INDEX_NAME ,CONS.NAME AS CONSTRAINT_NAME ,CONSINFO.TYPE$ AS CONSTRAINT_TYPE ,COLS.NAME AS COLUMN_NAME ,CASE WHEN CONSINFO.TYPE$ != 'C' THEN CAST(SF_GET_INDEX_KEY_SEQ(IDXINFO.KEYNUM, IDXINFO.KEYINFO, COLS.COLID) AS NUMBER(10,0)) END POSITION FROM SYSCONS CONSINFO LEFT JOIN SYSOBJECTS CONS ON CONS.TYPE$ = 'TABOBJ' AND CONS.SUBTYPE$ = 'CONS' AND CONS.ID = CONSINFO.ID LEFT JOIN SYSINDEXES IDXINFO ON IDXINFO.ID = CONSINFO.INDEXID LEFT JOIN SYSOBJECTS IDX ON IDX.TYPE$ = 'TABOBJ' AND IDX.SUBTYPE$ = 'INDEX' AND IDX.ID = IDXINFO.ID AND IDX.PID = CONSINFO.TABLEID LEFT JOIN SYSOBJECTS TAB ON TAB.TYPE$ = 'SCHOBJ' AND TAB.SUBTYPE$ IN ('STAB','UTAB') AND TAB.ID = CONSINFO.TABLEID LEFT JOIN SYSOBJECTS SCH ON SCH.TYPE$ = 'SCH' AND SCH.ID = TAB.SCHID LEFT JOIN SYSCOLUMNS COLS ON COLS.ID = TAB.ID AND (SF_COL_IS_IDX_KEY(IDXINFO.KEYNUM, IDXINFO.KEYINFO, COLS.COLID) = 1 OR SF_COL_IS_CHECK_KEY(CONS.INFO1, CONS.INFO6, COLS.COLID) = 1) ) SELECT C.COLUMN_NAME,C.* FROM T_CONSCOLS C WHERE C.CONSTRAINT_TYPE = 'P' AND C.TABLE_NAME = 'VC_23_TERM' AND C.OWNER = 'VC_MAIN_STIES_23'