哪种性能更好:存储过程或使用dataadapter执行查询?

时间:2011-09-28 18:01:53

标签: asp.net performance stored-procedures dataadapter

我正在重新编写一个迄今为止运行缓慢的.NET应用程序。我们的数据库是Oracle,代码是用VB编写的。在编写查询时,我通常会将参数传递给构建原始SQL的中间层函数。我有一个数据库类,它有一个函数ExecuteQuery,它接受​​一个SQL字符串并返回DataTable。这使用OleDbDataAdapter在数据库上运行查询。

我找到了一些现有的代码,它们将SQL和一个参数发送到存储过程,据我所知,打开查询并将其输出到SYS_REFCURSOR / DataSet

我不知道为什么会这样设置,但是有人能告诉我哪个性能更好吗?或者这样做的利弊是什么?

提前致谢

2 个答案:

答案 0 :(得分:0)

存储过程肯定会比在代码中构建原始查询并执行它有更好的性能,但重要的是要认识到,性能上的差异不会是您的性能问题,还有许多其他事情会影响性能不仅仅是将查询更改为存储过程,即使您运行存储过程并使用适配器,数据表,数据集处理结果,您仍然会产生很多性能,特别是如果您通过周围的那些大型对象(我已经看到了在Web服务调用中返回数据集的情况),因此,不要关注它,专注于缓存数据,拥有良好的查询,创建正确的索引,最小化数据集的使用,数据表,这将产生比仅将查询移动到存储过程更好的好处

答案 1 :(得分:0)

存储过程与动态SQL具有完全相同的性能。换句话说,一个在另一个上没有性能优势。 (顺便说一下,由于其他一些原因,我非常相信将存储过程用于所有事情,但这不是手头的主题。)

出于各种原因可能会出现瓶颈。

首先,如果您实际上是生成select语句的代码,则很可能这些语句对于应用程序所需的数据非常不优化。例如,执行一个SELECT *,它会拉回50列而不是SELECT ID, Description,只需在应用程序中提取您需要的两个列。在此示例中,必须从磁盘读取,通过网络传输并推送到Web服务器的内存中的对象的数据量并非无足轻重。

必须根据具体情况对这些进行评估。

我强烈建议,如果你有一个“慢”的应用程序,你需要提高第一件事的性能,你应该做的是分析应用程序。它的哪一部分运行缓慢?它可能位于数据库服务器内部,可能位于中间层,甚至可能是您的Web服务器上的网络带宽或内存/负载限制的函数。哎呀,甚至可能有一个WAIT命令潜伏在那里的某个以前程序员离开公司的位置......

简而言之,您现在完全不知道从哪里开始。因此,查看实际代码还为时过早。去配置应用程序,看看事情正在放缓。您可能会发现,只需在数据库服务器中添加更多内存,性能就可以从根本上提高....这比重写,测试和部署大量代码要便宜得多。