Ускорьте оператор обновления SQL, который зациклен на операторе выбора - PullRequest
0 голосов
/ 26 декабря 2018

Найден SQL-запрос в коде, выполнение которого занимает 31 минуту (1900 секунд).Сначала оператор select захватывает 1955 строк, затем код перебирает эти строки для запуска обновления на основе числа внутри этого набора записей.Таблица, через которую он проходит, имеет 14 000 строк.Как я могу ускорить это?

$sql = "select id, did, customer_id from dids";
        $rs = $db->PDOquery($sql, $qry_arr);
        //Loop through all DIDs and attach to cdrs  select id, did, customer_id from dids   
        while($row=$rs->fetch()){                           
            $qry_arr = array(':did_id' => $row['id'],
                        ':customer_id' => $row['customer_id'],
                        ':did' => $row['did']);
            $sql = "update ".$billing_table."  c ";
            $sql .= "set c.did_id = :did_id, c.customer_id = :customer_id  ";
            $sql .= "where c.customer_id = 0 and c.telcom_num = :did ";

            $result=$db->PDOquery($sql, $qry_arr);
            set_time_limit(30);  //Reset time limit after each query
            if (!$result) {
                error_log(date("Y/m/d h:i:sa").": "."\nError In Sql.\n".$sql, 3, $cron_log);
            }
        }

Попытка с использованием следующего, но получить сообщение об ошибке с кодом ошибки: 1054. Неизвестный столбец 'dids.did' в 'где пункт'

 UPDATE ".billing_table." SET ".billing_table.".did_id = dids.id, ".billing_table.".customer_id = dids.customer_id WHERE dids.did =  ".billing_table.".telcom_num

1 Ответ

0 голосов
/ 26 декабря 2018

Сериализация запросов SQL часто приводит к снижению производительности.Вы можете сделать все в одном утверждении:

$sql = "update ".$billing_table." c ".
       "inner join dids d on d.did=c.telcom_num ".
       "set c.did_id = d.id, c.customer_id = d.customer_id ".
       "where c.customer_id = 0;";
...