从2个数据库获得更快的结果以形成1个结果集

时间:2015-05-21 18:46:41

标签: php oci

所以这是我的情景......

enter image description here

bug_tracker表位于一个服务器中,task_traker位于另一个服务器中。

我希望显示一个综合结果但不能,因为远程有两个独立的数据库。

所以我首先调用任务跟踪器,然后每次迭代获取错误详细信息。

$task = oci_parse($task_conn, "select * from task_table where ....");
oci_execute($task);  
while ($task_row = oci_fetch_array($task, OCI_ASSOC+OCI_RETURN_NULLS)) {
    $bug = oci_parse($bug_conn, "select * from bug_table where id = " . $task_row['BUGID'] );
    oci_execute($bug);  
    while ($task_row = oci_fetch_array($task, OCI_ASSOC+OCI_RETURN_NULLS)) {
        ... //output
    }
    ... //output
}

但是整个过程非常缓慢......因为有大量的记录和列。

有没有办法让它甚至更快?注意:我没有访问权限,因此无法设置oracle db links。

2 个答案:

答案 0 :(得分:1)

PHP不适用于此类操作,也不应该尝试编写自己的连接函数。

解决此问题的一种正确方法是将两个数据库中的数据转储到本地数据库中,然后执行连接。 你不需要任何花哨的本地数据库,SQLite3可能就足够了。

使用放入cron的bash脚本将数据从每个数据库转储到CSV文件中。转储后,(重新)在SQLite3中创建每个表,并将CSV加载到这些表中。在此之后,您可以执行一次连接并将结果推送到一个新表中,然后您可以自由查询。

这就是数据仓库世界中经常被称为ETL过程的东西,就这种情况而言,非常简单。

答案 1 :(得分:1)

您可以使用IN语句改进它:

<?php
    $task = oci_parse($task_conn, "select * from task_table where  ....");
    oci_execute($task);  

    while ($task_row = oci_fetch_array($task, OCI_ASSOC+OCI_RETURN_NULLS)) {
        $bugs[] = $task_row['BUGID'];
        $users[] = $task_row['USER'];
        $status[] = $task_row['TASK_STATUS']; 
    }

    $bug = oci_parse($bug_conn, "select * from bug_table where id IN (" . implode(',', $bugs) . ");" );
    oci_execute($bug);  

    while ($task_row = oci_fetch_array($task, OCI_ASSOC+OCI_RETURN_NULLS)) {
        // ...
    }

&GT;

在旁注中,为什么不使用PDO?我相信使用它已经可以提升你的性能。