Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Оптимизация SQL запроса [FB 2.1]


DelphiN! ©   (2010-12-22 09:08:00) 

Доброго времени суток!
Помогите оптимизировать следующий запрос

select

   cast(time_ as date),
    (select first 1 period_ from periodi where cast(time_ as date) = cast(MAIN.time_ as date)),

   (select sum(summ_) from casebase where
    (period_ = (select first 1 period_ from periodi where cast(time_ as date) = cast(MAIN.time_ as date))))"SUM"

   from casebase MAIN
   where
   time_ > '01.12.2010' and time_ < '20.12.2010' and prim_ <> 'Login activated' and prim_ <> 'Login deactivated'
    and prim_ <> 'OUT' and prim_ <> 'BONUS'
   group by 1
   order by 1


Можно ли из него сделать что-то наподобие

select

   cast(time_ as date),
    (select first 1 period_ from periodi where cast(time_ as date) = cast(MAIN.time_ as date)),

   (select sum(summ_) from casebase where
    (period_ = MAIN.2))"SUM"

   from casebase MAIN
   where
   time_ > '01.12.2010' and time_ < '20.12.2010' and prim_ <> 'Login activated' and prim_ <> 'Login deactivated'
    and prim_ <> 'OUT' and prim_ <> 'BONUS'
   group by 1
   order by 1


То есть не делать повторный под запрос а указать условие period_ = "тому что в столбце 2"


evvcom   (2010-12-31 14:24:00) [1]

Как все любят делать для вычисления поля дополнительный селект, возвращающий одно значение! Чем джойны не устраивают? Я не профи в птичке, но в оракле делаю примерно так:

select
 cast(MAIN.time_ as date), -- не меняю, может и так
 per.period_
 -- прочие поля
from casebase MAIN
 left join (
   select distinct
     period_,
     cast(time_ as date) as time_
   from periodi) per
 on per.time_ = cast(MAIN.time_ as date)


Виталий Панасенко   (2010-12-22 10:55:00) [2]

execute block - аналог ХП.. только без модификации метаданных БД(ничего создавать не нужно, как в случае с хранимой процедурой)


sniknik   (2010-12-22 09:46:00) [3]

гораздо существеннее выигрыш будет если внутренние под запросы будут использовать индексы. для чего убрать вычисления для сравниваемого поля (ведь cast(time_ as date) это "обрезание" времени из дататайма, правильно понял? или там строка потому как дальше условие со строкой (это не авто преобразование?) тогда сменить тип поля)


DelphiN!   (2010-12-22 09:18:00) [4]


> Виталий Панасенко   (22.12.10 09:14) [1]
> execute block?


А можно пример?


Виталий Панасенко   (2010-12-22 09:14:00) [5]

execute block?


Наверх

Титульная страница Поиск, карта сайта Написать письмо