JDBC automatical query turned to be very slow

后端 未结 5 1995
一向
一向 2021-02-10 10:57

I am maintaining an application creating an Oracle DB via JDBC. Starting from today this query:

SELECT  NULL                                                   AS         


        
5条回答
  •  萌比男神i
    2021-02-10 11:32

    here is another more graceful solution.. I found that forcing the rule base optimizer with a sql patch also works.. 2 patches are necessary because sometimes the jdbc driver uses :1 and :3 as bind variables and sometimes it uses :2 & :4.. The SQL must match exactly for the patch to work.

    run this in your database as sysdba..

        begin 
            dbms_sqldiag_internal.i_create_patch ( 
          sql_text =>'SELECT NULL AS pktable_cat,
            p.owner as pktable_schem, p.table_name as pktable_name, 
            pc.column_name as pkcolumn_name, NULL as fktable_cat, f.owner as       
            fktable_schem, f.table_name as fktable_name, 
            fc.column_name as fkcolumn_name, fc.position as key_seq, NULL as 
            update_rule, decode 
            (f.delete_rule, ''CASCADE'', 0, ''SET NULL'', 2, 1) as delete_rule, 
            f.constraint_name as fk_name, p.constraint_name as pk_name, 
            decode(f.deferrable, ''DEFERRABLE'',5 ,''NOT DEFERRABLE'',7 , ''DEFERRED'', 6)  
            deferrability
            FROM all_cons_columns pc, all_constraints p, all_cons_columns fc, 
            all_constraints f
            WHERE 1 = 1 AND p.table_name = :1  AND p.owner = :3 AND 
             f.constraint_type = ''R'' AND p.owner = f.r_owner AND 
             p.constraint_name = f.r_constraint_name AND p.constraint_type = ''P'' 
             AND pc.owner = p.owner AND pc.constraint_name = p.constraint_name AND
             pc.table_name = p.table_name AND fc.owner = f.owner AND 
             fc.constraint_name = f.constraint_name AND 
             fc.table_name = f.table_name AND fc.position = pc.position 
            ORDER BY fktable_schem, fktable_name, key_seq' ,
          hint_text => 'RULE', 
          name => 'jdbcpatch');
        end;
        /
    
        begin 
            dbms_sqldiag_internal.i_create_patch ( 
          sql_text =>'SELECT NULL AS pktable_cat,
            p.owner as pktable_schem, p.table_name as pktable_name, 
            pc.column_name as pkcolumn_name, NULL as fktable_cat, f.owner as       
            fktable_schem, f.table_name as fktable_name, 
            fc.column_name as fkcolumn_name, fc.position as key_seq, NULL as 
            update_rule, decode 
            (f.delete_rule, ''CASCADE'', 0, ''SET NULL'', 2, 1) as delete_rule, 
            f.constraint_name as fk_name, p.constraint_name as pk_name, 
            decode(f.deferrable, ''DEFERRABLE'',5 ,''NOT DEFERRABLE'',7 , ''DEFERRED'', 6)  
            deferrability
            FROM all_cons_columns pc, all_constraints p, all_cons_columns fc, 
            all_constraints f
            WHERE 1 = 1 AND p.table_name = :2  AND p.owner = :4 AND 
             f.constraint_type = ''R'' AND p.owner = f.r_owner AND 
             p.constraint_name = f.r_constraint_name AND p.constraint_type = ''P'' 
             AND pc.owner = p.owner AND pc.constraint_name = p.constraint_name AND
             pc.table_name = p.table_name AND fc.owner = f.owner AND 
             fc.constraint_name = f.constraint_name AND 
             fc.table_name = f.table_name AND fc.position = pc.position 
            ORDER BY fktable_schem, fktable_name, key_seq' ,
          hint_text => 'RULE', 
          name => 'jdbcpatch2');
        end;
        /
    

提交回复
热议问题