[英]PHP script very slow when adding postgres query in a while loop
I have a PHP script that loops through 2000+- records uisng a while loop. 我有一个PHP脚本,可以遍历2000 +-记录while循环。 Within this while loop a postgres sql query has to be performed, unfortunately it can't be excluded from the while loop.
在此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);
The query above is included in the while loop, the first few records perform very quickly and then the script starts to slow down, taking almost a day to complete the script. 上面的查询包含在while循环中,前几条记录执行得非常快,然后脚本开始变慢,几乎需要一天的时间来完成脚本。 Is there a way to write the exact query above differently to gain the same results?
有没有一种方法可以不同地编写上面的确切查询以获得相同的结果?
UPDATE: 更新:
Here's the complete loop 这是完整的循环
$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);
The following is the result of what I can understand from your really junkish code. 以下是我从您真正的垃圾代码中可以理解的结果。
$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.