我的存储过程需要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使用索引???
答案 0 :(得分:2)
在一般情况下,Oracle优化器使用索引,无论执行何种查询(存储过程与SQL Developer的查询)。
根据您是否启用了统计信息收集(默认情况下,我认为它已启用),优化程序决定是否使用索引,具体取决于查询中表的统计信息度量标准(有些情况下直接查询表会更快而不是使用索引。通常这是当记录数量很少时)。
在不确定首先执行哪个查询的情况下,您可能还遇到了以下情况:查询结果存储在缓冲区缓存中(从第一次使用存储过程执行)以及重新执行查询时由于没有必要访问磁盘,SQL Developer的性能要好得多。
如果您想引导查询使用索引,可以使用hint