2017-07-16 8 views
1

私は関数を3回呼び出す選択クエリを持っています。私は実行時間[複数行]は、私が関数を一度呼び出すと3秒の8秒であることに気づいている。作業負荷が3倍になるので理にかなっています。選択クエリでマルチスレッドを強制しますか? [Oracle or Sql-Server]

はASK:
それは彼らが異なる3つの独立した列であるため、マルチスレッドを強制的にDBサーバをヒントすることは可能ですか?

結果を別々に抽出して結合しようとしました。 SQL ServerやOracleでは、どのようなタイプの並列処理も作成していないようです。以下のSS構文を使用します。上記

select top 200 dbo.CALC_DURATION (Col1, Col2 , 'PP', 553, '', 'N', 'H'), 
       dbo.CALC_DURATION (Col3, Col4 , 'PP', 553, '', 'N', 'H'), 
       dbo.CALC_DURATION (Col5, Col6 , 'PP', 553, '', 'N', 'H') 
from NNMP265_ISS; 

enter image description here 機能スニペット:

+1

CALC_DURATIONはスカラー関数である可能性はありますか? https://dba.stackexchange.com/questions/134453/sql-not-engaging-parallelism-for-extremely-large-queryを参照してください。 – Serg

+0

機能のコードを含めることはできますか?並列性を妨げないような方法で他の方法でどのように実行できるか考えている人もいます。 –

+0

確かに、thx。この機能は、2セットのデータに優先順位をつけて勤務時間を計算し、開始時間と終了時間の間の労働時間を正確に計算します。私はここでプログラムに合っていないので、メインの質問にスクリーンショットを添付してください。 – rsreji

答えて

1

私は、Oracleに関連して答えることができます。Oracle parallismで行を探す(および/修正を挿入する)に関して動作します。これは、パラレル実行が結果を見つけるのに役立つことを意味します。実行するplsqlルーチンではありません。

ここで難しい部分があります。結果セットを作成するためにPL/SQLルーチンの結果が必要な場合(WHERE my_function(col1)> 3など)、並列処理が利益を得ます。このルーチンがPXエグゼキュータ内で実行されないため、最終結果(たとえばSELECT my_function(col3)を "美化"する場合にのみ適用されます)

あなたの関数を並列実行するようにトリックしようとしますマテリアライズヒントを使用したり、複数のサブクエリの下に隠れてしまいましたが、私はそれをしないことを真剣にお勧めします。あなたの問題を解決する最善の方法は、PL/SQLを結果セットに適用しないようにして、プレーンSQLのみを使用するようにクエリを書き直すことです。 SQL間の切り替えおよびPL/SQLコンテキスト

1

私はあなたのような同じ問題を抱えています。私は2つの点の間の車のルートを計算するスカラー関数を持っています

したがって、処理時間は線形ですが、1つの計算は8ミリ秒かかるが、1000回の計算には8秒が必要です。

PostgreSQLでパラレル化を動作させることができませんでしたので、実際に合計時間を8秒から2秒に短縮する4スレッドを使用してdbに複数のリクエストを送信するC#関数を作成しました。

あなたはここに私のコードへの参照を見ることができます:route_sourceは情報を持っている機能routeParallelGeneration

https://codereview.stackexchange.com/questions/155253/splitting-a-list-of-numbers-into-multiple-lists

フォーカスがルートを計算するためにそれを必要とします。

+0

アイデアありがとう。ファン。 – rsreji

関連する問題