【问题标题】:Can stored procedure use created Index over a table in oracle存储过程可以在oracle中的表上使用创建的索引吗
【发布时间】:2016-08-29 09:27:51
【问题描述】:

我有一个执行需要 3.5 秒的存储过程。 我的 sp 在下面:

CREATE OR REPLACE PROCEDURE ProcTest (columnNumber   IN     VARCHAR2,
                                      TG                OUT VARCHAR2)
IS
   stmt   VARCHAR2 (1000);
BEGIN
   TG := 't' || TO_CHAR (SYSDATE, 'YYYYMMDDHH24MISS') || columnNumber;
   stmt :=
      'CREATE GLOBAL TEMPORARY TABLE ' || TG
      || ' ON COMMIT PRESERVE ROWS AS (SELECT * FROM USER1.Tbl WHERE CHARGINGPARTY='
      || columnNumber
      || ')';

   EXECUTE IMMEDIATE stmt;
END;

我执行这部分 (CREATE GLOBAL TEMPORARY TABLE ' || TG || ' ON COMMIT PRESERVE ROWS AS (SELECT * FROM USER1.Tbl WHERE CHARGINGPARTY=' || columnNumber || ')' ) 在 sql developer 中,它需要 0.2s,但是当我执行 sp 时,需要 3.2。

我在我的表上创建了一个索引(USER1.Tbl), 当我在创建索引之前在 sql developer 中运行创建表查询时,花了 3.2 秒。

我的问题是: sp 是否使用索引?或者我怎样才能强制 sp 使用索引???

【问题讨论】:

    标签: oracle stored-procedures indexing


    【解决方案1】:

    Oracle 优化器通常会使用索引,无论查询在何处执行(存储过程与 SQL Developer 中的查询)。

    根据您是否启用了统计信息收集(默认情况下我相信它是启用的),优化器根据查询中表的统计指标决定是否使用索引(有些情况是直接查询表会比使用索引更快。通常这是在记录数较少的情况下)。

    在不确定哪个查询首先执行的情况下,您也有可能遇到查询结果存储在缓冲区缓存中的情况(从使用存储过程的第一次执行开始)以及从以下位置重新执行查询时SQL Developer,因此性能要好得多,因为不需要访问磁盘。

    如果您想引导查询使用您的索引,您可以使用hint

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-17
      相关资源
      最近更新 更多