2016-08-29 17 views
1

我有一個需要3.5秒執行的存儲過程。 我的SP是如下:可以存儲過程使用創建的索引在oracle中的一個表中

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開發人員,它需要0.2s,但是當我執行SP,它需要3.2。

我創建了一個索引在我的表(USER1.Tbl), 當我在創建該索引之前在SQL開發者中運行創建表查詢,它花了3.2s。

我的問題是: sp是否使用索引?或者我如何強制sp使用索引?

回答

2

一般來說,Oracle優化器會使用索引,而不管執行查詢的位置(存儲過程與來自SQL Developer的查詢)。

根據您是否啓用了統計信息收集(默認情況下啓用了我相信),優化程序決定使用索引或不使用索引,具體取決於查詢中表的統計指標(有些情況下直接查詢表會更快,而不是使用索引,通常這是記錄數低時)。

不確定哪個查詢是首先執行的,還有一種可能性是您遇到查詢結果存儲在緩衝區緩存中(從使用存儲過程的第一次執行中)以及重新執行查詢時來自SQL Developer的性能要好得多,因爲不需要訪問磁盤。

如果您想指示查詢使用您的索引,可以使用hint

相關問題