以下是该方案:
您有一个Microsoft SQL Server数据库支持的ASP.Net应用程序,对于此示例,将不会有任何缓存。
对于Web应用程序中的每个页面,效率更高:
尝试将您需要的所有内容压缩到一个(或几个)存储过程调用中,这些调用返回包含您需要的所有数据的多个表(保存到数据集中),
或
使每个调用分开(通过datareader读取每个调用),具体取决于它在逻辑上的意义。
我问的原因是我总是以第二种方式做事:创建连接到数据库的简单方法并为我拥有的每个小任务获取一些数据(即填充特定下拉列表的方法,另一个用于主要的下拉列表)页面信息等。)
我担心的是,当请求页面时最终会发生什么,如果我查看服务器的SQL事件探查器,最终会有大约10个左右的单页请求调用。那太过分了吗?在我看来,通过与任务相对的页面来压缩数据收集似乎更有效。有人有这方面的经验吗?
答案 0 :(得分:3)
我日常工作的很大一部分工作是使用由600多个表sql server数据库支持的巨大WinForms应用程序。
我们这样做是第一种最小化网络流量的方法。人们认为,单个凸出的信封比装满信封的邮袋更好。
此外,捆绑传输数据不应与紧耦合相混淆 - 收集数据的SQL可以像以前一样模块化,与伞存储过程或视图轻轻绑定在一起。
答案 1 :(得分:3)
不要按页面分组数据。你是如此紧密地耦合数据和表示。如果明天数据必须在差异页面上怎么办?
答案 2 :(得分:2)
启用连接池后,没有太多优势(如果有的话)将多个数据库调用压缩为一个,如您所建议的那样。即使每个调用打开并关闭数据库连接,在需要多次调用数据库的情况下获取数据也没有任何问题。这是因为启用了池,每次都不会真正打开和关闭连接。
如果您的应用程序是Windows客户端应用程序,那么如果客户端和服务器之间的网络速度特别低,则将调用“捆绑”为一个可能是有意义的。您正在使用Web应用程序,因此此处的相关连接速度在Web服务器和数据库服务器之间,这应该不是问题。
捆绑您的数据只是额外的工作,没有收益。
答案 3 :(得分:1)
如果您真的想知道哪种方式更有效,那么您将需要分析每种方法。每种方法都有太多变量可能会在页面之间以及代码与我之间产生不同的结果。
但总的来说:
多次调用数据太多(sql连接和网络流量开销),
尝试仅提取您需要的内容(如果必须,请获取特定于您网页的数据集),
调整查询性能。 (通过使用适当的查询技术获得的收益 - 参数化查询/存储过程,适当的索引等 - 对任何事情都有帮助)
要添加到fall和edg的注释,您应该注意保持数据(模型)和页面(视图/演示文稿)由控制器层隔离。可以使控制器层以您选择的任何一种方式获取视图的数据(以更高效率为准)。这种模式(MVC / MVP)将允许您拥有非常易于管理和可重用的代码,并允许您在测试不同方法时有更多的余地。
答案 4 :(得分:0)
在我将一个在不同页面上有许多下拉控件的网络应用程序组合在一起时,我曾有过类似的担忧。我看了一下SQL Profiler,我得到了超过20次点击只是为了填充我的下拉菜单。在这里我做了什么,也许它会帮助你。
我的选项列表表名称(虚构)
所以我所做的是创建一个返回DataSet的静态方法GetPicklistData(String [] tablename)。所以我的Page_Load方法看起来像这样:
protected void Page_Load(object sender, EventArgs e)
{
DataSet ds = PicklistHelper.GetPicklistData(
new String[]{"pl_usertypes","pl_projecttypes","pl_stattypes"});
// Bind dropdowns
ddl_a.DataSource = ds.Tables[0]; // pl_usertypes
ddl_a.DataBind();
ddl_b.DataSource = ds.Tables[1]; // pl_projecttypes
ddl_b.DataBind();
ddl_c.DataSource = ds.Tables[2]; // pl_stattypes
ddl_c.DataBind();
}
因此,当我检查SQL事件探查器时,它会读取
Select * from pl_usertypes; Select * from pl_projecttypes; Select * from pl_stattypes;
很明显,GetPicklistData()正构建我的select语句。
这可能是我的“肛门”,但是嘿,我不知道为什么我还要查看SQL Profiler。 :)
答案 5 :(得分:0)
这取决于您的内容后端发生变化的频率,?您可以输出很多内容“for XML”并让您的网站读取xml