当我使用" INSERT ALL"时,为什么查询性能会急剧下降?在Oracle中查询大于600条记录? 你能教我吗?
我使用的是Spring + Mybatis + Oracle
以下是我的查询。
INSERT ALL
<foreach collection="list" item="record">
INTO tablename (
a,
b,
c,
d,
e,
f,
g,
h,
i,
j,
k,
l,
m,
n,
o
) VALUES (
#{a},
#{b},
#{c},
#{d},
#{e},
#{f},
#{g},
#{h},
#{i},
#{j},
#{k},
#{l},
#{m},
#{n},
#{o}
)
</foreach>
SELECT 1 FROM dual
(我更改了列和变量的名称。上层查询正在运行)
请帮帮我〜
答案 0 :(得分:2)
正如@kordirko所提到的,它很可能很慢,因为您使用MyBatis插入不会进行批处理。
这是多行插入示例from MyBatis docs:
<insert id="insertAuthor" useGeneratedKeys="true"
keyProperty="id">
insert into Author (username, password, email, bio) values
<foreach item="item" collection="list" separator=",">
(#{item.username}, #{item.password}, #{item.email}, #{item.bio})
</foreach>
</insert>
因此尝试以这种方式使用它:
INSERT INTO tablename (
a,
b,
c,
d,
e,
f,
g,
h,
i,
j,
k,
l,
m,
n,
o
) VALUES
<foreach collection="list" item="record">
(
#{a},
#{b},
#{c},
#{d},
#{e},
#{f},
#{g},
#{h},
#{i},
#{j},
#{k},
#{l},
#{m},
#{n},
#{o}
)
</foreach>
答案 1 :(得分:-1)
为什么很难说。通信块的大小,oracle进程的大小,连接类型,正在使用的Oracle数据库的内存配置等等。
但另一个问题是为什么你使用基本上是交易处理的批量(批量)相关工作。如果以600行击中这面墙是一个例外,与它一起生活。如果您需要大量行(数千个),并且经常需要查看批处理技术。
远离XML和可能面向对象的技术。使用工具作为ftp将数据集传输到数据库服务器。使用外部表或sql 加载器将数据导入数据库。 (不要通过网络连接使用sql 加载器,网络延迟会破坏你的性能!!)。使用存储过程进行进一步处理。