我如何获得最快的表现?我总是在客户端应用程序上使用计算而不是在程序中进行计我有一张大约10,000行的表来评估。数据库位于托管Web服务器中,我一直在阅读所有行并在我的应用程序中的数据网格中显示。
因此,在我阅读专栏'ProductPrice'和'ProductQty'的路上,我可以计算ProductPrice * Qty并将其存储在应用程序中的另一列中,考虑到要流式传输的数据较少。
以下哪项会更快?
SqlCommand sqlCmdTxt = new SqlCommand(conn);
SqlDataReader sqlRead;
sqlCmdTxt.commandText = "Select ProductPrice, ProductQty, ProductPrice * ProductQty As Total From Stock";
sqlRead = sqlCmdTxt.ExecuteReader();
while (
sqlRead.Read()) {
double price = sqlRead.GetDouble(0);
double qty = sqlRead.GetDouble(1);
double sum = price * qty;
dataGridView.rows.add (new object[] {price, qty, sum});
}
或
SqlCommand sqlCmdTxt = new SqlCommand(conn);
DataSet dSet = new DataSet();
new SqlDataAdapter(new SqlCommand("Select ProductPrice, ProductQty, ProductPrice * ProductQty As Total From Stock"
, conn)).Fill(dSet, "StockList");
dataGridView.DataSource = dSet.Tables["StockList"].DefaultView;
答案 0 :(得分:6)
计算本身可能无关紧要(无论是在服务器还是客户端上完成)。更重要的是物理数据检索(查询执行计划,缓存,群集,分区等)以及从服务器到客户端的数据传输。
在这种特殊情况下,您在两种情况下都使用相同的查询,因此我希望在客户端进行计算只会将(非常少的)时间添加到任何查询本身所需的时间。情况下。
但是,如果你有......
Select ProductPrice, ProductQty From Stock
...与...
Select ProductPrice * ProductQty As Total From Stock
...我希望第二个稍快一些:从服务器转移到客户端,一堆较大的2字段元组(对于第一个查询)可能比传输相同数量的更多时间较小的1字段元组(对于第二个查询)。除此之外,它会占用更多的可用网络带宽,影响其他并发客户端。
如果您需要以任何方式过滤 1 数据,那么使用服务器端WHERE
可能比获取所有数据更快 行到客户端只是为了丢弃那里的大部分行。如果您对数据库性能主题感兴趣,我热烈建议您查看:Use The Index, Luke!
建议:
1 或汇总(SUM
,AVG
,MAX
...)或JOIN
等......
答案 1 :(得分:3)
我的意见是在服务器上进行所有计算 - 它肯定更快。
如果对SQL Server使用较慢的计算机,则可能会在服务器上运行较差的结果。如果您在同一台计算机上运行它,我更喜欢使用SQL Server。
答案 2 :(得分:1)
通常,存储过程更好 - 它不仅从客户端抽象底层数据库模式(为数据层提供更多的API方法),而且它允许SQL引擎操作数据并仅返回结果给你。
正如Branko所说,减少的数据传输可能很重要,但也要查看您的代码:您不仅要执行相同的旧乘法运算,还要运行客户端驱动程序获取并将值转换为double 。这意味着您不仅可以从数据库中获取数据,将其弹出到缓冲区,将该缓冲区传输到客户端,还可以将缓冲的数据读取到您自己的字符串中,然后进行转换。所有这些小的代码层和缓冲区操作都可以加起来,特别是因为你不知道在sql读取调用中创建了什么样的临时缓冲区来为你提供值。
它也完全有可能sql存储过程注意到你要将数据转换为double并提供一个隐藏的双存储器,其中包含为你预转换的数据;如果它知道你想要什么(并且SP总是知道你告诉它),那么它也可以提供很多缓存,所以第二次击中该SP时,它只返回未改变数据的先前结果。
答案 3 :(得分:0)
由于在SQL引擎和应用程序之间传输的数据较少,因此C#中的代码可能会更快。有50K行,这不是很重要,但行数和行数要大得多。保存转移成本的表(可能是通过慢速网络)可以产生显着差异。
第二次在您的服务器上运行此SQL时,SQL可能已缓存结果。所以它可能更快(计算量更少),但仍然会得到转移成本。