Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как ускорить хранимую процедуру в Oracle


Danilka ©   (2003-02-18 09:37:00) 

Есть два запроса:
select t1_field1, t1_field2 from table1
where (select t2_field1 from table2 where t2_field2=t1_field2)=1

и
select t1.t1_field1, t1.t1_field2 from table1 t1, table2 t2
where t2.t2_field1=1 and t2_field2=t1_field2

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

Результат этих запросов мне надо писать в таблицу. То есть я делаю так:
insert into table3 (table_name1, table_name2)
а дальше - один из приведенных выше селектов.
Проблема: запросы первого типа не катят в хранимых процедурах :((
Как можно это обойти? Может можно по-другому написать для ХП, чтобы было так-же быстро как в первом запросе?


Danilka   (2003-02-18 12:07:00) [1]

Sergey13 © (18.02.03 11:48)
doc$all.getcurrentfirm - функция getcurrentfirm в пакете doc$all

все, разобрался. :))
вынес подзапросы в отдельные функции, теперь запрос выглядит так:
SELECT v.credit acc, v.amount ob_c
FROM doc_entry v
WHERE get_doc_firm(v.doc)=doc$all.getcurrentfirm
AND get_doc_period(v.doc)="01.11.2002"
AND get_acc_type(v.credit)=0

выполняется - 0,58 секунд.
Всем спасибо. :)


Sergey13   (2003-02-18 11:48:00) [2]

2Danilka © (18.02.03 11:25)
>g.firm=doc$all.getcurrentfirm
Вот это поясни, что такое? Пакетная переменная или функция что ли?
>все приведенные выше поля индексированы.
И все в одном индексе? 8-)
>план, оптимизатор и статистика мне ничего не говорят
Тогда сложно что то объяснять. 8-(

И опять повторюсь, странный синтаксис. Зачем нужен подзапрос если знаешь значение, которое он тебе вернет?


Danilka   (2003-02-18 11:25:00) [3]

Sergey13 © (18.02.03 10:48)
ладно, приведу немного подкряченые вырезки из реального кода:

SELECT v.credit acc, v.amount ob_c
FROM doc_entry v, doc_accounting a, doc_general g, accounts_card c
WHERE a.begin_date="01.11.2002" AND a.doc=v.doc
AND g.firm=doc$all.getcurrentfirm AND g.doc=v.doc
AND c.accounts_card_type=0 AND c.balance_account=v.credit

SELECT v.credit acc, v.amount ob_c
FROM doc_entry v WHERE (SELECT begin_date FROM doc_accounting a WHERE a.doc=v.doc)="01.11.2002"
AND (SELECT firm FROM doc_general g WHERE g.doc = v.doc)=doc$all.getcurrentfirm
AND (SELECT accounts_card_type FROM accounts_card WHERE balance_account=v.credit)=0

первый запрос выполняется 45,47 секунд, второй 0,19 секунд.
все приведенные выше поля индексированы.
поле doc во всех таблицах - уникальное.

план, оптимизатор и статистика мне ничего не говорят, может просто я, ламер, незнаю что это такое и где оно лежит...

Dmitry Rogov (18.02.03 11:10)
что-то я сглючил, сам до этого не додумался, сейчас попробую...


Dmitry Rogov   (2003-02-18 11:10:00) [4]

Используй динамический SQL.


Sergey13   (2003-02-18 10:48:00) [5]

А какие индексы есть на таблицах? Что план говорит? Какой оптимизатор, есть ли статистика?


Danilka   (2003-02-18 10:39:00) [6]

Sergey13 © (18.02.03 10:20)
попробовал, так-же медленно как и во втором запросе. :((

а синтаксис нормальный, запрос с подзапросом. орокол его юзает в разы быстрее чем второй...

вот-так, тоже будет очень быстро:
selectt1.field_name1, ( selectt2.field_name2 fromt2 wheret2.field_name1=t1.field_name1) fromt2
иногда в разы быстрее чем вот-так:
selectt1.field_name1, t2.field_name2 fromt1, t2
wheret2.field_name1=t1.field_name1

(блин, запарился тэги расставлять)
но это тоже не работает в ХП. :((


Sergey13   (2003-02-18 10:20:00) [7]

Странный синтаксис у первого.
Может так попробовать
select t1_field1, t1_field2 from table1 t1,(select t1_field2 from table2 where t1_field1=1) t2
where t2.t2_field2=t1.t1_field2
если ничего в твоих field не напутал 8-)


Наверх

Титульная страница Поиск, карта сайта Написать письмо