当记录>为什么查询性能急剧下降?大约600

时间:2016-03-20 09:20:30

标签: java spring oracle mybatis

当我使用" 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

(我更改了列和变量的名称。上层查询正在运行)

请帮帮我〜

2 个答案:

答案 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 加载器,网络延迟会破坏你的性能!!)。使用存储过程进行进一步处理。