2011-03-17 42 views
2

好的 - 我已經有了相當廣泛的SQL Server背景,但是我之前只是在Oracle中弄混了。好吧,推動已經到來,我需要創建一個相對複雜的查詢。本質上,它歸結爲在T-SQL:PL/SQL新手 - 返回多個結果集問題

SELECT Col1 
INTO #tmpTable 
FROM Table1 
WHERE Col3 = @paramValue 

SELECT Col1 
FROM #tmpTable 

SELECT OtherCol 
FROM Table2 
INNER JOIN #tmpTable 
    ON Table1.Col1 = Table2.fkCol1 

此序列的理由是因爲表1的初始呼叫重於泰山(〜5秒運行時),因爲它是對我們的數據倉庫一個高度複雜的呼叫。我想在單獨的調用中返回Table2的結果,因爲Table1中的每個表可能有5-10個記錄,這使得我的前端旋轉更容易。

我知道,我能做的

SELECT Table1.Col1, Table2.OtherCol 
FROM Table1 
LEFT JOIN Table2 
    ON Table1.Col1 = Table2.fkCol1 

,然後直到我發現了一個新的再正常化前端(數據處理只爲Col1中的第一條記錄,那麼所有的OtherCol記錄Col1)

雖然我不是數據庫專家,但我不確定哪種方法更好。從開發的角度來看,第一種解決方案對我來說更容易消費。它也(直覺)看起來更高性能,因爲不需要返回Table1耦合到Table2的「厚」結果。表1將返回〜1200行,寬度約爲2kb。表2顯着更爲精簡(〜20字節寬),但具有更多行(6000-12000)。

因此,最終我的問題是,哪種解決方案是最適合PL/SQL環境的解決方案,如果是第一個解決方案,那麼解決這個問題的最佳方法是什麼?全球臨時表/光標/子選擇/什麼?

+1

在第一位代碼中,是否真的從表中選擇Col1,Col1與參數相匹配,還是被簡化了? – 2011-03-17 22:34:13

+0

@Gary Myers:哈哈我想我會改變名字 - 它只是簡單化了。 – JustLoren 2011-03-18 19:49:37

回答

3

我會使用連接。編碼和讀取更容易,並且應該比三個單獨的選擇更快。如果你只是選擇Col1它並不重要,一個完整的行是多麼「厚」。

+0

第二種解決方案肯定比較容易編寫SQL! – JustLoren 2011-03-17 19:59:24

+0

然後使用它! :-) – 2011-03-17 20:10:42

+0

大聲笑!我想我們只在性能出現問題時才進行優化,是的? :p如果沒有其他人在一週內(我的最後期限)回答這個問題,我會將其標記爲已接受! – JustLoren 2011-03-17 20:22:00

1

如果您擔心性能,您應該測試它並比較結果。我會親自加入解決方案。甲骨文將在幕後做好自己的事情,並可能提高你的表現。

您還應該查看執行計劃的查詢。我相信您的開發環境可以讓您快速查看執行計劃。您的查詢成本會讓您知道發生了什麼,並會幫助您做出決定。

+0

不幸的是,我不知道如何實現第一個解決方案,所以我無法比較。否則,我會做到這一點。 – JustLoren 2011-03-18 19:49:02

0

在效應初探到你對不知道如何實現第一個解決方案評論:

procedure get_data(p_paramValue in varchar2, 
        c_data1 out sys_refcursor, 
        c_data2 out sys_refcursor) 
is 
    v_tmptable in varchar2(30); 
begin 
    SELECT Col1 INTO v_tmpTable 
    FROM Table1 
    WHERE Col3 = p_paramValue; 

    open c_data1 for 'SELECT Col1 FROM '||v_temptable; 

    open c_data2 for 
    'SELECT OtherCol FROM Table2 INNER JOIN '||v_tmpTable|| 
    ' ON Table1.Col1 = Table2.fkCol1'; 
end get_data; 

假設Table1.Col1數據是可信的,因爲在兩個光標註入漏洞。