C# 一个大型数据库查询比许多小型数据库查询有什么优势

C# 一个大型数据库查询比许多小型数据库查询有什么优势,c#,.net,sql,.net-4.0,c#-4.0,C#,.net,Sql,.net 4.0,C# 4.0,我继承了这个应用程序,它所做的是从4个视图中获取数据,其中包含一个(xml文件)1000条记录,然后将它们写在一个xml文件中,所有这些都由一个类型参数分割,该类型参数有9种不同的可能性。这意味着在最坏的情况下,对于该类型/视图组合的每1000个,将有36个到数据库的连接 实际数据将存在90.000行,在这种情况下,900-936次从数据库获取多达1000行数据 现在我想知道,将所有数据读取到应用程序中,并使应用程序使用它来编写900多个文件,会有什么好处 1000行约为800MB,90.000

我继承了这个应用程序,它所做的是从4个视图中获取数据,其中包含一个(xml文件)1000条记录,然后将它们写在一个xml文件中,所有这些都由一个类型参数分割,该类型参数有9种不同的可能性。这意味着在最坏的情况下,对于该类型/视图组合的每1000个,将有36个到数据库的连接

实际数据将存在90.000行,在这种情况下,900-936次从数据库获取多达1000行数据

现在我想知道,将所有数据读取到应用程序中,并使应用程序使用它来编写900多个文件,会有什么好处

1000行约为800MB,90.000行约为81GB的数据传输


如果我们同时阅读所有代码,那么代码将不得不重写,尽管这是一项一次性工作,但会更有意义。在90.000行之后,我们将不再使用此代码。花2、3个小时重写代码,这样可以减少连接量,值得吗?

代码已经可以工作了吗?如果是的话,我就不会花时间重写了。您将面临在代码中引入bug的风险。既然你只会使用一次,再也不会使用它,那么它似乎不值得你为此付出努力。

如果它是一次性的,那么为什么要花费任何努力来优化它呢?回答:没有

不过,让我补充一下,在回答你的一般问题时,一个大的查询比很多小的查询有什么好处:可能没有。如果您运行一个巨大的查询,那么中间件将发挥很大的作用,它可能工作得很好,也可能工作得不好


虽然同时拥有36个连接也不是最佳选择,但这可能比运行一个可能返回80GB数据的查询要好。理想的解决方案(如果您必须多次使用此代码)是重写它以获取数据块,但不要同时打开大量连接。

如果我们谈论的是SQL Server,一个大型查询(单个批次)比许多小型查询的最大缺点是(请注意与您提出的问题相反的意义)每个批次只能有一个查询计划

如果这是一次性工作,我会说不。很多时候我做了我通常不会做的事情(诅咒者),只是因为这是一次性工作

问问你自己,花2到3个小时在已经可以使用的东西上是有意义的,你永远不会再使用它了。不过,显然还有其他因素需要考虑。这样会不会将您的生产数据库锁定2-3个小时


如果没有灾难性的副作用,我会说使用你现有的。

如果这是一次性工作,似乎不值得重写。当我输入完这句话时,它可能已经完成了执行。是否值得花时间重新编写经过测试和使用的一次性代码?如果没有实际问题,我想说你可能会找到更好的时间利用方式……多个请求是否发生在一个事务中?数据是通过Web服务传送还是直接传送到盒子?我想说这些对回答问题很重要。PaulG,对于你的问题,交易的方法将重复936次,使用语句,因此每次连接都应该关闭。这需要花费数小时才能在某个位置的框上运行(在这之前有一些步骤可以在数据库中提供数据)。实际上一次只能连接1个CNN,但在实时情况下,循环中重复936次。如果你的回答正确的话,理想的解决方案就是我现在拥有的。是的,我相信是这样!以块的形式获取数据是处理大数据块的最佳实践。否则,您将依赖任何数量的其他中间系统(SQL server、.NET、LINQ、数据提供程序等)来管理在您和服务器之间来回发送的内容流。在最坏的情况下,应用程序可能会尝试同步加载整个结果。Asp.net可能会以某种方式处理此问题,我不确定默认处理方式是什么,但最好让您的应用程序决定一次请求多少数据是合理的。再观察一次,800兆字节仍然是大量数据,需要一次加载到内存中。内存分配/释放可能会很慢,减少块大小可能会更好。如果应用程序所做的只是读取一行并将其解析为XML文件,并且只需要每行中的数据就可以完成其工作,那么考虑到每行中的大量数据,即使一次只获取一行数据也是合理的。