【问题标题】:Oracle insert lots of data to temporary tableOracle向临时表插入大量数据
【发布时间】:2017-08-20 06:37:03
【问题描述】:

我需要在临时表中插入 12000 个字符串,每个字符串 6 个字符。目前我正在使用 SELECT Code FROM Articles where Code = '111111' OR Code = '222222' ... 命令执行此操作,该命令有 400 000 个字符,执行时间为 20 秒。我想知道如何加快这个过程?

我不需要对我的代码进行任何验证。它们需要作为查询的一部分或作为命令参数从应用程序传输到数据库。

我真的不需要Select Code From Articles,但是oracle不支持INSERT INTO (...) VALUES (...)中的多条记录

【问题讨论】:

  • 您在查询中使用的代码列表(111111 等)来自哪里?另一个表,一个文件,用户输入,...?
  • 好点,将其添加到问题中。我认为命令参数是合理的方式。
  • 它们是如何保存在应用程序中的,您使用的是什么语言/连接类型?您可以传递一个值数组并将其视为一个集合。
  • 我从 mysql 数据库中获取这些值。有一个存储过程可以执行SELECT Code FROM Sometable。我的应用程序采用所有这些代码并尝试将它们传递给 oracle 临时表。在后端,我使用 C# 和 devart MySql 驱动程序。
  • Maybe something like this,但您的 Oracle 类型创建为字符串而不是数字。然后,您不必根据有多少值来构造语句,只需传递一个数组绑定变量。

标签: sql database plsql oracle10g


【解决方案1】:

IN 通常比OR 快,因为它一旦满足条件就会停止评估。见前qhere

所以:

Select code
from Articles
where Code in ('111111','222222')

为了允许非常大的列表,元组:

Select code
from Articles
where ('1', Code) in (('1','111111'),
                      ('1','222222')...)

【讨论】:

  • 它必须有多个 IN 子句 ORd 一起,当然,如果要查找 12000 个值,
【解决方案2】:

正如@AlexPoole 指出的那样,最好使用表值参数。

type t_varchar_tab is table of varchar2(10) index by pls_integer;
procedure insert_table(i_id_tab in t_varchar_tab);

正文:

  procedure insert_table(i_id_tab in t_varchar_tab) is
  begin
  -- if You have temporary table You do not want commits here
  forall i in i_id_tab.first .. i_id_tab.last
      insert into MY_SCHEMA.MY_TABLE
      VALUES (i_id_tab(i));
  end ins_test;

C#:

        using (OracleCommand dbCommand = connection.CreateCommand())
        {
            dbCommand.CommandText = "MY_SCHEMA.MY_PACKAGE.insert_table";
            dbCommand.CommandType = CommandType.StoredProcedure;

            var inputArray = new OracleParameter
            {
                Direction = ParameterDirection.Input,
                CollectionType = OracleCollectionType.PLSQLAssociativeArray,
                Value = StringList.ToArray()
            };
            dbCommand.Parameters.Add(inputArray);
            await dbCommand.ExecuteNonQueryAsync();

谢谢亚历克斯!

【讨论】:

    猜你喜欢
    • 2012-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-02
    相关资源
    最近更新 更多