【问题标题】:Optimal way to iterate over rows from Oracle in C# Multi thread在 C# 多线程中从 Oracle 迭代行的最佳方法
【发布时间】:2017-08-02 04:40:22
【问题描述】:

我正在使用 Oracle 12c 数据库,我想知道在 C# 中对选择查询的结果进行迭代的最佳方式是什么。一旦我得到行值,我就用它来做一些工作。

我的想法是使用完整的处理器容量,所以我认为每个 cpu 核心需要一个线程,每个线程都有自己的连接,用于获取 (select count(*) from table where condition)/(cores ) 行,然后每个线程开始工作。

每个表有超过 500000 行。

我是对的还是有更好的方法来做到这一点?

提前谢谢你,我为我的英语道歉。

【问题讨论】:

  • 你想用这些数据做什么?
  • 这取决于用户想要做什么。例如,有时数据是方程的 x,其结果用于更新我从数据库中获取的行的值并在另一个表上进行一些插入。

标签: c# multithreading oracle loops select


【解决方案1】:

这一切都取决于... :)。

它们都放在同一个盒子上吗? Oracle 和你的程序?

如果不是,那么连接数不应该是 CPU 内核数的函数!它应该取决于您的网络基础设施,与您的程序的盒子和与您的数据库的盒子之间的连接数。有时,即使在一个物理连接上也可以通过多个 DB 连接获得更高的吞吐量,但它有自己的限制,只要 DB 不为一个请求提供最大资源,而是为多个请求共享资源,以防万一,当生成请求每个生成的结果行都需要时间。但这最好通过基准测试来决定。

如果您的程序和数据库共享同一个盒子,那么这是不同的场景。在这种情况下,我通常会在我的应用程序一侧使用更少或一半的可用内核,因为数据库也需要内核进行处理,并且大量的结果行不断出现......

这还取决于您接下来对这些行做什么。

【讨论】:

  • 在我的开发环境中,我在同一个盒子中使用所有东西,但在生产中,我的想法是至少有一个用于数据库的盒子。正如我在上面对 tbone 评论的那样,我接下来对行做什么取决于用户想要做什么。感谢您的回复。
  • 您确定需要将 500,000 行带回您的应用程序进行处理吗?在数据库中进行处理怎么样?
  • 也许可以在数据库上执行此操作,但我没有找到一种简单的方法来指定最终用户可以在 DSL 上指定的每个处理女巫,从女巫我得到信息到做C#程序。我在考虑你在谈论 PL/SQL 编程?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-16
  • 2010-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多