Oracle 11g:元数据查询非常慢

时间:2013-09-02 03:27:02

标签: sql oracle metadata

我有这个视图应该显示模式中某些表的列的注释和约束(包括适用的检查条件)。

基本上我(左)将ALL_COL_COMMENTS加入ALL_CONS_COLUMNS到ALL_CONSTRAINTS。

然而,由于某些原因(大约10秒钟),这确实很慢,即使我有非常少量的表(只有7个),列数非常少(总共58列)。因此查询返回的结果很少。它仍然很慢。我该怎么办?

  CREATE OR REPLACE FORCE VIEW "MYDB"."COMMENTS_VIEW" ("TABLE_NAME", "COLUMN_NAME", "COMMENTS", "CONSTRAINT_TYPE", "CHECK_CONDITION") AS 
  SELECT r.TABLE_NAME, r.COLUMN_NAME, r.COMMENTS, DECODE(q.CONSTRAINT_TYPE,'P', 'Primary Key', 'C', 'Check Constraint', 'R', 'Referential Integrity Constraint' ), q.SEARCH_CONDITION AS CHECK_CONDITION
      FROM  ALL_COL_COMMENTS r -- ALL_COL_COMMENTS has the COMMENTS
          LEFT JOIN ALL_CONS_COLUMNS p ON (p.TABLE_NAME = r.TABLE_NAME AND p.OWNER = 'MYDB' AND p.COLUMN_NAME = r.COLUMN_NAME) -- ALL_CONS_COLUMNS links COLUMNS to CONSTRAINTS
          LEFT JOIN ALL_CONSTRAINTS q ON (q.OWNER = 'MYDB' AND q.CONSTRAINT_NAME = p.CONSTRAINT_NAME AND q.TABLE_NAME = p.TABLE_NAME AND (q.CONSTRAINT_TYPE = 'C' OR q.CONSTRAINT_TYPE = 'P' OR q.CONSTRAINT_TYPE = 'R' ) ) -- this gives us INFO on CONSTRAINTS
    WHERE r.OWNER = 'MYDB' 
        AND 
    r.TABLE_NAME IN ('TABLE1', 'TABLE2', 'TABLE3', 'TABLE4', 'TABLE5', 'TABLE6', 'TABLE7')
        AND
    r.COLUMN_NAME NOT IN ('CREATED', 'MODIFIED', 'CREATED_BY', 'MODIFIED_BY') 
      ORDER BY r.TABLE_NAME, r.COLUMN_NAME, r.COMMENTS;

3 个答案:

答案 0 :(得分:2)

确保字典和固定对象统计信息是最新的。检查最新的统计信息是几乎所有SQL性能问题的良好开端。字典和固定对象是不寻常的,很可能没有人考虑过之前收集统计数据。

begin
    dbms_stats.gather_fixed_objects_stats;
    dbms_stats.gather_dictionary_stats;
end;
/

答案 1 :(得分:0)

我要么使用查询分析器,要么(更简单)只删除部分查询,直到它超速。例如,删除DECODE()调用,也许就是这样做。

答案 2 :(得分:0)

尝试在可能的情况下加入表和列id而不是名称。如果可以,甚至是所有者。例如:

    ON p.TABLE_ID = r.TABLE_ID

此外,您正在从已知有多少基础表的视图的对象中进行选择。查询优化器可能很难(并且可能在某些方面放弃)。尝试将您的查询转换为使用基表。