2014-11-11 3 views
0

Мне нужна помощь в оптимизации этого конкретного запроса. Если вы видите, что выполняется несколько подзапросов, но они работают в одной таблице. Проблема состоит в том, что GROUP BY используется двумя подзапросами, и есть еще два подзапроса, которые не используют GROUP BY. Могут ли эти 4 подзапроса быть объединены, чтобы просто сканировать таблицу один раз.Оптимизация запросов - 10001

WITH f AS 
(
    SELECT a.custom_referal_page, 
    a.campaign_id, 
    a.domain_user_id, 
    a.event_name, 
    COUNT(a.event_name), 
    (SELECT COUNT(a1.event_name) 
     FROM action_fact_new_wodim a1 
     WHERE a1.domain_url = 'alternativeapparel.com' 
     AND a1.event_name = 'AltOrig PerfCapSl GoToPro' 
    -- AND a1.date_stamp BETWEEN '20140501' AND '20140530'   
    AND a1.time_stamp BETWEEN '2014-05-01 14:43:15' AND '2014-05-30 14:43:15' 
     AND event_name != 'Page load' 
     AND event_name != 'Page unload') AS totalCount, 
    (SELECT COUNT(domain_user_id) 
     FROM (SELECT DISTINCT a1.domain_user_id, 
        a1.custom_referal_page 
      FROM action_fact_new_wodim a1 
      WHERE a1.domain_url = 'alternativeapparel.com' 
      AND a1.event_name = 'AltOrig PerfCapSl GoToPro' 
     --   AND a1.date_stamp BETWEEN '20140501' AND '20140530'   
      AND a1.time_stamp BETWEEN '2014-05-01 14:43:15' AND '2014-05-30 14:43:15' 
      AND event_name != 'Page load' 
      AND event_name != 'Page unload') AS a2) AS uniqueCount, 
    (SELECT COUNT(domain_user_id) 
     FROM (SELECT DISTINCT domain_user_id 
      FROM action_fact_new_wodim a1 
      WHERE a1.domain_url = 'alternativeapparel.com' 
      AND a1.event_name = 'AltOrig PerfCapSl GoToPro' 
     --  AND a1.date_stamp BETWEEN '20140501' AND '20140530'   
      AND a1.time_stamp BETWEEN '2014-05-01 14:43:15' AND '2014-05-30 14:43:15' 
      AND event_name != 'Page load' 
      AND event_name != 'Page unload') AS a2) AS totalUniqueCount 
FROM action_fact_new_wodim a 
WHERE a.domain_url = 'alternativeapparel.com' 
AND a.event_name = 'AltOrig PerfCapSl GoToPro' 
-- AND a.date_stamp BETWEEN '20140501' AND '20140530'   
AND a.time_stamp BETWEEN '2014-05-01 14:43:15' AND '2014-05-30 14:43:15' 
AND event_name != 'Page load' 
AND event_name != 'Page unload' 
GROUP BY a.custom_referal_page, 
     a.campaign_id, 
     a.domain_user_id, 
     a.event_name 
) 

SELECT custom_referal_page, 
    campaign_id, 
    SUM(COUNT) AS COUNT, 
    MAX(totalCount) AS totalCount, 
    COUNT(uniqueCount) AS uniqueCount, 
    MAX(totalUniqueCount) AS totalUniqueCount 
FROM f 
GROUP BY custom_referal_page, 
    campaign_id 
ORDER BY 3 DESC 

Выход: custom_referal_page campaign_id Количество TotalCount uniquecount totaluniquecount https://www.google.ca/ нуль 10838 20153 5346 9906 https://www.google.com/ нуль 3040 20153 1727 9906

+0

Каждый из ваших где положения имеют определенное событие, а затем! = Загрузилась страница/выгрузки, которая делает бессмысленным, поскольку он может быть только тем или иным. Кроме того, вы намерены основывать запрос на time_stamp или date_stamp (который закомментирован) – DRapp

ответ

0

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

select 
     a1.custom_referal_page, 
     a1.campaign_id, 
     COUNT(*) as TotalEvents, 
     COUNT(distinct a1.event_name) as CntDistEvents, 
     COUNT(distinct a1.domain_user_id + a1.custom_referal_page) as CntDistDomRef, 
     COUNT(distinct a1.domain_user_id) as CntDistUsers 
    FROM 
     action_fact_new_wodim a1 
    WHERE 
      a1.domain_url = 'alternativeapparel.com' 
     AND a1.event_name = 'AltOrig PerfCapSl GoToPro' 
     AND a1.time_stamp BETWEEN '2014-05-01 14:43:15' AND '2014-05-30 14:43:15' 
    group by 
     a1.custom_referal_page, 
     a1.campaign_id 

То есть, я бы индекс на вашем столе на (DOMAIN_URL, event_name, time_Stamp), но если вы на самом деле собираетесь запрашивать дату_stamp, настройте предложение index и where.

Посмотрите на цифры это дает вам для различных ссылок и добавить заказ на основе зависимости от того, имеет смысл ...

Смежные вопросы