1

我需要做的是:我得到一个包含 100000 个值的数组,对于每个值我需要进行相同的查询,只需更改该特定值。现在,我在想,如果我在我的 c#/java 代码中循环所有这些值并进行查询,那将需要很多时间。我的另一个选择是在我的数据库中完成所有工作,填充一个临时表,然后从该临时表中读回我的代码。

做这种事情的最快方法是什么?

private void GetValues(List<Element> _Elements)
    {
        foreach (Element e in _Elements)
        {
            using (OracleCommand cmd = new OracleCommand())
            {
                cmd.Connection = _conn;
                cmd.CommandText = "select value from table where something = " +e.Indicator;
                using(OracleDataReader r = cmd.ExecuteReader());

                   while (r.Read())
                   {
                       e.setvalue = r.GetString(1);
                   }

                   r.Close();
                }
            }
        }
    }

[编者注:问题最初并不清楚它是 C# 还是 Java ——但这些语言在很大程度上是等效的,答案应该适用于两者。]

4

3 回答 3

2

做一个查询,

select value from table where something between min and max;

或者

select value from table where something in (a, b, c, ... );

或者

select value from table where something in 
    (select things from tempTable);

或者

select value from table where something in
    (select things from @tablevariable);

这些方法中的哪一种最适用于您的数据库和问题。

一遍又一遍地重复所有处理,而不是合并结果必须比首先采用基于集合的方法慢。


这完全取决于Indicator属性的类型和分布Element List

于 2013-07-10T10:06:13.133 回答
1

更快的方法是使用动态查询。在一个循环中,您构建一个语句以一次使用多个值。

在您提供的示例中,这意味着建立这样的陈述。

  • 查询1: select value from table where something in (n1, n2,... ,n500)
  • 查询2: select value from table where something in (n501, n502,... ,n1000)
  • 等等

根据您面临的(字符?)限制,您可能根本不需要进行多次查询。

于 2013-07-10T10:11:34.400 回答
0

有很多优化技巧,但对于您的具体情况,这里有 2 个:

  1. 尝试一口气做所有事情,@Jodrell 为此提出了非常好的想法。
  2. 从数据库中检索尽可能少的数据,只选择您需要的字段。
于 2013-07-10T10:11:14.557 回答