![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
По эффективности [D6, Win2k]
}|{yk © (2004-08-06 16:48:00)Можно ли вот такой запрос
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
переписать более эффективнее?
Sergey13 (2004-08-09 12:10:00) [1]2[13] }|{yk © (09.08.04 11:35)
>Да, выборка делается по небольшому диапазону, всего 10 тыс записей.
В смысле "деревянная" выборка из 10 тыс? Так это не мало мягко сказать. Смотри план выполнения.
Жук (2004-08-09 11:55:00) [2]
> }|{yk ©
> Жук - наш президент
Конечно, приятно, но давайте не будем...
}|{yk (2004-08-09 11:35:00) [3]Да, выборка делается по небольшому диапазону, всего 10 тыс записей.
---
Жук - наш президент
Sergey13 (2004-08-09 11:09:00) [4]2[9] }|{yk © (06.08.04 18:11)
>Как была 0,02 с, так и осталась
А что хотелось бы в идеале? С минусом?
>Жук - наш президент
Чур меня. У нас своих жуков... 8-)
Особо не рассматривал запрос, но... Я добивался неплохих приростов скорости, когда ограничивал "деревянные" выборки (они обычно самые прожорливые) с помощью денормализации. Т.е. деревяшка работала не по всей таблице, а по вложенному селекту. Т.е. для каждой "полной ветки" был свой индексированный признак.
EXPLAINE PLANE поможет всегда.
Danilka (2004-08-09 10:52:00) [5][9] }|{yk © (06.08.04 18:11)
> От перестановки скорость не увеличилась. Как была 0,02 с,
> так и осталась
Это сейчас. А через пол-года - год, возможно, пользователи начнут вешаться со старых запросов. и будут они отрабатывать не 0.02 с, а 10 минут, например. Лучше сразу сделать правильно, а то обычная практика - при разработке все летает, при заполнении данными система начинает разваливаться из-за диких тормозов.
Sandman25 (2004-08-09 10:32:00) [6][9] }|{yk © (06.08.04 18:11)
Нет, была 0.021, а стала 0.019 :)
Доктор сказал: "В морг", значит, в морг. (c)
}|{yk (2004-08-06 18:11:00) [7]От перестановки скорость не увеличилась. Как была 0,02 с, так и осталась
---
Жук - наш президент
Sandman25 (2004-08-06 17:10:00) [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)
?
В-общем, повторяю еще раз. Переписать все нафиг :)
Sandman25 (2004-08-06 17:08:00) [9]Неужели?
Почему бы
set_id = :in_set_id
AND line_id = :in_line_id
не засунуть в расчет zapyt?
Для начала...
}|{yk (2004-08-06 17:06:00) [10]Почему? Мы изначально получаем только то, что нужно? Только потом добавляю дни, в которых не было платежей (с нулевыми платежами)
Sandman25 (2004-08-06 17:02:00) [11]Переписать все нафиг, не забывая про основной принцип - не получать то, что не нужно. А то сначала все суммы находим, а только потом смотрим, а что же мы, собственно говоря, ищем.
}|{yk (2004-08-06 16:59:00) [12]А что ужасного?
---
Жук - наш президент
}|{yk (2004-08-06 16:56:00) [13]Так, спасибо, а еще?
---
Жук - наш президент
Sandman25 (2004-08-06 16:51:00) [14]Я тут еще немного поковырялся и могу добавить, что запрос ужасно написан. Как раз тот случай, когда Oracle c его select from (select) только вредит.
Sandman25 (2004-08-06 16:50:00) [15]Конечно, можно. Например, зачем нужен Order by во вложенном селекте?