2011-05-02 42 views
2

我对perl dbi中嵌套窗体中处理sql的性能有疑问。关于嵌套sql的Perl DBI性能

bascially,什么脚本正在做的是

从DBI

while循环中,

使用连接到DB1

连接到DB2

获取数据来自DB1的数据并创建更新或插入语句

从DB2在DB2中执行SQL

disconenct

断开DB1

现在的问题是,这是最好的做法,当涉及到性能或以下的方法是最好的选择。从DB1

获取日期

将数据写入到一个临时文件

从临时文件中获取数据

process the data to udpate in DB2. 

编辑:我添加了一些连接到DB2后连接到DB1。但那不是我想要创造的点。这更多的是关于服务器从存储数据的数据库服务器和磁盘读取的I/O和系统调用的性能问题。

如果你看看第一种方法。

内部循环。 脚本从DB1 获取一行数据,并等待在DB2中处理返回的数据。

如果有成千上万的记录,什么时候你在做系统的thousnds对性能的影响服务器调用从磁盘读取数据

+4

连接到DB在while循环不是一个好主意。您应该在脚本的开头连接到DB2。在这一点上,我没有看到其他的东西在第一段代码中有所改进。 – 2011-05-02 18:26:57

回答

1

断开,如果有成千上万的记录,什么时候你在做系统的thousnds对性能的影响调用服务器读取来自磁盘的数据

成千上万的记录,这并不多,因为典型的小记录或平均记录大小。您不知道数据是从磁盘实际读取,还是驻留在内存中的缓冲区中。所以你不能确定系统调用的数量。你为什么要打扰?

如果性能对您很重要,我建议您在典型的现实生活场景中测试两种方法。

如果你正在处理一个锁定数据库和一个长期运行的进程(无论出于何种原因),最好一次获得你需要的所有数据(staging file method),这样你就不会持有在整个处理过程中锁定源和目标服务器。

您的选择也可能取决于您对工具或API的熟悉程度以进行批量导入数据。例如,用于MSSQL的bcp.exe是用于导出和导入数据的便捷工具。大多数其他数据库都有类似的工具

2

我只有用Perl温和的经验,但处理Perl和数据库的工作。据我了解,通常最好连接到循环外的数据库 - 这样可以最大限度地减少连接,断开连接和重复连接的开销。

所以...

连接到DB1

连接到DB2

从DB1获取一个while循环中,从DB1

数据

使用数据,并创建一个更新 或insert语句

执行DB2中的sql

从DB1断开DB2

0

我会建议这样做并行,例如,在脚本中使用pipe()fork()。否则大多数时候你会等待网络IO。所以它就像

(SELECT, serialize, print) | (read line, deserialize, INSERT_OR_UPDATE)