Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.09.05;
Скачать: [xml.tar.bz2];

Вниз

По эффективности   Найти похожие ветки 

 
}|{yk ©   (2004-08-06 16:48) [0]

Можно ли вот такой запрос

select plat_date, sum(summ_plat) summa from (
SELECT plat_date, summ_plat
 FROM (SELECT   b.set_id, b.line_id, b.plat_date, SUM (b.summa) summ_plat
           FROM app_bank b
          WHERE b.unit_id IN (
                   SELECT mem_id
                     FROM (SELECT     a.set_id, a.mem_id, a.mem_pid
                                 FROM unit_tree a
                           START WITH a.mem_id = :in_unit_id
                           CONNECT BY PRIOR a.mem_id = a.mem_pid))
       GROUP BY b.set_id, b.line_id, b.plat_date
       ORDER BY b.plat_date, b.set_id, b.line_id) zapyt
WHERE zapyt.set_id = :in_set_id
  AND zapyt.line_id = :in_line_id
  AND zapyt.plat_date
         BETWEEN ADD_MONTHS ((  TRUNC (LAST_DAY (TO_DATE (:in_date,
                                                          "dd.mm.yyyy"
                                                         )
                                                )
                                      )
                              + 1
                             ),
                             -1
                            )
             AND TRUNC (LAST_DAY (TO_DATE (:in_date, "dd.mm.yyyy")))
union
SELECT (TO_DATE (:in_date, "dd.mm.yyyy") + ROWNUM - 1) plat_date,
 0 summ_plat
 FROM all_objects
WHERE ROWNUM <=
         EXTRACT (DAY FROM (TRUNC (LAST_DAY (TO_DATE (:in_date,
                                                      "dd.mm.yyyy"
                                                     )
                                            )
                                  )
                           )
                 )
)
group by plat_date
order by plat_date

переписать более эффективнее?


 
Sandman25 ©   (2004-08-06 16:50) [1]

Конечно, можно. Например, зачем нужен Order by во вложенном селекте?


 
Sandman25 ©   (2004-08-06 16:51) [2]

Я тут еще немного поковырялся и могу добавить, что запрос ужасно написан. Как раз тот случай, когда Oracle c его select from (select) только вредит.


 
}|{yk ©   (2004-08-06 16:56) [3]

Так, спасибо, а еще?

---
Жук - наш президент


 
}|{yk ©   (2004-08-06 16:59) [4]

А что ужасного?

---
Жук - наш президент


 
Sandman25 ©   (2004-08-06 17:02) [5]

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


 
}|{yk ©   (2004-08-06 17:06) [6]

Почему? Мы изначально получаем только то, что нужно? Только потом добавляю дни, в которых не было платежей (с нулевыми платежами)


 
Sandman25 ©   (2004-08-06 17:08) [7]

Неужели?

Почему бы
set_id = :in_set_id
AND line_id = :in_line_id

не засунуть в расчет zapyt?
Для начала...


 
Sandman25 ©   (2004-08-06 17:10) [8]

Почему
SELECT mem_id
                    FROM (SELECT     a.set_id, a.mem_id, a.mem_pid
                                FROM unit_tree a
                          START WITH a.mem_id = :in_unit_id
                          CONNECT BY PRIOR a.mem_id = a.mem_pid))
а не
(SELECT     a.mem_id
                                FROM unit_tree a
                          START WITH a.mem_id = :in_unit_id
                          CONNECT BY PRIOR a.mem_id = a.mem_pid)
?
В-общем, повторяю еще раз. Переписать все нафиг :)


 
}|{yk ©   (2004-08-06 18:11) [9]

От перестановки скорость не увеличилась. Как была 0,02 с, так и осталась

---
Жук - наш президент


 
Sandman25 ©   (2004-08-09 10:32) [10]

[9] }|{yk ©   (06.08.04 18:11)

Нет, была 0.021, а стала 0.019 :)

Доктор сказал: "В морг", значит, в морг. (c)


 
Danilka ©   (2004-08-09 10:52) [11]

[9] }|{yk ©   (06.08.04 18:11)
> От перестановки скорость не увеличилась. Как была 0,02 с,
> так и осталась

Это сейчас. А через пол-года - год, возможно, пользователи начнут вешаться со старых запросов. и будут они отрабатывать не 0.02 с, а 10 минут, например. Лучше сразу сделать правильно, а то обычная практика - при разработке все летает, при заполнении данными система начинает разваливаться из-за диких тормозов.


 
Sergey13 ©   (2004-08-09 11:09) [12]

2[9] }|{yk ©   (06.08.04 18:11)
>Как была 0,02 с, так и осталась
А что хотелось бы в идеале? С минусом?

>Жук - наш президент
Чур меня. У нас своих жуков... 8-)

Особо не рассматривал запрос, но... Я добивался неплохих приростов скорости, когда ограничивал "деревянные" выборки (они обычно самые прожорливые) с помощью денормализации. Т.е. деревяшка работала не по всей таблице, а по вложенному селекту. Т.е. для каждой "полной ветки" был свой индексированный признак.

EXPLAINE PLANE поможет всегда.


 
}|{yk ©   (2004-08-09 11:35) [13]

Да, выборка делается по небольшому диапазону, всего 10 тыс записей.

---
Жук - наш президент


 
Жук ©   (2004-08-09 11:55) [14]


> }|{yk ©
> Жук - наш президент

Конечно, приятно, но давайте не будем...


 
Sergey13 ©   (2004-08-09 12:10) [15]

2[13] }|{yk ©   (09.08.04 11:35)
>Да, выборка делается по небольшому диапазону, всего 10 тыс записей.
В смысле "деревянная" выборка из 10 тыс? Так это не мало мягко сказать. Смотри план выполнения.



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2004.09.05;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.034 c
10-1035384970
Erik
2002-10-23 18:56
2004.09.05
Вызов CallBack


1-1092512912
European
2004-08-14 23:48
2004.09.05
Application.ProcessMessages, модальная форма и длительный цикл


14-1092692890
Profi
2004-08-17 01:48
2004.09.05
Player


14-1092549805
vidiv
2004-08-15 10:03
2004.09.05
Геометрическая задача


3-1092139150
dD5
2004-08-10 15:59
2004.09.05
Выручайте! Проблема с InterBase





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский