Форум: "Базы";
Текущий архив: 2003.03.06;
Скачать: [xml.tar.bz2];
ВнизКак ускорить хранимую процедуру в Oracle Найти похожие ветки
← →
Danilka (2003-02-18 09:37) [0]Есть два запроса:
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)
а дальше - один из приведенных выше селектов.
Проблема: запросы первого типа не катят в хранимых процедурах :((
Как можно это обойти? Может можно по-другому написать для ХП, чтобы было так-же быстро как в первом запросе?
← →
Sergey13 (2003-02-18 10:20) [1]Странный синтаксис у первого.
Может так попробовать
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-)
← →
Danilka (2003-02-18 10:39) [2]Sergey13 © (18.02.03 10:20)
попробовал, так-же медленно как и во втором запросе. :((
а синтаксис нормальный, запрос с подзапросом. орокол его юзает в разы быстрее чем второй...
вот-так, тоже будет очень быстро:
select t1.field_name1, ( select t2.field_name2 from t2 where t2.field_name1=t1.field_name1) from t2
иногда в разы быстрее чем вот-так:
select t1.field_name1, t2.field_name2 from t1, t2
where t2.field_name1=t1.field_name1
(блин, запарился тэги расставлять)
но это тоже не работает в ХП. :((
← →
Sergey13 (2003-02-18 10:48) [3]А какие индексы есть на таблицах? Что план говорит? Какой оптимизатор, есть ли статистика?
← →
Dmitry Rogov (2003-02-18 11:10) [4]Используй динамический SQL.
← →
Danilka (2003-02-18 11:25) [5]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)
что-то я сглючил, сам до этого не додумался, сейчас попробую...
← →
Sergey13 (2003-02-18 11:48) [6]2Danilka © (18.02.03 11:25)
>g.firm=doc$all.getcurrentfirm
Вот это поясни, что такое? Пакетная переменная или функция что ли?
>все приведенные выше поля индексированы.
И все в одном индексе? 8-)
>план, оптимизатор и статистика мне ничего не говорят
Тогда сложно что то объяснять. 8-(
И опять повторюсь, странный синтаксис. Зачем нужен подзапрос если знаешь значение, которое он тебе вернет?
← →
Danilka (2003-02-18 12:07) [7]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 секунд.
Всем спасибо. :)
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2003.03.06;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.01 c