Sql server 对SQL Server请求进行分组
这个问题与SQL中的分组无关 假设应用程序服务器位于应用程序的UI和SQL server之间。当然,此服务器会向SQL server发出SQL请求。对于每一个这样的请求,都有一些不平凡的开销。我很好奇是否有一种方法可以将多个请求分组并一起发送,从而减少通信开销 例如,服务器希望进行如下查询:Sql server 对SQL Server请求进行分组,sql-server,performance,Sql Server,Performance,这个问题与SQL中的分组无关 假设应用程序服务器位于应用程序的UI和SQL server之间。当然,此服务器会向SQL server发出SQL请求。对于每一个这样的请求,都有一些不平凡的开销。我很好奇是否有一种方法可以将多个请求分组并一起发送,从而减少通信开销 例如,服务器希望进行如下查询: Select * from teams... 及 而不是单独处理它们,它将发送类似于列表的内容,并接收回一个列表,当然对程序员来说是透明的 在我的特殊情况下,我使用的是SQL Server。更一般地说,是
Select * from teams...
及
而不是单独处理它们,它将发送类似于列表的内容,并接收回一个列表,当然对程序员来说是透明的
在我的特殊情况下,我使用的是SQL Server。更一般地说,是否有任何SQL数据库服务器/SQL映射框架能够做到这一点?由此带来的性能提升是否值得付出努力?如果
第二个结果集基于第一个结果集
第一个结果集的创建成本很高
考虑以下几点
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
您还可以再次查询团队,例如,从CityID=@CityID的团队中选择TeamId中的WHERE TeamId
您也可以只从团队内部加入用户中获取一个结果集select*,其中city id=@cityid,然后在客户端上将其拆分
每个解决方案的相对性能因第一个集合的大小和生成第一个resultset的查询时间而异,因此您需要测试哪一个适合您的情况
至于如何从客户端使用getteamandusersforacity。假设您使用的是.NET,您可以
使用
使用
使用或其中一个DataAdapter.Fill
如果您使用的是ORM,则必须检查存储过程是否支持多个结果至少在SQL Server中,您可以向服务器发送多次SQL批处理,并使用SqlDataReader,您可以一个接一个地处理多个响应……将语句分组为所显示语句的最佳方法是使用封装业务逻辑的存储过程。你想尝试什么?好的,目的是通过缓冲请求和响应来减少通信开销,请求可能根本没有公共上下文。因此,我认为存储过程不是正确的解决方案。发送更多请求并使用SqlDataReader是实现这一点的一种方法,但我会考虑更透明的方法。顺便说一句,感谢您修复了格式谢谢您的回答!然而,尽管这是有帮助的,我更关心的是一些对程序员透明的现有层,它会缓冲请求并以突发方式发送它们……我必须承认,我不擅长让自己clear@user992990,也许你指的是异步请求?程序员需要告诉应用程序是等待响应还是在后台执行响应——因此它不能是透明的,但异步可能会对您有所帮助。
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