选择30,000行到数组的最佳DBI方法

时间:2013-12-04 02:08:27

标签: oracle perl benchmarking dbi

我是Perl的新手并且正在掌握它。

这是一个两阶段问题。

问题1: Perl DBI有几种从数据库表中获取数据的方法。

我将一列数据从Oracle DB返回到数组中 以每个结果集放入其自己的元素的方式,我们讨论的是30,000行数据。

这是我的代码

@arr_oracle_rs = @{$dbh->selectcol_arrayref($oracle_select)}; 

我想知道这是否是最快的方法,还是应该使用其他DBI方法?

由于网络延迟,当前数据库负载等很难分辨出最快,最有效的方法来获取数据并放入数组中。

我只是想知道有知识的人是否可以告诉我我是否正在使用正确的方法完成这项任务。

https://metacpan.org/pod/DBI#Database-Handle-Methods

selectrow_array()
selectrow_arrayref()
selectrow_hashref()
selectall_arrayref()
selectall_hashref()
selectcol_arrayref()

问题2:

确定上述选择查询是否成功运行的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

我假设您使用的是DBD :: Oracle。

不要试着再次猜测引擎盖下发生了什么。首先,默认情况下,DBD :: Oracle一次性获取多行(参见https://metacpan.org/pod/DBD::Oracle#RowCacheSize)。

其次在您的示例中,您已经有一个数组并将其复制到另一个数组 - 这是浪费时间和内存,即selectcol_arrayref返回对数组的引用,然后取消引用它,然后将其复制到@arr_oracle_rs。只需使用返回的数组ref。

第三,我们不能说什么是最快的,因为你没有告诉我们你将如何使用返回的数组。根据您对数组所做的操作,实际上可以更快地绑定列,重复调用fetch并执行每行所需的任何操作(需要更少的内存并且不重复创建标量)或者可能更快地获取所有数据一行中的行(需要更多的内存和大量的标量创建)。

我实际上没有看过selectcol_arrayref是如何工作的,但是因为它必须从每一行中选择第一列它/可能/也可以使用selectall_arrayref如果您最终使用selectall方法。

在所有这些事情中,你必须自己对解决方案进行基准测试。

正如mpapec所说,RaiseError是你的朋友。