3

この質問は、SQL でのグループ化に関するものではありません。

アプリケーションの UI と SQL Server の間にアプリケーション サーバーがあるとします。もちろん、このサーバーは SQL Server に対して SQL 要求を行います。このようなリクエストごとに、重要なオーバーヘッドが発生します。複数のリクエストをグループ化して一緒に送信し、通信のオーバーヘッドを削減する方法があるかどうかに興味があります。

たとえば、サーバーは次のようなクエリを作成したいと考えています

Select * from teams...

Select * from users...

そして、それらを別々に処理する代わりに、 a のようなものを送って a List<sqlRequest>を受け取りますList<sqlResponse>(もちろん、プログラマーには透過的に)。

私の特定のケースでは、SQL Server を使用しています。より一般的な注意として、これが可能な SQL データベース サーバー/SQL マッピング フレームワークはありますか? これによって引き起こされるパフォーマンスの向上は、まったく努力する価値がありますか?

4

1 に答える 1

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  

team テーブルを再クエリせずに、@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を使用していると仮定すると、次のことができます

ORM を使用している場合は、ストアド プロシージャから複数の結果がサポートされているかどうかを確認する必要があります。

于 2012-04-19T18:36:02.727 に答える