Перейти к содержимому


Производительность вычислений

вычисления

Сообщений в теме: 9

#1 AGroza

    Активный участник

  • Пользователи
  • PipPipPip
  • 31 сообщений

Отправлено 01 Июнь 2017 - 10:40

Всем доброго дня. Есть вычисления следующего типа для одной таблицы:
$result = sql_query("SELECT f3761 FROM ".DATA_TABLE."341  WHERE f5180=".$line['ID']."  AND status='0' ORDER BY add_time DESC LIMIT 1");
$row = sql_fetch_assoc($result);
$line['Работа с Заказчиком'] = $row['f3761'];
$result = sql_query("SELECT f3491 FROM ".DATA_TABLE."331  WHERE f3471=".$line['ID']." and status='0' and f4451='нет' ORDER BY add_time DESC LIMIT 1");
$row = sql_fetch_assoc($result);
$line['Задачи'] = $row['f3491'];
В итоге всегда получаю поле с последней активной задачей или работой соответственно. Проблема в том, что с включенными вычислениями, таблица из 72 записей прогружается 12 секунд. Без этих вычислений за 2-3. Скажите, это мои вычисления корявые или я чего-то не понимаю?

#2 maksn

    Активный участник

  • Пользователи
  • PipPipPip
  • 314 сообщений
  • Пол:Мужчина

Отправлено 01 Июнь 2017 - 12:22

Просмотр сообщенияAGroza (01 Июнь 2017 - 10:40) писал:

Всем доброго дня. Есть вычисления следующего типа для одной таблицы:
$result = sql_query("SELECT f3761 FROM ".DATA_TABLE."341  WHERE f5180=".$line['ID']."  AND status='0' ORDER BY add_time DESC LIMIT 1");
$row = sql_fetch_assoc($result);
$line['Работа с Заказчиком'] = $row['f3761'];
$result = sql_query("SELECT f3491 FROM ".DATA_TABLE."331  WHERE f3471=".$line['ID']." and status='0' and f4451='нет' ORDER BY add_time DESC LIMIT 1");
$row = sql_fetch_assoc($result);
$line['Задачи'] = $row['f3491'];
В итоге всегда получаю поле с последней активной задачей или работой соответственно. Проблема в том, что с включенными вычислениями, таблица из 72 записей прогружается 12 секунд. Без этих вычислений за 2-3. Скажите, это мои вычисления корявые или я чего-то не понимаю?

Ваши вычисления вполне корректны. Не корректна, как мне кажется привязка этих вычислений с событию "Отображение поля"
Получается, что при открытии страницы с 72 записями выполняется
1. 72 записи Х 2 SELECT'а = 144 запроса SELECT. Причем с операцией file sort. Сервер при этом иногда вынужден сбрасывать промежуточные результаты на диск во временную таблицу

2. 72 записи Х 2 UPDATE = 144 запроса

Итого 288 запросов.

Оно Вам надо? При открытии страницы? Данные то не меняются, когда страница загружается
А не дай бог, еще какие то события привязаны к событию на изменение полей. Тогда еще больше

Сообщение отредактировал maksn: 01 Июнь 2017 - 12:35

"...Сижу, паяю. CRM починяю..."
Мои разработки

#3 AGroza

    Активный участник

  • Пользователи
  • PipPipPip
  • 31 сообщений

Отправлено 01 Июнь 2017 - 12:33

Хорошо. Я предполагал, что плохо делать запрос каждый раз, но тем неимением, требуется при загрузке страницы получать из под таблиц актуальную информацию. Как можно это обойти?

#4 AGroza

    Активный участник

  • Пользователи
  • PipPipPip
  • 31 сообщений

Отправлено 01 Июнь 2017 - 12:36

Имеем ли мы доступ к каким-то глобальным переменным. К примеру, я усложню запрос и вытащу одним разом все записи нужные. Тогда мне нужна переменная флаг, которая обозначит, что я уже делал запрос и мне нужно использовать то, что есть в результирующем массиве.

#5 maksn

    Активный участник

  • Пользователи
  • PipPipPip
  • 314 сообщений
  • Пол:Мужчина

Отправлено 01 Июнь 2017 - 12:46

Просмотр сообщенияAGroza (01 Июнь 2017 - 12:36) писал:

Имеем ли мы доступ к каким-то глобальным переменным. К примеру, я усложню запрос и вытащу одним разом все записи нужные. Тогда мне нужна переменная флаг, которая обозначит, что я уже делал запрос и мне нужно использовать то, что есть в результирующем массиве.
А может быть все проще?
Если прописать эти вычисления на изменение соответствующих полей в соответствующих таблицах. Чем не устраивает? Ведь когда интересующее Вас поле изменится, запустится вычисление и изменит что нужно. И страница будет с актуальными данными

А уж если хотите непременно "переменную - флаг", то можете хранить ее в сессии

Сообщение отредактировал maksn: 01 Июнь 2017 - 12:48

"...Сижу, паяю. CRM починяю..."
Мои разработки

#6 AGroza

    Активный участник

  • Пользователи
  • PipPipPip
  • 31 сообщений

Отправлено 01 Июнь 2017 - 12:54

Вы совершенно правы, забыл про сессии совсем, займусь этим сейчас) Спасибо за помощь)

#7 AGroza

    Активный участник

  • Пользователи
  • PipPipPip
  • 31 сообщений

Отправлено 01 Июнь 2017 - 14:47

Думал это просто, но на деле никак не могу понять, в чем проблема. Решил сделать, как Вы советовали, при изменении соответствующего поля, перезаписывать в главную(результирующую) таблицу, значение поля.
У меня структура следующая:Таблица с проектами. Зайдя в просмотр проекта, в под таблице, тянутся задачи из таблицы с задачами для этого проекта. Создал вычисление, при изменении поля "Описание" выполнять следующий код:
$result = sql_query("SELECT f3491 FROM ".DATA_TABLE."331  WHERE status='0' and f4451='нет' ORDER BY add_time DESC LIMIT 1");
//вытаскиваю из таблицы с задачами, ту, которая добавлена последней и статус выполнения = "нет"
$row = sql_fetch_assoc($result);
$line['Проекты']['Задачи'] = $row['f3491'];//в таблицу проектов, в поле задач, пихаю полученное описание
Скажите пожалуйста, где я ошибся, не появляется ничего. Или как можно вывести на печать, то что у меня вытащила база. При изменении запись, страничка не обновляется и как узнать, как у меня отработало это вычисления я не соображу.

#8 maksn

    Активный участник

  • Пользователи
  • PipPipPip
  • 314 сообщений
  • Пол:Мужчина

Отправлено 01 Июнь 2017 - 15:52

Просмотр сообщенияAGroza (01 Июнь 2017 - 14:47) писал:

Думал это просто, но на деле никак не могу понять, в чем проблема. Решил сделать, как Вы советовали, при изменении соответствующего поля, перезаписывать в главную(результирующую) таблицу, значение поля.
У меня структура следующая:Таблица с проектами. Зайдя в просмотр проекта, в под таблице, тянутся задачи из таблицы с задачами для этого проекта. Создал вычисление, при изменении поля "Описание" выполнять следующий код:
$result = sql_query("SELECT f3491 FROM ".DATA_TABLE."331  WHERE status='0' and f4451='нет' ORDER BY add_time DESC LIMIT 1");
//вытаскиваю из таблицы с задачами, ту, которая добавлена последней и статус выполнения = "нет"
$row = sql_fetch_assoc($result);
$line['Проекты']['Задачи'] = $row['f3491'];//в таблицу проектов, в поле задач, пихаю полученное описание
Скажите пожалуйста, где я ошибся, не появляется ничего. Или как можно вывести на печать, то что у меня вытащила база. При изменении запись, страничка не обновляется и как узнать, как у меня отработало это вычисления я не соображу.
Если предположить, что ".DATA_TABLE."331 - это подтаблица к таблице с проектами, то в запросе отсутствует условие выбирать по данному проекту. А еще у Вас сортировка результата по полю, которого нет в результатах, что должено вызвать ошибку SQL. (Попробуйте СВОЙ запрос повторить в phpMyAdmin)
Если я Вас правильно понял, то код должен быть таким. Только замените в нем XXX на реальный ID поля связи с проектами
$project_id = $line['fXXX']['id'];
$sql = "
SELECT `add_time`,`f3491` FROM `".DATA_TABLE."331`  WHERE `status`='0'
and f4451='нет'
AND `fXXX` = ".$project_id." /*****Не забудьте заменить fXXX****/
ORDER BY `add_time` DESC LIMIT 1
";
$result=sql_query($sql);
$row = sql_fetch_assoc($result);
$line['Проекты']['Задачи'] = $row['f3491'];//в таблицу проектов, в поле задач, пихаю полученное описание

Сообщение отредактировал maksn: 01 Июнь 2017 - 16:08

"...Сижу, паяю. CRM починяю..."
Мои разработки

#9 maksn

    Активный участник

  • Пользователи
  • PipPipPip
  • 314 сообщений
  • Пол:Мужчина

Отправлено 01 Июнь 2017 - 16:18

Посмотрел еще раз вычисление. И мне кажется, что у Вас логическая ошибка. Вычисление работать будет, но в основную таблицу пойдет значение из ПОСЛЕДНЕЙ добавленной записи в подтаблице со значением f4451='нет', судя по ORDER в запросе
А вообще то хотелось более подробно узнать что хотите получить и в результате чего. Без этого - только предположения

Если нужно, чтобы передалось значение из именно той записи, что изменяется, то код
$sql = "SELECT `f3491` FROM `".DATA_TABLE."331`  WHERE `id`=".intval($line['id']);
$result=sql_query($sql);
$row = sql_fetch_assoc($result);
$line['Проекты']['Задачи'] = $row['f3491'];//в таблицу проектов, в поле задач, пихаю полученное описание

Сообщение отредактировал maksn: 01 Июнь 2017 - 16:46

"...Сижу, паяю. CRM починяю..."
Мои разработки

#10 AGroza

    Активный участник

  • Пользователи
  • PipPipPip
  • 31 сообщений

Отправлено 01 Июнь 2017 - 16:47

Спасибо тебе добрый человек. Всего хорошего твоему дому.
$project_id = $line['f3471']['raw'];
$sql = "
SELECT add_time,f3491 FROM ".DATA_TABLE."331  WHERE status='0'
and f4451='нет'
AND f3471 = ".$project_id."
ORDER BY add_time DESC LIMIT 1
";
$result=sql_query($sql);
$row = sql_fetch_assoc($result);
$line['f3471']['f4611'] = $row['f3491'];
Работает только так в итоге.





Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 анонимных