簡體   English   中英

在while循環中添加postgres查詢時,PHP腳本非常慢

[英]PHP script very slow when adding postgres query in a while loop

我有一個PHP腳本,可以遍歷2000 +-記錄while循環。 在此while循環中,必須執行postgres sql查詢,但是不能將其從while循環中排除。

$sql = "(SELECT (timestamp) AS time FROM followups as f 
          JOIN campaigns as c ON c.id = f.campid 
           WHERE c.clientid = ".trim($clientid)." AND c.contractno = '".trim($c)."' AND (LOWER(person) IN (SELECT LOWER(userid) FROM users WHERE type IN('S','X')) OR LOWER(person) IN (SELECT LOWER(name) FROM users WHERE type IN('S','X'))) )
            UNION ALL (SELECT (timestamp) AS time FROM followups as f WHERE (contractno ='".trim($c)."' 
             OR contractno LIKE '%".trim($c)."||".trim($clientid)."%' 
              OR contractno = '".trim($c)."||".trim($clientid)."') AND (LOWER(person) IN (SELECT LOWER(userid) FROM users WHERE type IN('S','X')) OR LOWER(person) IN (SELECT LOWER(name) FROM users WHERE type IN('S','X')))     ) 
                UNION ALL (select (f.timestamp) AS time FROM followups as f 
                 JOIN campaigns as c on c.id = f.campid WHERE c.clientid = ".trim($clientid)." 
                  AND c.clientid in ( 
                   SELECT id FROM easy_mapping where id = ".trim($clientid).") AND (LOWER(person) IN (SELECT LOWER(userid) 
                    FROM users WHERE type IN('S','X')) OR LOWER(person) IN 
                     (SELECT LOWER(name) FROM users WHERE type IN('S','X'))))";
$result = pg_query($conn,$sql);

上面的查詢包含在while循環中,前幾條記錄執行得非常快,然后腳本開始變慢,幾乎需要一天的時間來完成腳本。 有沒有一種方法可以不同地編寫上面的確切查詢以獲得相同的結果?

更新:

這是完整的循環

$dates = array();
$clientid = str_replace("\t", '', $clientid);
foreach ($contracts as $c) {
    $c = str_replace("\t", '', $c);
    $sql = "(SELECT MAX(timestamp) AS time FROM followups as f
    JOIN campaigns as c ON c.id = f.campid
    WHERE c.clientid = ".trim($clientid)." AND c.contractno = '".trim($c)."' AND (LOWER(person) IN (SELECT LOWER(userid) FROM users WHERE type IN('S','X')) OR LOWER(person) IN (SELECT LOWER(name) FROM users WHERE type IN('S','X'))) )
    UNION ALL (SELECT MAX(timestamp) AS time FROM followups as f WHERE (contractno ='".trim($c)."'
    OR contractno LIKE '%".trim($c)."||".trim($clientid)."%'
    OR contractno = '".trim($c)."||".trim($clientid)."') AND (LOWER(person) IN (SELECT LOWER(userid) FROM users WHERE type IN('S','X')) OR LOWER(person) IN (SELECT LOWER(name) FROM users WHERE type IN('S','X')))     )
    UNION ALL (select MAX(f.timestamp) AS time FROM followups as f
    JOIN campaigns as c on c.id = f.campid WHERE c.clientid = ".trim($clientid)."
    AND c.clientid in ( SELECT id FROM easy_mapping where id = ".trim($clientid).") AND (LOWER(person) IN (SELECT LOWER(userid) FROM users WHERE type IN('S','X')) OR LOWER(person) IN (SELECT LOWER(name) FROM users WHERE type IN('S','X'))))";
    $result = pg_query($conn,$sql);
    if (pg_num_rows($result)>0) {
        while ($row = pg_fetch_array($result, null, PGSQL_ASSOC)) {
            if (empty($row['time'])) {
                continue;
            }
            $dates[] = $row['time'];
        }
    }
    pg_free_result($result);
}
if (empty($dates)) {
    return false;
} else {
    $max = max($dates);
    if (strtotime(date("Y-m-d")) < strtotime(date("Y-m-t"))) {
        $compdate = date("Y-m-01", strtotime("-1 month") );
    } else {
        $compdate = date("Y-m-01");
    }
    if (strtotime($compdate) > $max) {
        return false;
    } else {
        return true;
    }
}
unset($dates);

以下是我從您真正的垃圾代碼中可以理解的結果。

$clientid = trim(str_replace("\t", '', $clientid));
$sql = "
select max(time)
from (
(
    select max(timestamp) as time
    from
        followups f
        inner join
        campaigns c on c.id = f.campid
        inner join
        users u on lower(f.person) in (lower(u.userid), lower(u.name)) 
    where
        c.clientid = $clientid
        and u.type in('S','X')
)
union
(
    select max(timestamp) as time
    from
        followups as f
        inner join
        users u on lower(f.person) in (lower(u.userid), lower(u.name)) 
    where
        contractno like ('%' || $clientid || '%')
        and u.type in('S','X')
)
union
(
    select max(f.timestamp) as time
    from
        followups as f
        join
        campaigns as c on c.id = f.campid
        inner join
        users u on lower(f.person) in (lower(u.userid), lower(u.name))
        inner join
        easy_mapping em on c.clientid = em.id
    where
        c.clientid = $clientid
        and u.type in('S','X')
)) s
";
$result = pg_query($conn,$sql);
if (pg_num_rows($result) == 0) {
    return false;
} else {
    $max = $row['time'];
    if (strtotime(date("Y-m-d")) < strtotime(date("Y-m-t"))) {
        $compdate = date("Y-m-01", strtotime("-1 month") );
    } else {
        $compdate = date("Y-m-01");
    }
    if (strtotime($compdate) > $max) {
        return false;
    } else {
        return true;
    }
}
pg_free_result($result);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM