我不能因爲各種原因整個SQL粘貼,所以考慮這個例子:爲什麼只有當我用where子句查詢子查詢時,這個Oracle 10g SQL纔會運行緩慢?
select *
from
(select nvl(get_quantity(1), 10) available_qty
from dual)
where available_qty > 30;
get_quantity
是一個函數,使得基於多數民衆贊成通過它記錄的ID的計算。如果返回null,我用nvl()
用它強制10.
查詢時我使用WHERE子句中的父查詢的運行速度很慢。但是,當我註釋WHERE
條款時,它運行速度非常快。我沒有得到的是爲什麼它可以非常快速地顯示數據,但它不能以同樣的速度查詢它。我也在查詢子查詢的結果。我的印象是子查詢返回一個「呈現」數據集。這幾乎就像查詢available_qty標識符導致它引用子查詢中的某些內容一樣。
這就是爲什麼我不認爲get_quantity功能的內容是與此有關,所以我沒有打擾張貼。相反,我認爲這是我對Oracle如何處理子查詢和什麼的誤解。
你們任何一位Oracle專家都知道我做錯了什麼嗎?
事後反思:當我輸入這個問題的標籤時,標籤「相關的子查詢」出現了。在做一些快速研究時,似乎這種類型的子查詢在某種程度上取決於外部查詢。這可能與我的問題有關嗎?
你有沒有忽略一些內部查詢 - ?有沒有FROM子句 – antlersoft 2011-06-16 19:12:54
我只是用雙表固定它。該查詢實際上不起作用。我只是用一個準系統的例子來展示一個概念。 – oscilatingcretin 2011-06-16 19:14:59
我仍然認爲你已經留下了太多的問題以便得到一個很好的答案 - 儘管如此,我懷疑你在事後纔會走上正確的軌道。where子句可能會在子查詢中添加一個條件,使得它對主查詢的每一行都進行重新評估,而不是隻評估一次。 – antlersoft 2011-06-16 19:23:14