分组SQL Server请求

时间:2012-04-18 07:54:08

标签: sql-server performance

这个问题关于SQL中的分组。

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

例如,服务器想要进行诸如

之类的查询
Select * from teams...

Select * from users...

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

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

1 个答案:

答案 0 :(得分: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来获取用户和相关团队而不重新查看团队表。

您可以通过其他方式实现这些结果集。例如,您可以从第一个结果中检索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,则必须从存储过程检查多个结果的支持