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

Откуда: Алматы
Сообщений: 18
Добрый день всем, подскажите пожалуйста можно ли улучшить и оптимизировать запрос, спасибо!

  
    SELECT T.ID      --Поля которые ножно плучить
         , I.BALANCE --Поля которые ножно плучить
    FROM  TRANCHE T
        , INTEREST_PERIOD I
        ,( SELECT T.ID, MAX(I.INTEREST_NUM) AS INTEREST_NUM 
           FROM TRANCHE T
            JOIN INTEREST_PERIOD I ON I.TRANCHE = T.ID
           WHERE TRUNC(T.END_DATE) <= TRUNC(SYSDATE) --При условии
           GROUP BY T.ID ) X
   WHERE T.ID = I.TRANCHE AND 
         T.ID = X.ID      AND 
         I.INTEREST_NUM = X.INTEREST_NUM
27 июл 12, 10:44    [12923746]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли улучшить запрос?  [new]
Человек и Кошка
Member

Откуда: настоящему индейцу завсегда везде ништяк (с)
Сообщений: 830
тынц
27 июл 12, 10:48    [12923793]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли улучшить запрос?  [new]
pectopatop
Member

Откуда:
Сообщений: 765
Можно посмотреть план запроса и подумать
27 июл 12, 11:58    [12924416]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли улучшить запрос?  [new]
Нико0411
Member

Откуда: Алматы
Сообщений: 18
Спасибо всем если вариантов нет, значит запрос нормальный.
27 июл 12, 12:06    [12924492]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли улучшить запрос?  [new]
Человек и Кошка
Member

Откуда: настоящему индейцу завсегда везде ништяк (с)
Сообщений: 830
Нико0411
если вариантов нет, значит запрос нормальный

И варианты есть и запрос не ахти, просто чукча не читатель.
27 июл 12, 12:11    [12924525]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли улучшить запрос?  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 8131
Нико0411
           WHERE TRUNC(T.END_DATE) <= TRUNC(SYSDATE) --При условии
Сколько процентов строк таблицы TRANCHE выбирается по этому условию?
27 июл 12, 14:15    [12925499]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли улучшить запрос?  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 8131
Нико0411,
Покажите результат выполнения
SELECT table_name, num_rows, blocks
FROM user_tables
WHERE table_name IN ('TRANCHE', 'INTEREST_PERIOD')
27 июл 12, 14:31    [12925645]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли улучшить запрос?  [new]
Нико0411
Member

Откуда: Алматы
Сообщений: 18
INTEREST_PERIOD 17 5
TRANCHE 23 5


Там мало данных, база только разрабатывается, я процедуру создал, хочется сразу оптимально запрос написать.
27 июл 12, 16:50    [12926767]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли улучшить запрос?  [new]
Нико0411
Member

Откуда: Алматы
Сообщений: 18
Упс, не заметил что это ссылка, ща пересмотрю запрос с учетом ваших примеров.
27 июл 12, 16:54    [12926799]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли улучшить запрос?  [new]
Mit
Member

Откуда: Мытищи
Сообщений: 819
ну так то да, с таким количеством строку тут оптимизировать и оптимизировать :)
27 июл 12, 17:00    [12926833]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли улучшить запрос?  [new]
ScarferNV
Member

Откуда:
Сообщений: 96
SELECT  T.ID, I.BALANCE
FROM  TRANCHE T, INTEREST_PERIOD I
WHERE T.ID = I.TRANCHE 
AND (T.ID, I.INTEREST_NUM) in (SELECT T.ID, MAX(I.INTEREST_NUM)
                               FROM TRANCHE T
                                    JOIN INTEREST_PERIOD I ON I.TRANCHE = T.ID
                               WHERE TRUNC(T.END_DATE) <= TRUNC(SYSDATE) 
                               GROUP BY T.ID)
27 июл 12, 18:44    [12927386]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли улучшить запрос?  [new]
ScarferNV
Member

Откуда:
Сообщений: 96
Честно сейчас только внимание обратил на
TRUNC(T.END_DATE) <= TRUNC(SYSDATE)


Поясните смысл этого условия? В таблице действительно имеются даты будущего, или вместо sysdate подставится любая другая дата?
27 июл 12, 19:40    [12927535]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли улучшить запрос?  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54376
ScarferNV
Честно сейчас только внимание обратил на
TRUNC(T.END_DATE) <= TRUNC(SYSDATE)


Поясните смысл этого условия? В таблице действительно имеются даты будущего, или вместо sysdate подставится любая другая дата?
вполне
так как навзание END_DATE вполне может относится к какому-нибудь концу периода, например, концу текущего года
27 июл 12, 20:44    [12927665]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли улучшить запрос?  [new]
ksv55
Member

Откуда:
Сообщений: 93
Нико0411,
TRUNC(T.END_DATE) может вызвать полный просмотр таблицы, если нет функционального индекса
Можно заменить на WHERE T.END_DATE <= переменная_даты_на_начало_дня ?
27 июл 12, 21:26    [12927777]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли улучшить запрос?  [new]
Нико0411
Member

Откуда: Алматы
Сообщений: 18
andreymx,

Да вы совершенно правы, END_DATE, это конец периода, проверяем закончился ли период, если да то расматривается это поле I.BALANCE, когда система заработает в двух таблицах будет много данных


ScarferNV Интересны запрос не знал что так можно, спасибо за новый подход
SELECT  T.ID, I.BALANCE
FROM  TRANCHE T, INTEREST_PERIOD I
WHERE T.ID = I.TRANCHE 
AND (T.ID, I.INTEREST_NUM) in (SELECT T.ID, MAX(I.INTEREST_NUM)
                               FROM TRANCHE T
                                    JOIN INTEREST_PERIOD I ON I.TRANCHE = T.ID
                               WHERE TRUNC(T.END_DATE) <= TRUNC(SYSDATE) 
                               GROUP BY T.ID)
27 июл 12, 21:35    [12927800]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли улучшить запрос?  [new]
Нико0411
Member

Откуда: Алматы
Сообщений: 18
ksv55,

Да можно,
27 июл 12, 21:47    [12927837]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли улучшить запрос?  [new]
Нико0411
Member

Откуда: Алматы
Сообщений: 18
ksv55,

Такая идея пока у меня

DECLARE 
  LM_DATE DATE := TRUNC(SYSDATE) ;
BEGIN
  
     FOR N IN (  SELECT T.ID      --Поля которые ножно плучить
                     ,  I.BALANCE --Поля которые ножно плучить
                  FROM  TRANCHE T
                      , INTEREST_PERIOD I
                      ,( SELECT T.ID, MAX(I.INTEREST_NUM) AS INTEREST_NUM 
                         FROM TRANCHE T
                          JOIN INTEREST_PERIOD I ON I.TRANCHE = T.ID
                         WHERE TRUNC(T.END_DATE) <= TRUNC(SYSDATE) --При условии
                         GROUP BY T.ID ) X
                 WHERE T.ID = I.TRANCHE AND 
                       T.ID = X.ID      AND 
                       I.INTEREST_NUM = X.INTEREST_NUM)
    LOOP
      UPDATE TRANCHE
      SET STATUS = CASE WHEN N.BALANCE = 0 THEN 'REPAID' ELSE 'ACTUAL' END
      WHERE ID = N.ID;
    END LOOP;
END;  
27 июл 12, 21:49    [12927841]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли улучшить запрос?  [new]
Нико0411
Member

Откуда: Алматы
Сообщений: 18
Нико0411,

DECLARE 
  LM_DATE DATE := TRUNC(SYSDATE) ;
BEGIN
  
     FOR N IN (  SELECT T.ID      --Поля которые ножно плучить
                     ,  I.BALANCE --Поля которые ножно плучить
                  FROM  TRANCHE T
                      , INTEREST_PERIOD I
                      ,( SELECT T.ID, MAX(I.INTEREST_NUM) AS INTEREST_NUM 
                         FROM TRANCHE T
                          JOIN INTEREST_PERIOD I ON I.TRANCHE = T.ID
                         WHERE TRUNC(T.END_DATE) <= LM_DATE  --Ой
                         GROUP BY T.ID ) X
                 WHERE T.ID = I.TRANCHE AND 
                       T.ID = X.ID      AND 
                       I.INTEREST_NUM = X.INTEREST_NUM)
    LOOP
      UPDATE TRANCHE
      SET STATUS = CASE WHEN N.BALANCE = 0 THEN 'REPAID' ELSE 'ACTUAL' END
      WHERE ID = N.ID;
    END LOOP;
END;  
27 июл 12, 21:50    [12927853]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли улучшить запрос?  [new]
ksv55
Member

Откуда:
Сообщений: 93
Нико0411,

1. Нужно TRUNC(T.END_DATE) заменить на T.END_DATE
Применение функции к полю переводит просмотр по индексу на полный просмотр таблицы.

Посмотрите планы у запросов:
SELECT T.ID FROM TRANCHE T WHERE T.D=:P1
и
SELECT T.ID FROM TRANCHE T WHERE T.D+0=:P1

2. Обновление нужно делать одним запросом без цикла.
27 июл 12, 21:59    [12927881]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли улучшить запрос?  [new]
Человек и Кошка
Member

Откуда: настоящему индейцу завсегда везде ништяк (с)
Сообщений: 830
Нико0411,

~

merge into tranche m
using (
       select t.id
            , decode(
                     max(i.balance)
                       keep (dense_rank last order by i.interest_num)
                   , 0, 'REPAID', 'ACTUAL'
                   ) status
         from tranche t
            , interest_period i
        where t.id = i.tranche
          and t.end_date < trunc(sysdate+1)
        group by t.id
      ) v
on (m.id = v.id)
when matched then
  update set m.status = v.status
27 июл 12, 23:28    [12928235]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли улучшить запрос?  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 8131
SQL*Plus
Нико0411,
Покажите результат выполнения
SELECT table_name, num_rows, blocks
FROM user_tables
WHERE table_name IN ('TRANCHE', 'INTEREST_PERIOD')

Нико0411
INTEREST_PERIOD   17   5
TRANCHE           23   5
Там мало данных, база только разрабатывается, я процедуру создал, хочется сразу оптимально запрос написать.
Если есть реальные данные, наполните ими таблицу и экспериментируйте.
Если реальных данных нет, адекватно сгенерируйте реальное их количество, наполните ими таблицу и экспериментируйте.

Иначе получается дутье на сферический вакуумный сосуд с водой в невесомости. :-)

На двух десятках строк вы можете получить любые результаты и любое их объяснение.
30 июл 12, 10:25    [12933132]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить