一个大查询或许多较小的查询

时间:2015-07-11 19:37:52

标签: c# asp.net sql-server

在有效利用数据库资源方面,我需要一些建议。

目前,我正在构建一个采用上传文件的订购系统,并运行该文件,将每一行添加到订单中。

在完成此操作的同时,应用程序会检查所请求的产品代码是否可供销售给该客户。

鉴于该文件可以包含超过200行(以及因此要检查的数据库的许多请求),我很想知道,向单个请求发送一个请求是否更有效。可用的所有产品代码的数据库,然后对该列表运行检查,即使该列表中大约有2000个代码。

因此,要么是200个连续的一个结果请求,要么是一个2000个结果请求。

该网站将在4-5小时内处理大约130次上传,并且必须从Azure穿越VPN到我们的数据库服务器。

2 个答案:

答案 0 :(得分:2)

这看起来像Permature Optimization(tam tam taaaaam)的另一个案例。

你不知道自己遇到了问题,但是你却试图解决它。你应该看到的第一件事是这里是否存在真正的性能问题。我的猜测是 - 没有。您将每隔几分钟读取2000条记录并写入200条记录。这真的不值得担心。

但是不要接受我的话,试一试。查看加载这些2000条记录并写入这200条记录需要多长时间。如果出现问题,请尝试优化。

顺便说一句,通过将请求分解为200个较小的请求来优化它是不太可行的。当你到达那里时,让我们穿过这座桥。

答案 1 :(得分:1)

创建获得2000行的单个查询比获得单行的200个查询更有效。对于单行查询,实际数据将是流量的一小部分,它主要是开销。

另一种替代方法是将查询添加到将订单行添加到订单的查询中,这样您就不需要单独的查询来首先检查产品。如果产品无法销售给客户,则查询将不会插入任何记录,并且它可以返回添加的记录数,以便调用代码可以确定是否添加了该行。

示例:

create procedure AddOrderLine
  @OrderId int,
  @ProductId int,
  @Quantity int
as

set nocount on

insert into OrderLines (OrderId, ProductId, Quantity)
select
  o.OrderId,
  @ProductId,
  @Quantity
from
  Orders o
  inner join AllowedProducts a on a.CustomerId = o.CustomerId and a.ProductId = @ProductId
where
  OrderId = @OrderId

return @@rowcount
相关问题