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

Getting faster results from 2 databases to form 1 resultset

这是我的场景...

bug_tracker table 在一台服务器上,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 数据库链接。

PHP 不适用于这种操作,您也不应尝试编写自己的连接函数。

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

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

这就是数据仓库世界中通常所说的 ETL 过程,在这种情况下,非常非常简单。

您可以使用 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)) {
        // ...
    }

?>

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