2009-11-11 159 views
1

任何人都可以告訴我,如果它使甲骨文的差異10g的我是否使用:子選擇在Oracle查詢

SELECT col1 FROM myTable WHERE col2 = 'someval' AND col3 = "someotherval" 

SELECT col1 FROM 
    SELECT col1, col2, col3 FROM (
     SELECT * FROM myTable 
    ) WHERE col2 = 'someval' 
) WHERE col3 = "someotherval" 

據解釋計劃,對於上述成本相同,但是在性能測量方面,Im是空白的。

背景是:在我的應用程序中,我有幾個基本查詢,我需要在運行時通過任意標準修改以提供不同客戶端的數據集。 WHERE條件和提取列是特定於客戶端配置文件的,某些配置可能需要查看col2,而其他配置文件則查看col5等等。另外,用戶可以在客戶端配置上添加額外的標準和列。我正在考慮使用一組裝飾器來實現這一點,所以如果上述方法具有相同的性能,我可以保持所有三個查詢部分完全分離。

這是一個Oracle 10g。表中有幾十萬行(實際上它是一個View)。

感謝您的任何建議。

回答

6

一般來說,Oracle的基於成本的優化器會將包含視圖(或您的案例中的內聯視圖,本質上是同一件事)的查詢合併爲優化查詢轉換階段的一部分。

這被稱爲「視圖合併」,並將您的第二個查詢轉換爲第一個查詢。在某些情況下,無法執行完整視圖合併,但即使如此,「謂詞推送」也可能被允許,並且性能會因此得到改善。

http://download.oracle.com/docs/cd/B19306_01/server.102/b14211/optimops.htm#i37745

還看到:

http://download.oracle.com/docs/cd/B19306_01/server.102/b14211/optimops.htm#i37745 http://www.oracle.com/pls/db102/to_URL?remark=ranked&urlname=http:%2F%2Fdownload.oracle.com%2Fdocs%2Fcd%2FB19306_01%2Fserver.102%2Fb14200%2Fsql_elements006.htm%23SQLRF50908 http://download.oracle.com/docs/cd/B19306_01/server.102/b14237/initparams142.htm#REFRN10141 http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/sql_elements006.htm#SQLRF50706

長話短說,你不應該有一個問題在這裏。

3

我不會太擔心這件事。在涉及到優化時,Oracle通常非常複雜,所以我相信它不會因嵌套查詢而感到困惑。你試圖做的事聽起來很複雜,所以你應該先讓它運行,然後快速(如果它的性能不夠好)。

記住:

「過早的優化是所有罪惡的根源。」 - 高德納

+1

我同意湯姆。任何一個都應該沒問題,我不會擔心優化問題,除非在數據量很大的情況下,使用一個性能比另一個性能明顯下降。 – ChadNC 2009-11-11 16:28:41

+0

+1。 :) – Guru 2009-11-12 14:51:45

1

可以很好的工作,即第二個查詢可能具有相同的抗衝擊性能/資源方面比第一個,在當前實施的Oracle的。

從來沒有,我不會依賴這種類型的東西,特別是當涉及到簡化查詢構建邏輯時。事實上,根據具體的業務規則和基礎數據模型,可能會有幾種替代裝置模式的替代方案(甚至是實現它的替代方法),您正在考慮使用。