2012-04-18 10 views
3

この質問はではありません。については、SQLでグループ化してください。SQL Serverのグループ化に関する質問

アプリケーションサーバーがアプリケーションのUIとSQL Serverの間にあるとします。もちろん、このサーバーはSQL Serverに対してSQL要求を行います。そのような要求ごとに、いくつかの重要なオーバーヘッドがあります。いくつかの要求をグループ化して一緒に送信する方法があるかどうかが不思議で、通信のオーバーヘッドが減ります。

は、例えば、サーバは、それが List<sqlRequest>ようなものを送って、もちろん( List<sqlResponse>をバック受け取ることになりますように

Select * from teams... 

Select * from users... 

として、代わりにそれらを別々に処理するクエリを作成したいですプログラマに透過的に)。

私の場合、私はSQL Serverを使用しています。より一般的な注意点として、これを可能にするSQLデータベースサーバー/ SQLマッピングフレームワークはありますか?努力の価値があるためにパフォーマンスが向上するのだろうか?

+1

を形成バッチを処理するためにサーバーに渡し、 'SqlDataReader'を使用すると、複数の応答を1つずつ処理することができます。 –

+1

あなたが表示する文をグループ化する最良の方法は、ビジネスロジックをカプセル化するストアドプロシージャを使用することです。あなたは何を試みようとしていますか? –

+0

これは、要求と応答をバッファリングすることによって通信のオーバーヘッドを減らすことです。要求には共通のコンテキストがまったくない可能性があります。したがって、私はストアドプロシージャが適切な解決策ではないと思います。より多くのリクエストを送信し、 'SqlDataReader'を使ってこれを行う方法ですが、私はもっと透明な何かについて考えるでしょう。 – user992990

答えて

1

あなたは

  • 2番目の結果セットが最初の結果セットが

は以下の

を考えてみましょ作成する高価である第一
  • に基づいている場合パフォーマンスの向上を実現することができます
    CREATE PROC GetTeamsAndUsersForACity(@CityId Int) 
    BEGIN  
    
        DECLARE @Teams as Table (TeamId int, TeamName varchar(10)) 
    
        INSERT into @Teams 
        SELECT TeamId, TeamName 
        FROM 
         Teams 
        WHERE  
         CityId = @CityID 
    
    
        SELECT TeamId, TeamName FROM @Teams 
    
        SELECT 
          UserId, UserName, TeamId 
        FROM 
          Users 
        WHERE 
          TeamId in (Select TeamID FROM @Teams) 
    END 
    

    どのようにwe'r @teamsを再利用して、チームテーブルを再クエリーせずにユーザーと関連チームを取得します。

    これらの結果セットは、他の方法でも実現できます。たとえば、最初の結果からチームIDを取得し、2番目のセットに対してそのSQL Serverを渡すことができます。

    また、チームを再度クエリすることもできます。 WHERE TeamId in (Select TeamID FROM Teams where CityID = @CityID)

    また、1つの結果セットselect * from teams inner join users....Where city id= @cityidに入って、クライアントで分割することもできます。

    各ソリューションの相対的なパフォーマンスは、最初のセットのサイズと最初の結果セットを生成するためのクエリ時間によって異なりますので、どちらのケースに適しているかをテストする必要があります。

    クライアントからGetTeamsAndUsersForACityを消費する方法については、仮定すると、あなたは.NETことができます

    を記入し、少なくともSQL Serverでは、あなたは間違いなくSQL回以上送信することができ、まあストアドプロシージャの

  • +0

    答えをありがとう!しかし、これは役に立つとはいえ、私は、要求をバッファしてバーストで送信するプログラマにとって透過的な(既存の)層をもっと心配していました...(私は自分自身をはっきりさせることができないと認めなければなりません) – user992990

    +0

    @ user992990、多分あなたは非同期リクエストのようなものを意味しますか?プログラマは、応答を待つか、バックグラウンドで実行するかをアプリケーションに指示する必要があります。つまり、透過的にすることはできませんが、asyncが役立つかもしれません。 – Ben

    関連する問題