powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / dynamic_sampling
25 сообщений из 28, страница 1 из 2
dynamic_sampling
    #39610928
Valergrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кто-нибудь где-нибудь натыкался на ноты с действительно хорошим и глубоким объяснением как работает динамик_самплинг?
У нас на некотором запросе оракл самопроизвольно включает dynamic_sampling level = 5, при этом по непонятной причине ошибается в кардиналити в десятки и сотни раз, хотя анализа 128 случайных блоков в данном случае должно быть более чем достаточно для верной оценки.
Возможно ли что дело в том, что табличка интервально партиционирована, и почти все нужные строки для данного запроса лежат в последней партиции ( end_time = 2100-й год ), а он выбирает для анализа случайные партиции из 1048575 виртуальных партиций ( хотя реальных там всего лишь несколько десятков)?
...
Рейтинг: 0 / 0
dynamic_sampling
    #39610935
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Valergrad,

https://blogs.oracle.com/optimizer/dynamic-sampling-and-its-impact-on-the-optimizer
https://blogs.oracle.com/optimizer/optimizer-adaptive-features-in-oracle-database-12c-release-2
http://oracle-randolf.blogspot.de/2009/06/dynamic-sampling-and-partitioned-tables.html

Valergradоракл самопроизвольно включает dynamic_sampling level = 5oracle какой версии? А то там есть существенная разница. Хотя подозреваю, что у тебя просто параллельное выполнение и optimizer_dynamic_sampling дефолтный:
From Oracle Database 11g Release 2 onwards, the optimizer automatically decides if dynamic sampling will be useful and what dynamic sampling level will be used for SQL statements executed in parallel. This decision is based on size of the tables in the statement and the complexity of the predicates.

зы. если память мне не изменяет, то есть разница между дефолтным 2 или установленным 2 (т.е. установлен через alter system или файл параметров): при установленных вручную 2 optimizer_dynamic_sampling при параллели не рассчитывается автоматически, а берет установленные 2
...
Рейтинг: 0 / 0
dynamic_sampling
    #39610936
Valergrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Например, вопросы, влияет ли stale stats на уровень динамик сэмплинга?
Делается ли он по всем партициям, или только по тем, которые в pstart .. pstop? Или только по stale?
В случае параллельных запросов - делается ли dynamic_sampling один раз для всех?
...
Рейтинг: 0 / 0
dynamic_sampling
    #39610939
Valergrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Версия 11.2.0.4.


[quot xtender]Valergrad,
Хотя подозреваю, что у тебя просто параллельное выполнение и optimizer_dynamic_sampling дефолтный:
From Oracle Database 11g Release 2 onwards, the optimizer automatically decides if dynamic sampling will be useful and what dynamic sampling level will be used for SQL statements executed in parallel. This decision is based on size of the tables in the statement and the complexity of the predicates.

Да, так и есть. И все же - кто-нибудь выяснил КАК Оракл это решает? Хотя это даже не самое интересное. Каким образом он получает такую неправильную кардиналити динамик сэмплингом - вот что самое интересное. 1 строка вместо почти миллиона...
...
Рейтинг: 0 / 0
dynamic_sampling
    #39610940
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
ValergradНапример, вопросы, влияет ли stale stats на уровень динамик сэмплинга?нет, stale stats лишь влияет на то будет dynamic sampling запущен или нет (естественно, в зависимости от самого уровня DS)

ValergradДелается ли он по всем партициям, или только по тем, которые в pstart .. pstop?"только по тем, которые в pstart .. pstop", это легко понять взглянув на сам запрос DS - в нем будут перечислены все предикаты из твоего запроса.

ValergradВ случае параллельных запросов - делается ли dynamic_sampling один раз для всех?в каком смысле параллельных? для кого - всех? параллельный план-то строится один и все слейвы его используют. Если же этот же запрос будет выполняться другими сессиями, то да - другие сессии должны взять уже этот готовый курсор (умышленно "забываю" про всякие ACS и прочие нюансы...)

зы. хотя насколько помню, был баг, когда слейвы свой отдельный чайлд порождали, но это давно пофиксили...
...
Рейтинг: 0 / 0
dynamic_sampling
    #39610941
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
ValergradКАК Оракл это решает?имхо не имеет особого смысла это выяснять, но где-то я уже читал как кто-то тестировал насколько поднимается при каких условиях, но было неинтересно да и не найду уже...
ValergradКаким образом он получает такую неправильную кардиналити динамик сэмплингомпросто глянь его запросы в своей же сессии и увидишь, ну и с 10053
...
Рейтинг: 0 / 0
dynamic_sampling
    #39610946
Valergrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtenderв каком смысле параллельных? для кого - всех? параллельный план-то строится один и все слейвы его используют. .

Насколько я знаю, каждый параллельный слейв делает свой собственный парс:

https://support.oracle.com/epmos/faces/DocumentDisplay?_afrLoop=238524328272102&id=751588.1&_afrWindowMode=0&_adf.ctrl-state=agewqgqrp_4

И если есть такое:
автор"However, since they have a different plan signature,"

то вдруг там каждый еще делает и хард парс??
...
Рейтинг: 0 / 0
dynamic_sampling
    #39610949
Valergrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtenderпросто глянь его запросы в своей же сессии и увидишь, ну и с 10053

Так проблема-то как раз в том, что при ручном запуске никакого dynamic_samplinga нет, он спокойно берет стату из словарей и не выпендривается. Ишью которые легко воспроизводятся - с ними как правило никаких проблем нет...
...
Рейтинг: 0 / 0
dynamic_sampling
    #39610961
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Valergradпри ручном запуске никакого dynamic_samplinga нетв параллели? на уровне сессии не менялся optimizer_dynamic_sampling? побольше бы информации... sqld360 например

ValergradНасколько я знаю, каждый параллельный слейв делает свой собственный парс:

https://support.oracle.com/epmos/faces/DocumentDisplay?_afrLoop=238524328272102&id=751588.1&_afrWindowMode=0&_adf.ctrl-state=agewqgqrp_4 ага, значит я просто неправильно запомнил
Я читал про такое - https://community.oracle.com/thread/3775551
но думал уже пофиксили, т.к. давно про это не слышал
...
Рейтинг: 0 / 0
dynamic_sampling
    #39610980
Kamael
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtenderValergradпри ручном запуске никакого dynamic_samplinga нетв параллели? на уровне сессии не менялся optimizer_dynamic_sampling? побольше бы информации... sqld360 например

ValergradНасколько я знаю, каждый параллельный слейв делает свой собственный парс:

https://support.oracle.com/epmos/faces/DocumentDisplay?_afrLoop=238524328272102&id=751588.1&_afrWindowMode=0&_adf.ctrl-state=agewqgqrp_4 ага, значит я просто неправильно запомнил
Я читал про такое - https://community.oracle.com/thread/3775551
но думал уже пофиксили, т.к. давно про это не слышал

Про параллельность...
Они это пофиксили тем, что паралельный запрос стал просто получать downgrade 100%, но перестал фейлиться, в нашем случае...
PX процессы повисают на cursor pin wait on X, кратковременно...
Что в 11.2, что в 12.1.0.2... баг ведём больше года.

Про DS
Можно снять трейс events 'trace[RDBMS.SQL_DS] disk=high' и параллеьно 10053. И анализировать, как это работает конкретно в вашем энвайроменте.
...
Рейтинг: 0 / 0
dynamic_sampling
    #39611195
Valergrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По вашему совету снял трассу 10053, нашел что конкретно сэмплируется. Стало еще более удивительней.

Вот запрос из трассы который dyn_sampl:

авторselect /* OPT_DYN_SAMP */ /*+ ALL_ROWS IGNORE_WHERE_CLAUSE NO_PARALLEL(SAMPLESUB) opt_param('parallel_execution_enabled', 'false') NO_PARALLEL_INDEX(SAMPLESUB) NO_SQL_TUNE */
nvl (sum (c1), 0), nvl (sum (c2), 0)
from (select /*+ IGNORE_WHERE_CLAUSE NO_PARALLEL("CR") FULL("CR") NO_PARALLEL_INDEX("CR") */
1 as c1, case when "CR"."RXM" is not null then 1 else 0 end as c2
from "MY_SCHEMA"."MY_USER" sample block (0.005477, 1) seed (1) "CR") samplesub;

Он возвращает 0 строк, что и рушит весь план.

Дело не в хинтах ( что бы они ни значили ), даже такое возвращает 0 строк:

авторselect 1 as c1, case when "CR"."RXM" is not null then 1 else 0 end as c2 from "MY_SCHEMA"."MY_USER" sample block (0.005477, 1) seed (1) "CR";


При этом вот это возвращает около 500 строк:

авторselect * from "MY_SCHEMA"."MY_USER" sample block (0.005477, 1) seed (1) "CR";

Это что? Баг, резалт-кэш или еще какая-то гадость?
...
Рейтинг: 0 / 0
dynamic_sampling
    #39611213
oracloud
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Valergrad,

ALTER SYSTEM SET "_fix_control"='7452863:0';
...
Рейтинг: 0 / 0
dynamic_sampling
    #39611219
Valergrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ага, стало понятней.
Для этого запроса используется индекс по RXM, а он в силу своего малого размера - получается с процентом sample block ( 0.005477 ) меньше одного бока ( 0,54 блока ), что и дает результат 0 строк.

Таким образом осталось разобраться буквально в одной вещи - отчего процент у динамик сэмплинга такой маленький?

Я предположил что процент должен рассчитываться по такой схеме.
В таблице по dba_tab_statistics 91294 блока, это 100%.
Должны мы взять 128 блоков, это X%.
Следовательно X = 128*100/91294 = 0.14020

В то время как наша цифра ( 0.005477 ) в 25 с лишний раз меньше. Это как-то связано с мультиблочными чтением?
...
Рейтинг: 0 / 0
dynamic_sampling
    #39611288
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
ValergradВ таблице по dba_tab_statistics 91294 блокаa сумма в dba_segments?
...
Рейтинг: 0 / 0
dynamic_sampling
    #39611315
Valergrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender,

92800 - почти то же самое.
...
Рейтинг: 0 / 0
dynamic_sampling
    #39611350
orac_list
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ValergradКто-нибудь где-нибудь натыкался на ноты с действительно хорошим и глубоким объяснением как работает динамик_самплинг?
У нас на некотором запросе оракл самопроизвольно включает dynamic_sampling level = 5, при этом по непонятной причине ошибается в кардиналити в десятки и сотни раз, хотя анализа 128 случайных блоков в данном случае должно быть более чем достаточно для верной оценки.


Different Level for Dynamic Statistics (Dynamic Sampling) used than the Level Specified (Doc ID 1102413.1)

The change in dynamic statistics is a result of an enhancement introduced in 11.2.

With this enhancement the optimizer itself changes the dynamic value under certain conditions such as with large tables and parallelism. The level is automatically adjusted based on the size of the tables in the query. This is done only for queries that will run in parallel which is typical for Data Warehouses and large databases.

Это можно отключить через "_fix_control"='7452863:OFF'
...
Рейтинг: 0 / 0
dynamic_sampling
    #39611572
Valergrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot orac_list]ValergradЭто можно отключить через "_fix_control"='7452863:OFF'

На уровне сессии? Некрасиво как-то...На уровне базы? Опасно.
Пока что я убрал параллельность у запроса - на производительность не влияет, а стабильность за счет отсутсвия всяких сэмплингов возрастает. Но это выглядит как явная недоработка оракла - ставить такой низкий процент sample block для такого маленького индекса.
Как это дело рассчитывается - так и не нашел.
...
Рейтинг: 0 / 0
dynamic_sampling
    #39611578
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Valergrad,

а ты попробовал 21239293 ? т.е. alter system set optimizer_dynamic_sampling=2?
...
Рейтинг: 0 / 0
dynamic_sampling
    #39611579
Valergrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtenderValergrad,

а ты попробовал 21239293 ? т.е. alter system set optimizer_dynamic_sampling=2?

Так у нас уже 2 :)
...
Рейтинг: 0 / 0
dynamic_sampling
    #39611581
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
я про это:xtenderзы. если память мне не изменяет, то есть разница между дефолтным 2 или установленным 2 (т.е. установлен через alter system или файл параметров): при установленных вручную 2 optimizer_dynamic_sampling при параллели не рассчитывается автоматически, а берет установленные 2
...
Рейтинг: 0 / 0
dynamic_sampling
    #39611582
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
ValergradТак у нас уже 2 :)прямо установлено в спфайле? видно в show spparameter optimizer_dynamic_sampling?
...
Рейтинг: 0 / 0
dynamic_sampling
    #39611585
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
_optimizer_dyn_smp_blks чему равен? 32?

зы. вообще прислал бы трейсы...
...
Рейтинг: 0 / 0
dynamic_sampling
    #39611586
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
...
Рейтинг: 0 / 0
dynamic_sampling
    #39611589
Valergrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender,

Да, 2 на уровне системы стоит ( поставили кажется после какой-то дискуссии).
Весь трейс прислать не могу - мало ли что там есть. Но вот собственно один из кусков на котором падает кардиналити, это я уже максимально упростил случай для воспроизведения ( здесь dynamic_sampling был левела 4):

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
*** 2018-03-06 16:04:15.021
** Generated dynamic sampling query:
    query text : 
SELECT /* OPT_DYN_SAMP */ /*+ ALL_ROWS IGNORE_WHERE_CLAUSE NO_PARALLEL(SAMPLESUB) opt_param('parallel_execution_enabled', 'false') NO_PARALLEL_INDEX(SAMPLESUB) NO_SQL_TUNE */ NVL(SUM(C1),0), NVL(SUM(C2),0), NVL(SUM(C3),0) FROM (SELECT /*+ IGNORE_WHERE_CLAUSE */ 1 AS C1, CASE WHEN "P"."V_PUBLISH_END_TIME">=TO_TIMESTAMP('02-MAR-2018') THEN 1 ELSE 0 END AS C2, CASE WHEN "P"."V_PUBLISH_END_TIME">=TO_TIMESTAMP('02-MAR-2018') THEN 1 ELSE 0 END AS C3 FROM (SELECT /*+ NO_PARALLEL("MY_SCHEMA"."MY_TABLE") FULL("MY_SCHEMA"."MY_TABLE") NO_PARALLEL_INDEX("MY_SCHEMA"."MY_TABLE") */ * FROM "MY_SCHEMA"."MY_TABLE" SAMPLE BLOCK (0.056653 , 1) SEED (1) WHERE TBL$OR$IDX$PART$NUM("MY_SCHEMA"."MY_TABLE",0,0,0,ROWID) IN (22,28,30,31,37,39,42,44,48,53,59,61,62,74,1057)) "P") SAMPLESUB

*** 2018-03-06 16:04:15.023
** Executed dynamic sampling query:
    level : 4
    sample pct. : 0.056653
    total partitions : 59
      partitions for sampling : 59
      partitions actually sampled from : 16
    actual sample size : 0
    filtered sample card. : 0
    filtered sample card. (index MY_TABLE_IDX): 0
    orig. card. : 8673338
    block cnt. table stat. : 84739
    block cnt. for sampling: 104142
    partition subset block cnt. : 28242
    max. sample block cnt. : 32
    sample block cnt. : 16
    min. sel. est. : 1.00000000
** Using single table dynamic sel. est. : 0.00000000
...
Рейтинг: 0 / 0
dynamic_sampling
    #39611590
Valergrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valergrad,

Глядя на трассу начинает немного просняться. Что в этой трассе понятно?

Понятна цифра:
block cnt. table stat. : 84739 - это прям ровно столько сколькое есть в DBA_TAB_STATISTICS.
Что такое "block cnt. for sampling" и откуда эта цифра 104142 - непонятно пока ( это не сумма блоков по партициям и не сумма в dba_segments - проверил).
Далее становится ясно что было выбрано 16 случайных партиций и посчитана сумма блоков в них, что дает цифру в partition subset block cnt. : 28242
Отсюда получается процент:
select 16 * 100 / 28242 from dual; как раз дает нам необходимые 0.056653.
...
Рейтинг: 0 / 0
25 сообщений из 28, страница 1 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / dynamic_sampling
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]