Фильр по формуле

Тема в разделе "SQL", создана пользователем TT., 29 окт 2007.

Наш партнер Genesis Hackspace
  1. TT.

    TT. Гость

    Надо оптимизировать запрос, для этого как минимум надо не проводить повторные выборки по уже найденым значениям, вопрос - как это сделать? :)


    Идея: (нерабочие варианты)
    select val1,(select ...) as val2,(select ...) as val3 from table order by (val2/val3)
    или
    select val1,(select ...) as val2,(select ...) as val3 from table order by (val2/val3)



    Не оптимальная реализация: (Рабочая)
    select val1,(select ...) as val2,(select ...) as val3,(select ...)/(select ...) as val4 from table order by val4


    Может кто нибудь сталкивался с оптимизацией такого запроса?


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

    SELECT
    traffic.`key` as keyid,
    (select `key` from `keys` where `keys`.`idkey`=keyid),
    count(*) AS num_traffic,
    (select count(*) from stat where stat.`keyword`=keyid and
    UNIX_TIMESTAMP(stat.`leaddatetime`)>=UNIX_TIMESTAMP('2007-10-19') and stat.`affid`='1002' and
    UNIX_TIMESTAMP(stat.`leaddatetime`)<=UNIX_TIMESTAMP('2007-10-29 23:59:59')) as num_lead,
    (select sum(stat.`money`) from stat where stat.`keyword`=keyid and stat.`affid`='1091' and
    UNIX_TIMESTAMP(stat.`leaddatetime`)>=UNIX_TIMESTAMP('2007-10-19') and
    UNIX_TIMESTAMP(stat.`leaddatetime`)<=UNIX_TIMESTAMP('2007-10-29 23:59:59')) as amt_leads,
    ((select sum(stat.`money`) from stat where stat.`keyword`=keyid and stat.`affid`='1002' and
    UNIX_TIMESTAMP(stat.`leaddatetime`)>=UNIX_TIMESTAMP('2007-10-19') and
    UNIX_TIMESTAMP(stat.`leaddatetime`)<=UNIX_TIMESTAMP('2007-10-29 23:59:59'))
    /count(*)) as priceclick,
    ((select sum(stat.`money`) from stat where stat.`keyword`=keyid and stat.`affid`='1002' and
    UNIX_TIMESTAMP(stat.`leaddatetime`)>=UNIX_TIMESTAMP('2007-10-19') and
    UNIX_TIMESTAMP(stat.`leaddatetime`)<=UNIX_TIMESTAMP('2007-10-29 23:59:59'))
    /(select count(*) from stat where stat.`keyword`=keyid and
    UNIX_TIMESTAMP(stat.`leaddatetime`)>=UNIX_TIMESTAMP('2007-10-19') and stat.`affid`='1002' and
    UNIX_TIMESTAMP(stat.`leaddatetime`)<=UNIX_TIMESTAMP('2007-10-29 23:59:59'))) as pricelead,
    (count(*)/(select count(*) from stat where stat.`keyword`=keyid and
    UNIX_TIMESTAMP(stat.`leaddatetime`)>=UNIX_TIMESTAMP('2007-10-19') and stat.`affid`='1002' and
    UNIX_TIMESTAMP(stat.`leaddatetime`)<=UNIX_TIMESTAMP('2007-10-29 23:59:59'))) as pricelead
    FROM
    traffic
    WHERE
    traffic.affid = '1002' and
    traffic.`key`!=0 and
    UNIX_TIMESTAMP(traffic.`dateg`)>=UNIX_TIMESTAMP('2007-10-19') and
    UNIX_TIMESTAMP(traffic.`dateg`)<=UNIX_TIMESTAMP('2007-10-29 23:59:59')
    GROUP BY
    traffic.`key`
    order by
    pricelead desc
     
  2. lapo4ka

    lapo4ka Гость

    А если пользоваться временными таблицами? и апдейтить их по идешникам?
     
Загрузка...

Поделиться этой страницей