2009-02-04 81 views
4

我有一个关于SQL性能的问题。我将用伪代码说明我的问题。SQL性能问题

我想知道哪种瓶坯可以更好地制造出多少?说10个项目,每页加载。在.NET中。速度快了吗?快一点? SQL上的差异不明显?

foreach(item in mylist) { 
CallSQLStoredProc(item.id); 
} 

VS

int[] ids; // array of ids 
CallSQLStoredProc(ids) // stored procedure returns more than one row for each id 

回答

11

第二个选项肯定会更快,因为它是一个单一的网络往返,以及单一的SP调用。

0

在每个页面加载时,还是第一次加载页面?我不想为ASP.NET页面中的每个回发做这件事。

要更直接地回答您的问题,如果您能够通过发送多个ID获取多条记录,请执行此操作。如果您需要超过10个项目,则效率更高,可扩展性更高。

0

这一切取决于PROC是如何编码的,如果你在10个项目通过在第二PROC和PROC然后使用游标让那些行,那么第一次调用可能会更快

2

Definetly第二,不同的从大约10倍快一点到快一点。

如果你正在使用ID做的事情可以在一个集合操作中完成,你将获得比单独调用SP好几倍的性能增益。

我经常有特效看起来像:

create procedure proc (@ids varchar(max)) as 
select * from users_tbl u 
inner join spiltCSVs(@ids) c 
    on c.id = u.id 
--so on and so forth 

这是一套基于操作;而不是在proc中使用游标的过程方法,或者使用for循环遍历调用具有单个id的过程。

+0

你使用哪个db? 我正在SQL Server中寻找这个函数“spiltCSVs”。 谷歌“spiltCSVs”返回我1结果:-) – 2009-03-24 03:46:05

+0

这是一个实用功能,每个人都根据需要自行编写。 http://stackoverflow.com/questions/314824/t-sql-opposite-to-string-concatenation-how-to-split-string-into-multiple-recor – 2009-03-24 13:21:29

1

因为这将不适合在ocdecio的回答评论...

只是为了扩大它...在我所见过的网络流量大部分系统是性能的限制因素(假设一个合理调整的数据库和前端代码,并不是绝对可怕的)。即使您的Web服务器和数据库服务器位于同一台计算机上,如果您在这两者之间频繁来回呼叫,则进程间通信也可能是一个限制因素。

0

第二个要快多少取决于太多的东西。与结果集的大小相比,网络开销可能是微不足道的。

还有另一种选择(它应该比锁定行为更快),即call all of them asynchronously - 那么当最长的页面完成时,您的页面可以有效地完成。显然,这将需要一些额外的编码。

在这个例子中,只有一个SP开销。我们假设该SP返回单个行集客户端将拆分/过程或多个行集:

int[] ids; // array of ids 
CallSQLStoredProc(ids) // stored procedure returns more than one row for each id 

在这个例子中,SP调用开销N次单呼。和调用序列:

foreach(item in mylist) { 
    CallSQLStoredProc(item.id); 
} 

在第三种方式:

foreach(item in mylist) { 
    StartSQLStoredProc(item.id); 
} 

// Continue building the page until you reach a point where you absolutely have to have the data 

wait(); 

这仍然具有n个DB调用的开销,但性能的提升可以依赖于SQL服务器和网络的能力为了平行工作量。此外,您还可以在页面构建时启动SQL Server的工作。

单个SP解决方案仍然可以胜出,特别是如果它可以用UNION组装SQL Server可以并行化任务的单个结果集。但是,如果结果集具有单独的模式或者UNION不能很好地执行,多个SP异步解决方案可以将其打败(并且还可以利用在页面中执行其他工作的能力)。

0

迭代任何事情总是会导致更多的开销。迭代改善性能的情况并不多。

我的建议一向以避免编程两两件事:

  1. 如果然后其他statments
  2. 迭代

你将永远在那里你会使用这两种情况下,但少您使用它们时,您的应用程序运行得越快,越顺利。

0

如果您希望在您的应用程序中具有可伸缩性,您将尽可能使用缓存。您应该只运行一次共享查询并将结果存储在缓存中。

至于你的查询,假设你没有在每个ID的查询中使用游标,只要网络延迟对你的操作产生了有意义的影响,它应该更快。如有疑问,请测量。当我实际上对我的功能进行计时以了解不同的事情需要多长时间时,我感到非常惊讶。

在.net System.Diagnostics.StopWatch是你的朋友:)。