在有效利用数据库资源方面,我需要一些建议。
目前,我正在构建一个采用上传文件的订购系统,并运行该文件,将每一行添加到订单中。
在完成此操作的同时,应用程序会检查所请求的产品代码是否可供销售给该客户。
鉴于该文件可以包含超过200行(以及因此要检查的数据库的许多请求),我很想知道,向单个请求发送一个请求是否更有效。可用的所有产品代码的数据库,然后对该列表运行检查,即使该列表中大约有2000个代码。
因此,要么是200个连续的一个结果请求,要么是一个2000个结果请求。
该网站将在4-5小时内处理大约130次上传,并且必须从Azure穿越VPN到我们的数据库服务器。
答案 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