2011-07-07 3 views
3

私は、アプリケーションの待ち時間を短縮するために、以下によく記述されているパターン(またはそのパターンについてはパターン)があるかどうかを調べようとしています。私はこのテクニックを試してみましたが、これは私にレイテンシを約20%節約するように見えます。これはよく文書化されたパターンですか?

あなたは、データベースへの複数のSELECT呼び出しを行うと、あなたはそれを最適化するために必要なメソッド/関数/プロシージャを持っている:私はすべての側面は、私が

コンテキストを意識する必要があることに影響があるかどうかを知りたいのです。

あなたの方法の流れがあると言うことができます:

getDBConnection() 
    execute("Select a,b from tableA"); 
    bind a with varA 
    bind b with varB 
    ---SOME Business Logic----- 
    execute("Select c,d from tableB"); 
    bind c with varC 
    bind d with varD 
    ---SOME more Business Logic----- 
    execute("Select e,f from tableC"); 
    bind e with varE 
    bind f with varF 
    ---SOME more Business Logic----- 
    releaseConnection() 

ソリューション: 使用連合すべてのデータベースへの単一の呼び出し

getDBConnection() 
execute("Select a,b,'sqlA' from tableA"+ 
" UNION ALL "+ 
" Select c,d,'sqlB' from tableB"+ 
" UNION ALL "+ 
"Select e,f,'sqlC' from tableC"); 
bind a,b where records have "sqlA" 
bind c,d where records have "sqlB" 
bind e,f where records have "sqlC" 
releaseConnection() 
--------Do all Business Logic here----- 

答えて

6

を作るためにunionの使用はの「形状」を制限あなたの質問。基本的には、すべて同じ番号と(互換性のある)タイプの列を同じ順序で返す必要があります。

execute("Select a,b from tableA;"+ 
    "Select c,d from tableB;"+ 
    "Select e,f from tableC"); 

それとも、これらのクエリを実行し、専用のストアドプロシージャを作成します。

より良いアプローチは、単一のコマンドで複数のクエリを使用して、複数の結果セットに対処するだろう。

これ以外にも、この最適化手法は無関係な操作をまとめて行うことができ、後で個々の操作の再利用性が制限されます。これらの操作をよりよく分離し、ある種のQueryManagerを使用して最初に収集し、後でそれらをすべて実行するような設計を検討したいと思うかもしれません。

+1

+1「この最適化手法は無関係の操作を一括して行う可能性があり、後で個々の操作の再利用性が制限されます」 –

+0

QueryManagerの一部を受け入れる – rajeshnair

1

すべてを一緒に押すと、本当の問題が隠される可能性があります。レイテンシがどこから来ているのか分かりますか?

これらのクエリが何度も呼び出されると、コンパイル段階で多くの時間を費やしている可能性があります。 - あなたが与えたクエリは、単純な選択ですが、何がより

conn = connect_to_db() 
pstmt = conn.prepare('select ...') 
... 
pstmt.bind(parameters) // if necessary 
pstmt.execute() 

待ち時間はそれが実行かもしれコンパイルからでない場合は、次の表は、アプリケーションのライフタイム中にあまりにも大きく変化していない場合には役立つかもしれないプリペアドステートメントを使用して、複合体は説明計画の審査を正当化するかもしれない。

dbmsとテーブルの構造で許可されている場合、再構成によっては、クエリの実行量を減らすこともできます。選択文を結合ではなく結合で結合できますか?パーティションとテーブルをマージできますか?

これはすべての一般的なアイデアです。あなたの実際の質問に答えるために、私は前にそのアプローチを使用して見たことがありませんが、私は評判を唯一の決定要因にしません。前回のポスターで指摘したように、コードの再利用性を犠牲にする可能性があります。最後に、テーブルの数が増えるにつれて、このアプローチはあまりうまく拡張されません。アプリケーションコードに「sqlA」、「sqlB」などの行があるかどうかを調べる必要があります。

関連する問題