簡體   English   中英

使用多線程執行SQL語句

[英]Use of multi threading to execute SQL statements

我有執行數據檢索的代碼-基本上執行3到12條SQL(oracle)讀取語句中的任何內容來檢索有關對象的數據。

不幸的是,它運行緩慢(特別是沒有SQL語句,只是我有很多這樣的事實-它們每條語句大約需要0.2秒的時間,這意味着2秒鍾才能完成代碼)。

我正在研究改善性能的方法。 一種方法是將某些表合並為一個查詢(這可以將合並結果減少0.5秒)。 但是,將其余部分合並是沒有意義的,因為在某些情況下只有那里的數據,並且試圖確定何時有數據要編組可能會很棘手。

我正在考慮將線程引入程序中,因此在初始查詢之后,我將為其他每個查詢產生一個線程,以便它們同時執行。 但是,我從未使用過線程處理,並且對引入死鎖或其他進深陷阱保持警惕。

當前,其他查詢將結果編組到SAME對象的不同部分。 這是否會引起任何問題(即由於我們通過對象中的不同節/字段在不同線程中訪問/更新同一對象?)。 在所有線程完成后將結果返回並編組到對象中會更好嗎?

我知道這些問題很難回答,因為它的建議較為籠統,但是如果有人認為這是一個好主意,或者有其他建議,我將不勝感激。

如果您只在閱讀(從中選擇),則不必擔心死鎖。 Oracle讀數不可阻塞(大多數情況下)。 將查詢線程化到oracle的最大問題是如何處理連接。 要創建連接,請運行查詢並關閉連接-非常非常非常糟糕。 連接很昂貴。 它們也受到限制,因此您不想創建一百萬個連接來執行邏輯。

結果,您將使用某種連接池並將查詢放入隊列中。

另外,我希望您使用綁定變量而不是字符串連接將查詢傳遞給oracle。

通常,我會收集所有數據(最好在一個查詢中),然后才更新對象。 您也可以考慮將對象制動到其中。

線程工作完美。 2年前,我做了一個項目,該項目使用多階段/多線程方法將數據推送到oracle數據庫中(並從其中提取一些數據以進行更新)。

我基本上都使用了分階段的方法(一個請求將經歷多個階段,在那里被消耗,新數據將被注入下一階段),並且每個階段都使用可配置的線程池,該線程池將接收一條消息,對其進行處理並發布新消息。 。

我們當時使用的速度大約是200個線程,每分鍾處理大約一百萬條SQL語句(選擇一個Oracle Exadata確實從中得到了一些工作)。

因此,多線程“行之有效”-顯然,如果您知道該怎么做,並且必須使體系結構和sql語句良好且無阻塞。 通常,數據庫完全可以處理多個線程。

現在,有關詳細信息:取決於。

例:

當前,其他查詢將結果編組到SAME對象的不同部分。 這是否會引起任何問題(即由於我們通過對象中的不同部分/字段在不同線程中訪問/更新同一對象?)

絕對沒有問題,只要:

  • 在將對象移至下一階段之前,請確保所有更新已完成。
  • 更新不會重疊或具有基數(必須完成1才能使2具有必需的數據)。

這些是實現細節,很難為這些問題做出通用答案(完全不可能)。 尤其是因為它是多線程101-與任何數據庫訪問無關。

通常,您還必須調整線程數。 .NET本身無法做到這一點-因為它將看到CPU不忙,並產生更多線程,即使數據庫服務器成為瓶頸。 這就是為什么我們要經歷多個階段的原因-因此我們可以根據線程的工作來調整線程的數量(最后一個階段使用批量插入將聚合數據插入具有少量線程的臨時登台表中,從而移動大量數據在每條語句中-這將需要一些調整的可能性,以使數據庫端不會完全過載。

暫無
暫無

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

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