DB2 插入性能

我正在尝试从 Excel 文件批量插入 DB/2。我在 Windows 10 电脑上运行 WildFly 12。DB/2 在 CentOS 7 下的 VM 上运行。

使用 POI SAX 方法,读取包含 2.5M 记录的完整 XLSX 文件需要 80 秒。

我开始在 EJB 程序中使用简单的插入,将文字插入到表中。这花了大约 1.5 小时。

阅读https://www.idug.org/p/bl/et/blogid=2&blogaid=602后,我改为使用批处理准备语句。我还首先写入全局临时表,最后使用“INSERT INTO SELECT ... FROM”。

关闭自动提交。

最终结果仍然需要一个小时,即每秒 750 次插入。

准备物品:

       // get connection using DriverManager class

        try {

            connection = DriverManager.getConnection(

                    "jdbc:db2://192.168.0.5:50000/mydb",

                    "hussain", 

                    "hussain");

        } catch (SQLException e1) {

            out.println("Failed to get connection");

            e1.printStackTrace();

            return;

        }


        // Clear the table

        try {

            Statement statement = connection.createStatement();

            statement.execute("TRUNCATE TABLE " + strMainTable + " IMMEDIATE");

            statement.execute("ALTER TABLE " + strMainTable + " ALTER COLUMN ID RESTART WITH 1 ACTIVATE NOT LOGGED INITIALLY");

            statement.close();

        } catch (SQLException e2) {

            out.println("Failed to clear table<br>");

            e2.printStackTrace();

            return;

        }

        try {

            Statement statement = connection.createStatement();

            statement.execute("DROP TABLE " + strTempTable);

            statement.close();

        } catch (SQLException e2) {

            out.println("Failed to delete table<br>");

        }

是的,DB/2 在虚拟机中运行,因此写入速度受到很多因素的影响。尽管如此,750 条记录/秒还是非常慢的。文章作者说他最差的速度是3000/s,最好的是140k/s。能靠近就好了。


我还应该看什么?


慕桂英546537
浏览 99回答 3
3回答

小怪兽爱吃肉

您的评论线程提到在可接受的时间内填充未记录的会话表(声明的全局临时表),但您发现大部分时间都花在从会话表到最终表进行记录的插入选择上。记录的插入比加载慢得多,但有时是唯一的选择。您还可以使用各种技术来加速 Db2-LUW 上记录的插入速度,这些技术超出了本问题的范围,但 DBA 熟知这些技术。我的建议是使用ADMIN_CMD存储过程调用从光标加载操作来填充最终表。您测试了此方法并发现性能可以接受。请注意,在 HA 配置中,您需要考虑负载的影响,可能需要使用load copy或其他方法进行同步或恢复(数据库恢复等)。如果 Db2 在云服务上运行,则可能还需要重新考虑该方法,具体取决于供应商提供的服务。

江户川乱折腾

您可以关闭对主表的插入记录。alter table main_table activate 最初未记录。该设置将一直保留,直到您进行提交。如果您可以将 Excel 导出为逗号分隔文件,则可以使用加载命令,该命令要快得多。

翻阅古今

更改你的strmaintable&nbsp;Id 列缓存 1000,无顺序。默认生成的id整数非null作为身份(从1开始,递增1,缓存1000,无顺序)https://developer.ibm.com/technologies/databases/articles/dm-0403wilkins/#table5
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java