2015-12-05 12 views
1

我試圖測量選擇成本的多少。通常我會通過在執行語句之前和之後獲得一致性獲取的值來完成此操作,但是,我想將它包裝在PL/SQL中,以便它更通用。然而,我正面臨的問題是,如何在不實際存儲結果的情況下簡單地運行select?在PL/SQL中測量SELECT語句的成本

其中一個想法我是包裝在一個for循環,像這樣

select value into getsBefore from v$sesstat ... 

for dummy in (select name from my_table where city = 'XYZ') loop 
    i := i; 
end loop; 

select value into getsAfter from v$sesstat ... 

但這似乎不是一個正確的做法。

我想我可以簡化我的問題 - 我怎麼能SELECT something INTO <nothing>

有關如何完成此任何想法或提示?因爲會話開始沒有其他辦法,而不是存儲快照的動作之前,然後執行該操作後,從一個新減去快照

感謝

+1

聲明'空;'是更多表現一個NOP比'我: = i;' –

+0

運行SELECT語句的成本取決於您未指定的各種因素,例如完成了多少次提取以及如何處理結果。爲了衡量這一點,你需要以預計通常運行的方式來實際運行語句。 –

回答

1

嘗試找到版本的說明:SELECT * bulk collect INTO [variable]

認爲這是一個參考SELECT INTO Statement

+0

謝謝,'SELECT * BULK COLLECT INTO'是我一直在尋找的東西。 – leopik

+2

但是,如果結果集很大,則不應該這樣做 - 這會炸掉PGA,請參閱http://www.oracle.com/technetwork/issue-archive/2008/08-mar/o28plsql-095155。 html –

+0

@FrankSchmitt謝謝你指出。 – leopik

0

由於V$SESSSTAT計數器是絕對的。

Tom Kyte最常用的腳本之一是RUNSTATS意在比較兩個執行相同操作的操作,以查看哪個實現更好。

您可以在http://betteratoracle.com/posts/12-runstats

+1

感謝您的回答。但是,我知道那裏的快照是絕對的,因此在返回結果之前,我將它們相減(因此從提供的示例中,我將返回'getsAfter - getsBefore')。我遇到的問題是如何在沒有編譯器的情況下執行'SELECT',並抱怨沒有從任何地方的'SELECT'返回結果。 – leopik

+0

你是否真的需要在單個PL/SQL塊中執行所有操作?您可以將該值存儲到表或全局包變量中,然後執行查詢(最好選項是使用SQL \ * Plus而不打印數據),然後從新獲取值中減去舊獲取值。您甚至可以創建SQL \ * Plus腳本,其中查詢將作爲參數,並且會自動執行所有操作。 – Husqvik