.net之Oracle 选择查询花费的时间太长

lautakyan007 阅读:16 2024-11-24 20:56:43 评论:0

我们有一个基于 .Net 的内部应用程序,它调用 Oracle (10g) 中的某些过程。运行这些查询之一以获取这些过程的输入/输出参数。这是一个非常简单的选择查询。但即使在最好的情况下,也需要 3 秒。每天至少有几次它开始花费超过 40 秒并导致我们的 .Net 应用程序超时。

选择查询是:

SELECT   a.argument_name, 
           a.data_type, 
           a.in_out, 
           NVL (a.data_length, 0) AS data_length, 
           NVL (a.data_precision, 0) AS data_precision, 
           NVL (a.data_scale, 0) AS data_scale 
    FROM   ALL_ARGUMENTS a, all_objects o 
   WHERE   o.object_id = 
              (SELECT   object_id 
                 FROM   all_objects 
                WHERE       UPPER (object_name) = UPPER ('resourcemanager_pkg') 
                        AND object_type = 'PACKAGE' 
                        AND owner = 'OFFICEDBA') 
           AND UPPER (a.object_name) = UPPER ('p_search_roles') 
           AND a.OBJECT_ID = o.OBJECT_ID 
ORDER BY   a.position ASC 

此查询返回特定过程的输入/输出参数。

resourcemanager_pkg 是包名,p_search_roles 是过程名。 我们为过程的每个数据库调用调用此查询。

这个查询有什么问题吗?

请您参考如下方法:

删除 oracle View 上对 UPPER() 的所有调用。他们已经是大写了。我还将包名称查询移动到“with 子句”,因此只调用一次。

WITH PACKAGE AS 
     (SELECT object_id, owner, object_name NAME 
        FROM all_objects 
       WHERE object_name = UPPER ('SOME_PACKAGE_NAME') 
         AND object_type = 'PACKAGE' 
         AND owner = 'SOME_SCHEMA_OWNER_NAME') 
SELECT   a.argument_name, a.data_type, a.in_out, 
         NVL (a.data_length, 0) AS data_length, 
         NVL (a.data_precision, 0) AS data_precision, 
         NVL (a.data_scale, 0) AS data_scale 
    FROM ALL_ARGUMENTS a, PACKAGE 
   WHERE a.package_name = PACKAGE.NAME AND a.owner = PACKAGE.owner 
   --This is the 'procedure' name within the package. 
   AND a.OBJECT_NAME = 'SOME_PROCEDURE_NAME' 
ORDER BY a.POSITION ASC 


标签:oracle
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号