Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.57 MB
Время: 0.05 c
1-17066
Nemo
2003-02-25 02:51
2003.03.06
А можно сделать чтобы приложение нельзя было уничтожить?


7-17428
Лемур
2003-01-07 07:06
2003.03.06
USB-диск


1-16981
Diogen
2003-02-21 17:03
2003.03.06
Как программно узнать путь откуда запущена моя программа ?


8-17203
Карелин Артем
2002-11-22 09:34
2003.03.06
Быстрое копирование экрана. Часть I


14-17327
Карлсон
2003-02-17 18:15
2003.03.06
прав ли я в своих рассуждения?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский