2017-10-27 4 views
0

これは間違っている可能性がありますので、この質問をしてくださいので、私を許してください。ストアドファンクション/プロシージャを作成するか、クエリを保持する必要がありますか?

私は400行の長さのDB2クエリーを持っていますが、顧客がLTLの出荷を車線とターミナル/配送場所別に有益かどうかを判断するためにはかなりの計算があります。

私の質問は一般的に、クエリフォームでこれをやり続けるか、アルゴリズムの一部をストアドファンクションに渡す方が速いでしょうか?明細ごとにORレポートを実行しているため、任意の期間にわたって顧客ごとに数千の回線または請求書が存在する可能性があります。

私はあなたとは異なる視点や経験を持っている美しい人たちのアドバイスを探しています。

ありがとうございました。

--EDIT-- スピードを上げようとしていますが、私は1人の顧客のために十分速く走っていますが、会社全体を走らせると、1ヶ月間(約40k紙幣) 。
これは実際には4つのテーブルのみを処理し、ほとんどの場合、データの1列を呼び出します。最も幅が広いのは約40列ですが、それは凝縮する可能性があります。私はそれらが結合され、よりクリーンな形式で集計される前に、計算をラインで見ることができるのが好きです。私はWith Loopを()のように使って、最後の出力のために一時テーブルを鉱山するだけです。

+0

私の2セント:それが壊れていない場合は、なぜそれを修正しますか? – abhi

+0

私の意見では、質問は広すぎます。パフォーマンスを向上させようとしていますか?メンテナンス性を向上させる?パフォーマンスを維持しながら保守性を向上させるものは何ですか?私は何かを壊していないものを修正しませんが、ダウンタイムでは、コードを単純化してパフォーマンスと統合性を改善する方法を探します。 – xQbert

+0

質問に対する回答は、質問から省略した要因によって異なります。表の数、結果セット内の行数、アクセス計画は最適なアクセス計画、パフォーマンス要件などは – mao

答えて

0

アーキテクチャとしては、の複雑さを解消することができます。メンテナンス可能なモジュールを小さくすることができます。ストアド・ファンクションまたはストアド・プロシージャを使用します。これにより、のコード番号までの再利用可能なコードベースが少しも得られます。これは品目FORループおよびインスタンスのCURSORを通じて配管より速くなりますよう、一緒にあなたの結果を引っ張ってINNER JOIN, LEFT OUTER JOIN, FULL OUTER JOINと、このようなようなJOINを使用しています。適合索引付けはパフォーマンスにも影響します。しかし、このアプローチでは、ネストされたストアドプロシージャを何百万回も呼び出すことができます。コンテキストの変更またはプロシージャコールごとにわずかなオーバーヘッドがあります。必要な場合は、ローカルの一時テーブルに結果を格納し、ロジックに結果が多く、マルチステージのデータなどがある場合は、パフォーマンスの向上のためにそれらに戻って参加してください。これらのヒントが役立つことを願っています。

+0

これは、使いやすさと効率性のために行きたいという方向性の種類なので、提案した手順を逸してうれしく思います。 – Landers

+0

短いクエリ(400行など)がストアドプロシージャに作成され、その結果が(スキルの不十分、Javaプロシージャの使用、適切なテストの失敗などにより)恐ろしいパフォーマンスが発生した場合があります。したがって、動機は完璧になる可能性がありますが、それは実際に重要な結果です。 – mao

+0

私はマオに同意します。私のSQLの問題は、オブジェクト指向の*コードと比較してどの程度の大きさのコードになるかということです。コードを* procs *に分割することで、さまざまなニーズを総合的に理解し、メイン・エントリー・ポイント* proc *のコード・サイズを減らしたり、SQLステートメントを呼び出すことができます。 Procsは冗長コードを減らすのに最適です。私は通常、純粋にデータベースを*データストア*として使用したいと考えています。私はそれらをインスタンスのリポジトリとしてもっと考え、中間層で多くのビジネスロジックを実行します。このようにして、アプリケーションがデータストレージの技術を切り替える場合、私はロジックを再開発していません。 – OhRyanOh

関連する問題