Oracle 将大量数据插入临时 table
Oracle insert lots of data to temporary table
我需要在临时 table 中插入 12000 个字符串,每个字符串 6 个字符。目前我正在使用具有 400 000 个字符并需要 20 秒执行的 SELECT Code FROM Articles where Code = '111111' OR Code = '222222' ...
命令。我想知道如何加快这个过程?
我不需要对我的代码进行任何验证。它们需要作为查询的一部分或作为命令参数从应用程序传输到数据库。
我真的不需要做Select Code From Articles
,但是oracle不支持INSERT INTO (...) VALUES (...)
中的多条记录
IN
通常比 OR
快,因为它在满足条件后立即停止计算。见上一个问题 here
所以:
Select code
from Articles
where Code in ('111111','222222')
为了允许非常大的列表,元组:
Select code
from Articles
where ('1', Code) in (('1','111111'),
('1','222222')...)
正如@AlexPoole 指出的那样,最好使用 table 值参数。
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();
谢谢亚历克斯!
我需要在临时 table 中插入 12000 个字符串,每个字符串 6 个字符。目前我正在使用具有 400 000 个字符并需要 20 秒执行的 SELECT Code FROM Articles where Code = '111111' OR Code = '222222' ...
命令。我想知道如何加快这个过程?
我不需要对我的代码进行任何验证。它们需要作为查询的一部分或作为命令参数从应用程序传输到数据库。
我真的不需要做Select Code From Articles
,但是oracle不支持INSERT INTO (...) VALUES (...)
IN
通常比 OR
快,因为它在满足条件后立即停止计算。见上一个问题 here
所以:
Select code
from Articles
where Code in ('111111','222222')
为了允许非常大的列表,元组:
Select code
from Articles
where ('1', Code) in (('1','111111'),
('1','222222')...)
正如@AlexPoole 指出的那样,最好使用 table 值参数。
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();
谢谢亚历克斯!