簡體   English   中英

使用存儲過程優化查詢

[英]Optimizing a query using Stored Procedure

我正在優化我很久以前從未遇到過的開發人員編寫的代碼。 我遇到了需要修改的方法。 首先想到的是使用存儲過程。 也許有更好的方法可以解決這個問題。 代碼是這樣的:

public void execute()
{
    String query = "select a, b, e from table1";
    ....
    ResultSet rs = stmt.executeQuery(query);
    String query2 = null;
    List<Integer> list1 = ....
    List<Integer> list2 = ....
    while(rs.next)
    {
        query2 = "select count(*) as rowcount from vw_view1 where f='" + rs.getString("a") + "' and d='" + rs.getString("b") + "'";
       .....
       ResultSet rs2 = stmt2.executeQuery(query2);
       list1.add(rs2.getInt(rowcount));

        query3 = "select count(*) as rowcount from vw_view1 where c='" + rs.getString("a") + "' and e='" + rs.getString("e") + "'";
       .....
       ResultSet rs3 = stmt3.executeQuery(query3);
       list2.add(rs3.getInt(rowcount));
    }
}

除了使用存儲過程之外,還有一種更好的方法可以避免這種方法對數據庫的不必要的訪問。

嘗試此查詢,檢查它是否給您相同的結果。 有了這個,您應該直接在一個查詢中擁有您想要的所有值

SELECT c, 
SUM(CASE WHEN vw1.d = tb1.b THEN 1 ELSE 0  END) as rowcountListOne,
SUM(CASE WHEN vw1.e = tb1.e THEN 1 ELSE 0  END) as rowcountListTwo
from vw_view1 vw1
left join table1 tb1 on vw1.c=tb1.a
GROUP BY c

在您發布的新案例中,您實際上應該通過c和f加入:

SELECT c, f,
SUM(CASE WHEN (vw1.d = tb1.b) AND (vw1.f=tb1.a) THEN 1 ELSE 0  END) as rowcountListOne,
SUM(CASE WHEN (vw1.e = tb1.e) AND (vw1.c=tb1.a) THEN 1 ELSE 0  END) as rowcountListTwo
FROM vw_view1 vw1
LEFT JOIN table1 tb1 on (vw1.c=tb1.a OR vw1.f=tb1.a)
GROUP BY c, f

您還應該檢查Lennart關於COUNT的內容,我認為我應該在這種情況下添加一些NULL管理,但是我現在無法對其進行測試。

如果您在這種情況下檢查vw1.f不為null(在另一個情況下為vw1.c),則可能就足夠了:

CASE WHEN (vw1.f IS NOT NULL) AND (vw1.d = tb1.b) AND (vw1.f=tb1.a) THEN 1 ELSE 0  END

您可以在初始選擇的同時執行計數,而無需為rs每一行運行兩個進一步的查詢:

SELECT  t.a, t.b, t.e, t1.RowCount1, t2.RowCount2
FROM    table1 AS t
        LEFT JOIN
        (   SELECT  c, d, COUNT(*) AS RowCount1
            FROM    vw_view1
            GROUP BY c, d
        ) AS t2
            ON t2.c = t.a
            AND t2.d = t.b
        LEFT JOIN
        (   SELECT  c, e, COUNT(*) AS RowCount2
            FROM    vw_view1
            GROUP BY c, e
        ) AS t3
            ON t3.c = t.a
            AND t3.e = t.e;

初始選擇將較慢,但隨后的循環將效率更高。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM