Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Запретить использование связанных переменных  [new]
vr-frost
Member

Откуда:
Сообщений: 64
Здравствуйте!
Подскажите, как можно запретить в запросе внутри процедуры использование связанных переменных? Не используя DSQL
27 фев 15, 08:19    [17319155]     Ответить | Цитировать Сообщить модератору
 Re: Запретить использование связанных переменных  [new]
vr-frost
Member

Откуда:
Сообщений: 64
Или, как вариант, перестраивать план запроса при каждом выполнении.
27 фев 15, 08:43    [17319209]     Ответить | Цитировать Сообщить модератору
 Re: Запретить использование связанных переменных  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54382
vr-frost,

орацл - казлы?
27 фев 15, 08:54    [17319236]     Ответить | Цитировать Сообщить модератору
 Re: Запретить использование связанных переменных  [new]
vr-frost
Member

Откуда:
Сообщений: 64
andreymx,

надо
27 фев 15, 09:00    [17319261]     Ответить | Цитировать Сообщить модератору
 Re: Запретить использование связанных переменных  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18484
_optim_peek_user_binds вроде как не даст подглядывать (но и план меняться не будет)
dbms_shared_pool.purge позволит удалить курсор (с планом) из кеша
27 фев 15, 09:10    [17319283]     Ответить | Цитировать Сообщить модератору
 Re: Запретить использование связанных переменных  [new]
ten
Member

Откуда: Екатеринбург
Сообщений: 1672
vr-frost
надо

Зачем?
p.s.Так и хочется в фак "Как правильно задавать вопросы послать" :)
27 фев 15, 09:55    [17319402]     Ответить | Цитировать Сообщить модератору
 Re: Запретить использование связанных переменных  [new]
vr-frost
Member

Откуда:
Сообщений: 64
Надеялся что просто есть подходящий хинт.
Нашел хорошую статью на тему, но подвела версия БД 11.1.0.7

ten, Посылайте куда угодно, если это даст ответ на мой вопрос.

Вячеслав Любомудров, спасибо. Буду разбираться, _optim_peek_user_binds в лоб не помог, видимо там тонкости какие-то, может статистику сначала надо удалить...
27 фев 15, 10:21    [17319502]     Ответить | Цитировать Сообщить модератору
 Re: Запретить использование связанных переменных  [new]
ten
Member

Откуда: Екатеринбург
Сообщений: 1672
vr-frost,
автор
Описывайте цель, а не отдельный шаг.
Если вы пытаетесь разобраться, как что-либо сделать (а не сообщаете об ошибке), начинайте с описания цели. И только потом описывайте конкретный шаг на пути к ней, который вы оне смогли выполнить.

Как правильно задавать вопросы
27 фев 15, 10:37    [17319564]     Ответить | Цитировать Сообщить модератору
 Re: Запретить использование связанных переменных  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54382
vr-frost
Надеялся что просто есть подходящий хинт.
Нашел хорошую статью на тему, но подвела версия БД 11.1.0.7

ten, Посылайте куда угодно, если это даст ответ на мой вопрос.

Вячеслав Любомудров, спасибо. Буду разбираться, _optim_peek_user_binds в лоб не помог, видимо там тонкости какие-то, может статистику сначала надо удалить...
хорошее предостережение в статье (для некоторых случаев форсирования разбора):
"дочерний курсор генерируется (с выполнением необходимого hard parse) при каждом выполнении запроса независимо от значений связанных переменных"
27 фев 15, 11:04    [17319771]     Ответить | Цитировать Сообщить модератору
 Re: Запретить использование связанных переменных  [new]
vr-frost
Member

Откуда:
Сообщений: 64
Вячеслав Любомудров,
С DBMS_SHARED_POOL.PURGE вроде получилось. Подскажите еще пожалуйста, address и hash_value остаются неизменными если запрос не менять?
27 фев 15, 11:07    [17319794]     Ответить | Цитировать Сообщить модератору
 Re: Запретить использование связанных переменных  [new]
vr-frost
Member

Откуда:
Сообщений: 64
andreymx
хорошее предостережение в статье (для некоторых случаев форсирования разбора):
"дочерний курсор генерируется (с выполнением необходимого hard parse) при каждом выполнении запроса независимо от значений связанных переменных"

Чего я собственно и добиваюсь, т.к. запрос достаточно тяжелый и выполняется редко, то время на разбор не критично.
27 фев 15, 11:11    [17319830]     Ответить | Цитировать Сообщить модератору
 Re: Запретить использование связанных переменных  [new]
ArtNick
Member

Откуда:
Сообщений: 1227
vr-frost
andreymx
хорошее предостережение в статье (для некоторых случаев форсирования разбора):
"дочерний курсор генерируется (с выполнением необходимого hard parse) при каждом выполнении запроса независимо от значений связанных переменных"

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


Совсем в лоб- откажись от linked в пользу генерации скриптов.
27 фев 15, 11:19    [17319880]     Ответить | Цитировать Сообщить модератору
 Re: Запретить использование связанных переменных  [new]
vr-frost
Member

Откуда:
Сообщений: 64
ArtNick, ну я написал в первом посте "Не используя DSQL"

Короче не помогает построение плана при каждом запросе. Все равно оптимизатор не справляется.
Возвращаясь к первому вопросу "как можно запретить в запросе внутри процедуры использование связанных переменных"
Суть проблемы в том, что в зависимости от переданных параметров планы запроса будут сильно отличаться, а для оптимизатора запрос выглядит всегда одинаково
Тут я вижу такие варианты:
Разбить запрос на несколько и выполнять через case в зависимости от входных параметров процедуры (таким образом нивелировать влияние связанных переменных)
Использовать динамические запросы.

Какие еще есть варианты?
27 фев 15, 12:36    [17320412]     Ответить | Цитировать Сообщить модератору
 Re: Запретить использование связанных переменных  [new]
ArtNick
Member

Откуда:
Сообщений: 1227
vr-frost
ArtNick, ну я написал в первом посте "Не используя DSQL"

Возвращаясь к первому вопросу "как можно запретить в запросе внутри процедуры использование связанных переменных"

Тогда я тебя не понимаю...
Запретить кому? Программисту? ну это бред какой-то....
Или хочешь переписать запрос без линкед переменных и DSQL? Ну тогда сделай через параметризирующую таблицу, хотя врядли поможет с оптимизацией.
вместо :
 select * from dual where trunc(sysdate) = :Rep_Date 

сделай:
insert into query_params (param_name,value_date) values ('Rep_Date',:Rep_Date);
 select * 
 from dual a
 inner join query_params b on param_name='Rep_Date'
 where trunc(sysdate) = b.value_date
27 фев 15, 12:49    [17320500]     Ответить | Цитировать Сообщить модератору
 Re: Запретить использование связанных переменных  [new]
vr-frost
Member

Откуда:
Сообщений: 64
ArtNick, да, перечитал... слово "запретить" вообще не в тему
Имелось ввиду, что-то вроде, "воспринимать значения переменных как обычные константы"
Хреновый из меня "поэт", если честно

Грубо говоря
Запрос с использованием связанных переменных зависает
Запрос с использованием констант выполняется быстро
27 фев 15, 13:03    [17320606]     Ответить | Цитировать Сообщить модератору
 Re: Запретить использование связанных переменных  [new]
ArtNick
Member

Откуда:
Сообщений: 1227
vr-frost,
Собственно если ты не доверяешь оптимизатору то бери на себя его работу. Прибивай несколько планов и, анализируя параметры, выполняй по тому или иному плану. Гвозди для прибития плана бывают самые разные: SQL management base, наличие нескольких запросов с разным набором хинтов, наличие нескольких запросов с разным where clause
27 фев 15, 13:08    [17320644]     Ответить | Цитировать Сообщить модератору
 Re: Запретить использование связанных переменных  [new]
Nobody1111
Guest
vr-frost
Вячеслав Любомудров, спасибо. Буду разбираться, _optim_peek_user_binds в лоб не помог, видимо там тонкости какие-то, может статистику сначала надо удалить...


cursor_sharing=exact ?
27 фев 15, 13:33    [17320815]     Ответить | Цитировать Сообщить модератору
 Re: Запретить использование связанных переменных  [new]
Nobody1111
Guest
Или, возможно, поможет пересобрать статистику по имеющимся в запросе таблицам строго без гистограмм.
27 фев 15, 13:36    [17320845]     Ответить | Цитировать Сообщить модератору
 Re: Запретить использование связанных переменных  [new]
Eugene12
Member

Откуда:
Сообщений: 67
Сколько уникальных сочетаний параметров ожидается?
3-5 или сотни?
27 фев 15, 14:22    [17321199]     Ответить | Цитировать Сообщить модератору
 Re: Запретить использование связанных переменных  [new]
ArtNick
Member

Откуда:
Сообщений: 1227
Eugene12
Сколько уникальных сочетаний параметров ожидается?
3-5 или сотни?

Любой параметр типа date даст бесконечное число сочетаний. :)
3-,5, сотни, миллионы - без разницы, количество тюнингов запроса все равно конечно.
27 фев 15, 14:34    [17321251]     Ответить | Цитировать Сообщить модератору
 Re: Запретить использование связанных переменных  [new]
Eugene12
Member

Откуда:
Сообщений: 67
ArtNick,

vr-frost не указал тип данных. Возможно это 3-5 штук ID из справочника. Или действительно дата или произвольная строка.
27 фев 15, 15:06    [17321528]     Ответить | Цитировать Сообщить модератору
 Re: Запретить использование связанных переменных  [new]
Melkomyagkii_newbi
Member

Откуда: из прошлого
Сообщений: 1861
vr-frost
ArtNick, да, перечитал... слово "запретить" вообще не в тему
Имелось ввиду, что-то вроде, "воспринимать значения переменных как обычные константы"
Хреновый из меня "поэт", если честно

Грубо говоря
Запрос с использованием связанных переменных зависает
Запрос с использованием констант выполняется быстро


Смотри план с константами, фигач _optim_peek_user_binds хинтом или на уровне сессии(главное потом взад поменять) и хинтуй запрос с переменными так, что бы план стал похож на тот, что с константами. Еще как хотфикс можешь попробовать применить профиль с адвайзором так:

DECLARE
    sts_task VARCHAR2(64);
BEGIN
    dbms_sqltune.drop_sql_profile('Profile_75zwu3anuz66u');
    --
    sts_task := dbms_sqltune.create_tuning_task(sql_id => '75zwu3anuz66u');
    -- 
    dbms_sqltune.execute_tuning_task(sts_task);
    --
    dbms_sqltune.accept_sql_profile(task_name => sts_task, NAME => 'Profile_75zwu3anuz66u');
END;
/


По крайней мере мне в похожих ситуациях сильно помогало.
27 фев 15, 15:29    [17321715]     Ответить | Цитировать Сообщить модератору
 Re: Запретить использование связанных переменных  [new]
Lunaire
Member

Откуда:
Сообщений: 44
vr-frost
Суть проблемы в том, что в зависимости от переданных параметров планы запроса будут сильно отличаться, а для оптимизатора запрос выглядит всегда одинаково


Суть проблемы непонятна. Объясните доходчивей, пожалуйста.
27 фев 15, 15:57    [17321897]     Ответить | Цитировать Сообщить модератору
 Re: Запретить использование связанных переменных  [new]
Den89
Member

Откуда: Санкт-Петербург
Сообщений: 351
Чем Adaptive Cursor Sharing не подходит? С 11.1 работает.
27 фев 15, 16:01    [17321926]     Ответить | Цитировать Сообщить модератору
 Re: Запретить использование связанных переменных  [new]
Melkomyagkii_newbi
Member

Откуда: из прошлого
Сообщений: 1861
Den89
Чем Adaptive Cursor Sharing не подходит? С 11.1 работает.


не всегда работает так как хотелось бы. У меня были проблемы с сильно неоптимальными планами - СF срабатывает для одного набора значений параметров, рождается план неплохой для этого набора, потом выполняется запрос с другими значениями и для него этот план совсем не подходит. Правда там много еще проблем со статистикой было, справедливости ради.. Но в моем случае отключить CF
EXECUTE IMMEDIATE 'alter session set "_OPTIMIZER_EXTENDED_CURSOR_SHARING_REL"=NONE';

уже сильно помогло, исчезли огромные пики в тыщи секунд. Потом я и вовсе стал отключать байнд пикинг, чтобы план не зависел от первого набора значений переменных при запуске, плюс хинты. Для большинства запросов теперь все укладывается в сотню секунд, а кто не укладывается, там другие проблемы уже(вымывание с буфферного кеша и чтения с диска, своппинг сортировок), но тут смена плана уже не поможет.
27 фев 15, 16:42    [17322207]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle Ответить