【发布时间】:2012-07-24 06:09:00
【问题描述】:
我正在使用 C# .NET 4.0 应用程序,它使用 ODP.NET 11.2.0.2.0 和 Oracle 11g 数据库。该应用程序预加载了一些带有数据的查找表,并且由于大多数的记录少于 20 条,因此脚本运行得非常快。但是,其中一个脚本有 802 条记录,并且需要 248.671 秒来插入记录,对于这样的少量数据和一个宣传大量数据的快速操作的数据库来说,这似乎是多余的。
所以我想知道,有没有比当前编写脚本的方式更快的方式通过脚本插入数据?
要插入的表是这样定义的:
CREATE TABLE FileIds
(
Id NUMERIC(38) NOT NULL
,Name NVARCHAR2(50) DEFAULT 'Unknown' NOT NULL
,FileTypeGroupId NUMERIC(38) NOT NULL
,CONSTRAINT FK_FileIds_FileTypeGroups FOREIGN KEY ( FileTypeGroupId ) REFERENCES FileTypeGroups ( Id )
)
要插入的脚本如下所示:
BEGIN
INSERT ALL
INTO FileIds ( Id, FileTypeGroupId ) VALUES (1152,5)
INTO FileIds ( Id, FileTypeGroupId ) VALUES (1197,10)
INTO FileIds ( Id, FileTypeGroupId ) VALUES (1200,6)
INTO FileIds ( Id, FileTypeGroupId ) VALUES (1143,3)
INTO FileIds ( Id, FileTypeGroupId ) VALUES (1189,9)
INTO FileIds ( Id, FileTypeGroupId ) VALUES (1109,7)
INTO FileIds ( Id, FileTypeGroupId ) VALUES (1166,4)
INTO FileIds ( Id, FileTypeGroupId ) VALUES (0,8)
INTO FileIds ( Id, FileTypeGroupId ) VALUES (1149,2)
INTO FileIds ( Id, FileTypeGroupId ) VALUES (1400,1)
INTO FileIds ( Id, FileTypeGroupId ) VALUES (1330,11)
INTO FileIds ( Id, FileTypeGroupId ) VALUES (1000,0)
-- 790 Records removed for example purposes.
SELECT * FROM DUAL;
COMMIT;
END;
外键中引用的 FileTypeGroups 表是在加载 FileIds 表之前预加载的。没有与 FileIds 表关联的序列或触发器,并且尚未为该表创建索引。
【问题讨论】:
-
对我来说看起来不错。已经通过 Database Tuning Advisor 检查出了什么问题?
-
没有。我对 Oracle 还是很陌生,对 Database Tuning Advisor 一无所知。是像 SQL Developer 这样的单独应用,还是需要加载到 SQL Developer 中的包?
-
什么版本的Oracle?一些精简的版本没有所有的工具。必须有其他事情发生,因为即使在最慢的硬件上,802 记录也需要不到一秒钟的时间。确保没有其他可能持有锁的事务。
-
C# 可以做“批处理语句”吗?在 Java 中,使用 Oracle JDBC 驱动程序的速度非常快。
-
@JOTN 根据sqlplus,版本为:Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production,PL/SQL Release 11.2.0.3.0 - Production,CORE 11.2.0.3。 0 生产,64 位 Windows 的 TNS:版本 11.2.0.3.0 - 生产,NLSRTL 版本 11.2.0.3.0 - 生产