Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Как увеличить скорость выполнения запроса.  [new]
недочеловек
Member

Откуда:
Сообщений: 262
Всем привет:)

В общем есть запрос:

sselect Tab1.Field1,Tab1.Field2  from Tab1 
         where Tab1.Fdate=:date1
         
    and Tab1.Filed2 in ( select Tab2.Filed2  from Tab2
                where Tab2.Fdate=:date1
                )
    and   (  Tab1.Field3=  ( select Tab2.Filed3  from Tab2
                where Tab2.Fdate=:date2
                and  Tab2.Field4=Tab1.Field2
              
                and rownum=1)
                or
       
     Tab1.Field3>  (select Tab2.Filed3 from  from Tab2
                where data_date=add_months(to_date(
                (
                select Tab2.Filed5 from  from Tab2
                where Tab2.Fdate=:date2
                and  Tab2.Field4=Tab1.Field2
                ),'dd.mm.yy'),-1)
               and  Tab2.Field4=Tab1.Field2
                    and rownum=1)    
            )

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

Пробовал его "ускорить", получилось следующее:

select 

      Tab1.Field1,Tab1.Field2
 
from        
(

  select Tab2.Filed2  from Tab2
                where Tab2.Fdate=:date1
)t2,
(
select Tab2.Filed3,
    Tab2.Filed4, Filed5
     from  Tab2
            where Tab2.Fdate=:date2
          
)t3,
(
    Tab1.Field1,Tab1.Field2  from Tab1 
        where Tab1.Fdate=:date1
      
)Tab1

where t2.Field2=t3.Field3 and
          t2.Field2=Tab1.Field1 and
            ( Tab1.Field2=t3.Filed4 or
               Tab1.Field2>(select Filed4 from from Tab2  where Tab2.Fdate=case to_number(to_char(add_months(T3.Filed5,-1),'d','NLS_DATE_LANGUAGE = RUSSIAN' ))
                                                                                                                                          when 6 then  T3.Filed5+2
                                                                                                                                          when 7 then T3.Filed5+1
                                                                                                                                          else T3.Filed5
                                                                                                                                          end
                                                                                                    and Tab2.Field2=Tab1.Field1                     
                                            and rownum=1
                                     )  
            )


Скорость выполнения тоже оставляет желать лучшего. В сторону чего посмотреть для того что бы переписать запрос корректрее, с увеличением скорости выполения:)

О СУБД:
Oracle9i Enterprise Edition Release 9.0.1.1.1 - Production
1 ноя 11, 17:49    [11534903]     Ответить | Цитировать Сообщить модератору
 Re: Как увеличить скорость выполнения запроса.  [new]
Elic
Member

Откуда:
Сообщений: 29991
недочеловек
9.0.1.1.1
И что, работает?
1 ноя 11, 17:55    [11534942]     Ответить | Цитировать Сообщить модератору
 Re: Как увеличить скорость выполнения запроса.  [new]
AlexFF__|
Member

Откуда:
Сообщений: 2855
недочеловек,

У вас запрос не будет правильно работать в такой постановке, а вы о скорости думаете.
1 ноя 11, 18:25    [11535221]     Ответить | Цитировать Сообщить модератору
 Re: Как увеличить скорость выполнения запроса.  [new]
Максим Н
Member

Откуда: Екатеринодар
Сообщений: 1439
Недочеловек, а это реальные названия столбцов и таблиц или вы это для нас так сделали? Комерческая тайна?))
Если да, то вы бы выложили запрос в оригинальном виде, чтобы логику было видно.
1 ноя 11, 21:34    [11535938]     Ответить | Цитировать Сообщить модератору
 Re: Как увеличить скорость выполнения запроса.  [new]
недочеловек
Member

Откуда:
Сообщений: 262
Максим Н,

Нет, это не реально название столбцов. Завтра выложу реальное название столбцов...ну практически реальное
1 ноя 11, 22:54    [11536131]     Ответить | Цитировать Сообщить модератору
 Re: Как увеличить скорость выполнения запроса.  [new]
недочеловек
Member

Откуда:
Сообщений: 262
ВЫ общем вот то, что получилось после пересмотра запроса

select t2.Field1  from Tab2 t2
         where data_date=date_in
            and 
    (
    (t2.Field1 like ('40817%')
        and ((Field2 like('455%') and Field2 not like('45509%')) or Field2 like ('47427%'))
        )
    )
    and  trim(t2.doc_TYPE) in ('09','17') 
    and t2.Field1 in ( select Field3  from Tab1 t1
                where t1.data_date=date_in
                )
    and   (  t2.Field6=  ( select t1.Field4 from Tab1 t1
                where data_date=date_old
                and t1.Field3=t2.Field1
                 and t1.Field7<> t1.Field4
                and rownum=1)
                and
       
     t2.Field6>  ( select t1.Field4 from Tab1 t1
                where data_date=add_months(to_date(
                (
                select t1.Field5 from Tab1 t1 where t1.data_date=date_old and t1.Field3=t2.Field1 
                and rownum=1
                ),'dd.mm.yy'),-1)
                and t1.Field3=t2.Field1
                 and t1.Field7<> t1.Field4
                and rownum=1)    
            ) 
2 ноя 11, 11:59    [11537923]     Ответить | Цитировать Сообщить модератору
 Re: Как увеличить скорость выполнения запроса.  [new]
JonnyRD
Member

Откуда:
Сообщений: 1
недочеловек,

чё-то как-то непонятно)

вот если с конца пойти:

    t2.Field6>  ( select t1.Field4 from Tab1 [color=red]t1[/color]
                where data_date=add_months(to_date(
                (
                select t1.Field5 from Tab1 [color=red]t1[/color]
-- это так задумано?
2 ноя 11, 12:50    [11538445]     Ответить | Цитировать Сообщить модератору
 Re: Как увеличить скорость выполнения запроса.  [new]
Data corruption
Guest
недочеловек,

а на основании чего Вы понимаете, быстрее или нет стал отрабатывать запрос ?
2 ноя 11, 12:56    [11538523]     Ответить | Цитировать Сообщить модератору
 Re: Как увеличить скорость выполнения запроса.  [new]
Максим Н
Member

Откуда: Екатеринодар
Сообщений: 1439
Все равно непонятно, логики запроса не видно - что есть и что должно получиться.

Постарайтесь свести к минимуму количество условий типа:

... WHERE Table1.fld1 = (SELECT Table2.fld1 FROM ....)

Вы же понимаете, что в таком случае подзапрос будет выполняться для каждого сравнения (сколько строк, участвующих в сравнении столько и выполнений запроса).
2 ноя 11, 13:00    [11538563]     Ответить | Цитировать Сообщить модератору
 Re: Как увеличить скорость выполнения запроса.  [new]
wurdu
Member

Откуда: Владивосток
Сообщений: 4441
Максим Н
Вы же понимаете, что в таком случае подзапрос будет выполняться для каждого сравнения (сколько строк, участвующих в сравнении столько и выполнений запроса).
Не обязательно. Oracle умеет делать unnest.
2 ноя 11, 13:14    [11538711]     Ответить | Цитировать Сообщить модератору
 Re: Как увеличить скорость выполнения запроса.  [new]
недочеловек
Member

Откуда:
Сообщений: 262
Data corruption,

Время выполнения запроса уменьшается
2 ноя 11, 14:16    [11539445]     Ответить | Цитировать Сообщить модератору
 Re: Как увеличить скорость выполнения запроса.  [new]
недочеловек
Member

Откуда:
Сообщений: 262
Всем спасибо) Я ж блин забыл про такую замечетельные вещь как inner join
2 ноя 11, 20:56    [11542711]     Ответить | Цитировать Сообщить модератору
 Re: Как увеличить скорость выполнения запроса.  [new]
dumpino
Member

Откуда: Уфа
Сообщений: 100
недочеловек
Всем спасибо) Я ж блин забыл про такую замечетельные вещь как inner join


inner join не есть панацея)
select Tab1.Field1, Tab1.Field2  
from Tab1
where Tab1.Fdate=:date1
      and exists (select null from Tab2 where Tab2.Filed2 = Tab1.Filed2 and Tab2.Fdate=:date1)
      and (exists (select null from Tab2 where Tab2.Filed3 = Tab1.Field3 and Tab2.Fdate=:date2
                and  Tab2.Field4=Tab1.Field2)
           or
          (exists (select null from Tab2 where Tab2.Filed3 < Tab1.Field3 and Tab2.Field4=Tab1.Field2 and
                  data_date=add_months(to_date((select Tab2.Filed5 from  from Tab2
                                                       where Tab2.Fdate=:date2
                                                       and  Tab2.Field4=Tab1.Field2),'dd.mm.yy'),-1))))
3 ноя 11, 07:55    [11543812]     Ответить | Цитировать Сообщить модератору
 Re: Как увеличить скорость выполнения запроса.  [new]
недочеловек
Member

Откуда:
Сообщений: 262
dumpino
недочеловек
Всем спасибо) Я ж блин забыл про такую замечетельные вещь как inner join


inner join не есть панацея)
select Tab1.Field1, Tab1.Field2  
from Tab1
where Tab1.Fdate=:date1
      and exists (select null from Tab2 where Tab2.Filed2 = Tab1.Filed2 and Tab2.Fdate=:date1)
      and (exists (select null from Tab2 where Tab2.Filed3 = Tab1.Field3 and Tab2.Fdate=:date2
                and  Tab2.Field4=Tab1.Field2)
           or
          (exists (select null from Tab2 where Tab2.Filed3 < Tab1.Field3 and Tab2.Field4=Tab1.Field2 and
                  data_date=add_months(to_date((select Tab2.Filed5 from  from Tab2
                                                       where Tab2.Fdate=:date2
                                                       and  Tab2.Field4=Tab1.Field2),'dd.mm.yy'),-1))))


Согласен
3 ноя 11, 12:18    [11545288]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить