3

这个问题与 SQL 中的分组无关。

让我们假设一个应用程序服务器位于应用程序的 UI 和 SQL Server 之间。该服务器当然会向 SQL Server 发出 SQL 请求。对于每个这样的请求,都有一些重要的开销。我很好奇是否有办法将多个请求分组并将它们一起发送,从而减少通信开销。

例如,服务器想要进行查询,例如

Select * from teams...

Select * from users...

而不是单独处理它们,它将发送类似 a List<sqlRequest>并接收回 a List<sqlResponse>(当然对程序员是透明的)。

在我的特殊情况下,我使用的是 SQL Server。更一般地说,是否有任何 SQL 数据库服务器/SQL 映射框架能够做到这一点?(将是)由此带来的性能提升是否值得付出努力?

4

1 回答 1

1

如果满足以下条件,您可以获得性能提升

  • 第二个结果集基于第一个
  • 第一个结果集的创建成本很高

考虑以下

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  

请注意我们如何重用@teams 来获取用户和关联的团队,而无需重新查询teams 表。

您可以通过其他方式实现这些结果集。例如,您可以从第一个结果中检索 teamid,然后将其传回 SQL Server 用于第二组。

您也可以再次重新查询团队,例如WHERE TeamId in (Select TeamID FROM Teams where CityID = @CityID)

您也可以只获取一个结果集select * from teams inner join users....Where city id= @cityid,然后将它们拆分到客户端。

每个解决方案的相对性能在第一个集合的大小和生成第一个结果集的查询时间上会有所不同,因此您需要测试哪个适合您的情况。

至于如何从客户端使用 GetTeamsAndUsersForACity。假设您使用的是 .NET,您可以

如果您使用的是 ORM,则必须检查是否支持存储过程中的多个结果

于 2012-04-19T18:36:02.727 回答