![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Хранимые процедуры IB [D7, IB6.x]
alex-xx © (2003-12-18 20:32:00)
Здравствуйте уважаемые!
Есть две серверные проседуры, возвращают они одно и тоже, но по отрабтке (по времени и по сжиранию ресурсов) это "небо и земля" объясните, кто может, почему так? Ниже листинги хранимых процедур.
Процедура 1 (очень медленная и ресурсоемкая)
CREATE PROCEDURE SUM_NACH_ABTRAF_CEPOTHKA (
KOD INTEGER,
DATE_S DATE)
RETURNS (
NACH_AB_TRAF __MONEY)
AS
begin
/* Procedure Text */
SELECT sum(nachisleniy.summa) as NACH_AB_TRAF
FROM nachisleniy
WHERE (nachisleniy.kod_ab in (select cepothka.kod from cepothka(:KOD))
and nachisleniy.date_mount<=:DATE_S)
into :NACH_AB_TRAF;
suspend;
end
Процедура 2 (быстрая)
CREATE PROCEDURE SUM_NACH_ABTRAF_CEPOTHKA_1 (
KOD INTEGER,
DATE_S DATE)
RETURNS (
NACH_AB_TRAF __MONEY)
AS
DECLARE VARIABLE KODDD INTEGER;
DECLARE VARIABLE SUMMA __MONEY;
begin
/* Procedure Text */
SUMMA=0;
NACH_AB_TRAF=0;
for
select cepothka.kod from cepothka(:KOD)
into :KODDD
do
begin
SELECT sum(nachisleniy.summa) as NACH_AB_TRAF
FROM nachisleniy
WHERE (nachisleniy.kod_ab =:KODDD and nachisleniy.date_mount<=:DATE_S)
into :SUMMA;
if (SUMMA is null) then begin SUMMA=0; end
NACH_AB_TRAF=NACH_AB_TRAF+SUMMA;
end
suspend;
end
alex-xx (2003-12-19 10:21:00) [1]
Убедили! Спасибо! Пойду почитаю...
Johnmen (2003-12-19 10:17:00) [2]
Я уверен на 99%, что его "промежуточные" операции "короче" :)
Чтобы глубже понять и "прочувствовать" надо все-таки почитать на krista.ru
alex-xx (2003-12-19 10:10:00) [3]
Я придвидел такой ответ... :)
В связи с чем следующий вопрос.
Вы на 100% уверены, что JOIN...ON выполняет меньше промежуточных операций чем описанная выше конструкция?
Johnmen (2003-12-19 09:42:00) [4]
Я предвидел такой вопрос...:)
Ускорение крайне незначительно (в %%) и практически его заметить трудно. Происходит за счет отказа от "промежуточных" операций.
Alex-xx (2003-12-18 23:17:00) [5]
Щас попробывал Ваш запрос - анализ производительности дал тот же результат, что и процедура №2
(может быть это упростит код, а не ускорит отработку? или я не прав?) если не прав, то за счет чего произойдет ускорение?
Alex-xx (2003-12-18 23:02:00) [6]
Спасибо! Пойду читать про объединения и ортимизацию....:)
Johnmen (2003-12-18 21:40:00) [7]
Потому, что
- селект из процедуры выполняется гарантированно один раз в №2, а в №1 возможно столько, сколько записей в nachisleniy (зависит от оптимизатора)
- в №1 вследствии наличия предиката IN будут последовательно перебираться значения в нём, в №2 такого безобразия нет
Чтобы ещё ускорить, можно обойтись просто запросом
SELECT sum(N.summa) as NACH_AB_TRAF
FROM cepothka(:KOD) C
JOIN nachisleniy N ON N.kod_ab=C.kod
WHERE N.date_mount<=:DATE_S
Про оптимизацию запросов читай krista.ru