Главная страница
    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.46 MB
Время: 0.008 c
3-16965
Ditrix
2003-02-17 13:28
2003.03.06
SQL запрос на выявление дублей ID


6-17229
3asys
2003-01-17 13:23
2003.03.06
Как сохранить страницу показанную в TWebBrowser?


14-17367
Сатир
2003-02-16 15:22
2003.03.06
Третья встреча мастаков в Киеве


14-17281
Flashas
2003-02-19 10:59
2003.03.06
gde mozno naiti prislat Delphi 6


1-17112
Николай В.
2003-02-25 14:31
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский