可以使用存储过程在oracle中的表上创建索引

时间:2016-08-29 09:27:51

标签: oracle stored-procedures indexing

我的存储过程需要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.2秒,但是当我执行sp时,需要3.2。

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

我的问题是: sp使用索引吗?或者我如何强制sp使用索引???

1 个答案:

答案 0 :(得分:2)

在一般情况下,Oracle优化器使用索引,无论执行何种查询(存储过程与SQL Developer的查询)。

根据您是否启用了统计信息收集(默认情况下,我认为它已启用),优化程序决定是否使用索引,具体取决于查询中表的统计信息度量标准(有些情况下直接查询表会更快而不是使用索引。通常这是当记录数量很少时)。

在不确定首先执行哪个查询的情况下,您可能还遇到了以下情况:查询结果存储在缓冲区缓存中(从第一次使用存储过程执行)以及重新执行查询时由于没有必要访问磁盘,SQL Developer的性能要好得多。

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