Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: нужна помощб в оптимизации LEFT JOIN

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: все индексы уже на месте
tonyio
Отправлено: 20 Октября, 2014 - 18:18:42
Post Id



Новичок


Покинул форум
Сообщений всего: 7
Дата рег-ции: Окт. 2014  


Помог: 0 раз(а)




сделал все индексы,но обработка всеравно занимает около минуты, если есть советы как ускорить это.
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2.  $queueArray = array('AllSales','VIR2831212','VIR2831213','VIR2831214','VIR2831215','VIR6875499','AllBrands','AllOmaha');
  3.        $allOmaha = "('VIR2831212','VIR2831213','VIR2831214','VIR2831215','VIR6875499')";
  4.        $allQueues = "('AllSales','VIR2831212','VIR2831213','VIR2831214','VIR2831215','VIR6875499')";
  5.   //count sales
  6.             IF ($queue == 'AllBrands') {
  7.                   $sqlSales = "SELECT COUNT(vicidial_campaign_statuses.status) FROM vicidial_agent_log LEFT JOIN vicidial_campaign_statuses ON vicidial_campaign_statuses.status = vicidial_agent_log.status and vicidial_campaign_statuses.campaign_id = vicidial_agent_log.campaign_id WHERE date(vicidial_agent_log.event_time) = '$runDate' AND vicidial_agent_log.campaign_id IN $allQueues AND sale = 'Y' AND vicidial_campaign_statuses.campaign_id IN $allQueues";
  8.             }
  9.                         else IF ($queue == 'AllOmaha')  {
  10.                 $sqlSales = "SELECT COUNT(vicidial_campaign_statuses.status) FROM vicidial_agent_log LEFT JOIN vicidial_campaign_statuses ON vicidial_campaign_statuses.status = vicidial_agent_log.status and vicidial_campaign_statuses.campaign_id = vicidial_agent_log.campaign_id WHERE date(vicidial_agent_log.event_time) = '$runDate' AND vicidial_agent_log.campaign_id IN $allOmaha AND sale = 'Y' AND vicidial_campaign_statuses.campaign_id IN $allOmaha";
  11.             }
  12.             else {
  13.                 $sqlSales = "SELECT COUNT(vicidial_campaign_statuses.status) FROM vicidial_agent_log LEFT JOIN vicidial_campaign_statuses ON vicidial_campaign_statuses.status = vicidial_agent_log.status and vicidial_campaign_statuses.campaign_id = vicidial_agent_log.campaign_id WHERE date(vicidial_agent_log.event_time) = '$runDate' AND vicidial_agent_log.campaign_id = '$queue' AND sale = 'Y' AND vicidial_campaign_statuses.campaign_id = '$queue'";
  14.             }
  15.             //echo $sqlSales;
  16.              $resultSales= mysql_query($sqlSales, $link);
  17.             $resultValue = mysql_fetch_row($resultSales);
  18.             $metricsResult[$queue]['Sales'] = $resultValue[0];
  19.  
  20.  


знаю выглялит громоздко,но так пока легче.
 
 Top
MiksIr
Отправлено: 20 Октября, 2014 - 18:24:23
Post Id


Забанен


Покинул форум
Сообщений всего: 378
Дата рег-ции: Сент. 2014  


Помог: 10 раз(а)

[+]


А зачем у вас условие и по vicidial_agent_log.campaign_id и по vicidial_campaign_statuses.campa ign_id

Еще можно попробовать поменять таблицы местами и сделать INNER JOIN.

А так - сложно судить не зная схему данных и что там для чего.

(Отредактировано автором: 20 Октября, 2014 - 18:32:14)



-----
self-banned
 
 Top
Panoptik
Отправлено: 20 Октября, 2014 - 18:55:26
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


Помог: 131 раз(а)




не хочу даже пытаться понять что там написано в сплошном куске запроса
совет на будущее и отредактируйте сейчас сообщение чтобы запросы выглядели следующим образом

CODE (SQL):
скопировать код в буфер обмена
  1. SELECT field1, field2,
  2.   field3 f3, field4 f4
  3.     FROM tbl_1 t1
  4.     LEFT JOIN tbl_2 t2
  5.       ON t1.key_field = t2.key_field
  6.         AND t2.key_field2 = 'blah'
  7.     LEFT JOIN tbl_3 t3
  8.       ON t1.key_field = t3.key_field
  9.         OR t3.key_field2 = 'blah'
  10.     WHERE f3 = 'blah' AND f4 = 42
  11.     GROUP BY field1, field2
  12.       HAVING count(field2) > 4
  13.     ORDER BY field2 DESC
  14.     LIMIT 42;


-----
Just do it
 
 Top
Мелкий Супермодератор
Отправлено: 20 Октября, 2014 - 18:57:53
Post Id



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


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Какого именно запроса?
Разумеется, написать схемы таблиц. Добавить смысл запроса и вывод explain'а.

Сходу очевидно, что left join тут лишь по глупости. count считает только не NULL-значения, результат идентичен inner join.


-----
PostgreSQL DBA
 
 Top
tonyio
Отправлено: 21 Октября, 2014 - 16:15:09
Post Id



Новичок


Покинул форум
Сообщений всего: 7
Дата рег-ции: Окт. 2014  


Помог: 0 раз(а)




SOLVED
Мелкий пишет:
Какого именно запроса?
Разумеется, написать схемы таблиц. Добавить смысл запроса и вывод explain'а.

Сходу очевидно, что left join тут лишь по глупости. count считает только не NULL-значения, результат идентичен inner join.

ты конечно прав! и я переделал - сделал дополнительный view и назвал его criusDashboard1 чтобы удобней было, но на время исполнения это не особо повлияло,и теперь пытаюсь сократить не делая дополнительный запрос на AllBrands а пытаюсь его получить сложением из array
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. $queueArray = array('20130401');
  3. $metricsResult = array();
  4. $metricsResult['AllBrands']['Offered'] = 0;
  5.    foreach($queueArray AS $queue) {
  6.        
  7.         //count total dials
  8.             $sqlOffered = "SELECT COUNT(UniqueID) FROM criusDashboard1 WHERE date(CallDate) = '$runDate' and LENGTH(uniqueid) > 0 and CampaignID = '$queue'";
  9.             $resultOffered = mysql_query($sqlOffered, $link);
  10.             $resultValue = mysql_fetch_row($resultOffered);
  11.             $metricsResult[$queue]['Offered'] = $resultValue[0];
  12.             $metricsResult['AllBrands']['Offered'] += $resultValue[0];
  13.  


AllBrands это общая сумма для всех компаний(в будующем добавлю более) но раньше сумма добывалась из базы, а теперь для экономии пытаюсь посчитать наместе.

все заработало!
Прикреплено изображение (Нажмите для увеличения)
Untitled.jpg

(Отредактировано автором: 21 Октября, 2014 - 22:53:52)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB