Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / dynamic_sampling / 25 сообщений из 28, страница 1 из 2
06.03.2018, 00:38
    #39610928
Valergrad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dynamic_sampling
Кто-нибудь где-нибудь натыкался на ноты с действительно хорошим и глубоким объяснением как работает динамик_самплинг?
У нас на некотором запросе оракл самопроизвольно включает dynamic_sampling level = 5, при этом по непонятной причине ошибается в кардиналити в десятки и сотни раз, хотя анализа 128 случайных блоков в данном случае должно быть более чем достаточно для верной оценки.
Возможно ли что дело в том, что табличка интервально партиционирована, и почти все нужные строки для данного запроса лежат в последней партиции ( end_time = 2100-й год ), а он выбирает для анализа случайные партиции из 1048575 виртуальных партиций ( хотя реальных там всего лишь несколько десятков)?
...
Рейтинг: 0 / 0
06.03.2018, 01:45
    #39610935
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dynamic_sampling
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
06.03.2018, 01:46
    #39610936
Valergrad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dynamic_sampling
Например, вопросы, влияет ли stale stats на уровень динамик сэмплинга?
Делается ли он по всем партициям, или только по тем, которые в pstart .. pstop? Или только по stale?
В случае параллельных запросов - делается ли dynamic_sampling один раз для всех?
...
Рейтинг: 0 / 0
06.03.2018, 02:02
    #39610939
Valergrad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dynamic_sampling
Версия 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
06.03.2018, 02:16
    #39610940
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dynamic_sampling
ValergradНапример, вопросы, влияет ли stale stats на уровень динамик сэмплинга?нет, stale stats лишь влияет на то будет dynamic sampling запущен или нет (естественно, в зависимости от самого уровня DS)

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

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

зы. хотя насколько помню, был баг, когда слейвы свой отдельный чайлд порождали, но это давно пофиксили...
...
Рейтинг: 0 / 0
06.03.2018, 02:22
    #39610941
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dynamic_sampling
ValergradКАК Оракл это решает?имхо не имеет особого смысла это выяснять, но где-то я уже читал как кто-то тестировал насколько поднимается при каких условиях, но было неинтересно да и не найду уже...
ValergradКаким образом он получает такую неправильную кардиналити динамик сэмплингомпросто глянь его запросы в своей же сессии и увидишь, ну и с 10053
...
Рейтинг: 0 / 0
06.03.2018, 02:39
    #39610946
Valergrad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dynamic_sampling
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
06.03.2018, 03:00
    #39610949
Valergrad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dynamic_sampling
xtenderпросто глянь его запросы в своей же сессии и увидишь, ну и с 10053

Так проблема-то как раз в том, что при ручном запуске никакого dynamic_samplinga нет, он спокойно берет стату из словарей и не выпендривается. Ишью которые легко воспроизводятся - с ними как правило никаких проблем нет...
...
Рейтинг: 0 / 0
06.03.2018, 06:11
    #39610961
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dynamic_sampling
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
06.03.2018, 08:02
    #39610980
Kamael
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dynamic_sampling
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
06.03.2018, 13:46
    #39611195
Valergrad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dynamic_sampling
По вашему совету снял трассу 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
06.03.2018, 14:13
    #39611213
oracloud
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dynamic_sampling
Valergrad,

ALTER SYSTEM SET "_fix_control"='7452863:0';
...
Рейтинг: 0 / 0
06.03.2018, 14:19
    #39611219
Valergrad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dynamic_sampling
Ага, стало понятней.
Для этого запроса используется индекс по 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
06.03.2018, 15:38
    #39611288
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dynamic_sampling
ValergradВ таблице по dba_tab_statistics 91294 блокаa сумма в dba_segments?
...
Рейтинг: 0 / 0
06.03.2018, 16:20
    #39611315
Valergrad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dynamic_sampling
xtender,

92800 - почти то же самое.
...
Рейтинг: 0 / 0
06.03.2018, 16:58
    #39611350
orac_list
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dynamic_sampling
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
07.03.2018, 01:19
    #39611572
Valergrad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dynamic_sampling
[quot orac_list]ValergradЭто можно отключить через "_fix_control"='7452863:OFF'

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

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

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

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

зы. вообще прислал бы трейсы...
...
Рейтинг: 0 / 0
07.03.2018, 02:52
    #39611586
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dynamic_sampling
...
Рейтинг: 0 / 0
07.03.2018, 03:21
    #39611589
Valergrad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dynamic_sampling
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
07.03.2018, 03:33
    #39611590
Valergrad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dynamic_sampling
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
Форумы / Oracle [игнор отключен] [закрыт для гостей] / dynamic_sampling / 25 сообщений из 28, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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