|
|
|
dynamic_sampling
|
|||
|---|---|---|---|
|
#18+
Кто-нибудь где-нибудь натыкался на ноты с действительно хорошим и глубоким объяснением как работает динамик_самплинг? У нас на некотором запросе оракл самопроизвольно включает dynamic_sampling level = 5, при этом по непонятной причине ошибается в кардиналити в десятки и сотни раз, хотя анализа 128 случайных блоков в данном случае должно быть более чем достаточно для верной оценки. Возможно ли что дело в том, что табличка интервально партиционирована, и почти все нужные строки для данного запроса лежат в последней партиции ( end_time = 2100-й год ), а он выбирает для анализа случайные партиции из 1048575 виртуальных партиций ( хотя реальных там всего лишь несколько десятков)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2018, 00:38 |
|
||
|
dynamic_sampling
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2018, 01:45 |
|
||
|
dynamic_sampling
|
|||
|---|---|---|---|
|
#18+
Например, вопросы, влияет ли stale stats на уровень динамик сэмплинга? Делается ли он по всем партициям, или только по тем, которые в pstart .. pstop? Или только по stale? В случае параллельных запросов - делается ли dynamic_sampling один раз для всех? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2018, 01:46 |
|
||
|
dynamic_sampling
|
|||
|---|---|---|---|
|
#18+
Версия 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 строка вместо почти миллиона... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2018, 02:02 |
|
||
|
dynamic_sampling
|
|||
|---|---|---|---|
|
#18+
ValergradНапример, вопросы, влияет ли stale stats на уровень динамик сэмплинга?нет, stale stats лишь влияет на то будет dynamic sampling запущен или нет (естественно, в зависимости от самого уровня DS) ValergradДелается ли он по всем партициям, или только по тем, которые в pstart .. pstop?"только по тем, которые в pstart .. pstop", это легко понять взглянув на сам запрос DS - в нем будут перечислены все предикаты из твоего запроса. ValergradВ случае параллельных запросов - делается ли dynamic_sampling один раз для всех?в каком смысле параллельных? для кого - всех? параллельный план-то строится один и все слейвы его используют. Если же этот же запрос будет выполняться другими сессиями, то да - другие сессии должны взять уже этот готовый курсор (умышленно "забываю" про всякие ACS и прочие нюансы...) зы. хотя насколько помню, был баг, когда слейвы свой отдельный чайлд порождали, но это давно пофиксили... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2018, 02:16 |
|
||
|
dynamic_sampling
|
|||
|---|---|---|---|
|
#18+
ValergradКАК Оракл это решает?имхо не имеет особого смысла это выяснять, но где-то я уже читал как кто-то тестировал насколько поднимается при каких условиях, но было неинтересно да и не найду уже... ValergradКаким образом он получает такую неправильную кардиналити динамик сэмплингомпросто глянь его запросы в своей же сессии и увидишь, ну и с 10053 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2018, 02:22 |
|
||
|
dynamic_sampling
|
|||
|---|---|---|---|
|
#18+
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," то вдруг там каждый еще делает и хард парс?? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2018, 02:39 |
|
||
|
dynamic_sampling
|
|||
|---|---|---|---|
|
#18+
xtenderпросто глянь его запросы в своей же сессии и увидишь, ну и с 10053 Так проблема-то как раз в том, что при ручном запуске никакого dynamic_samplinga нет, он спокойно берет стату из словарей и не выпендривается. Ишью которые легко воспроизводятся - с ними как правило никаких проблем нет... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2018, 03:00 |
|
||
|
dynamic_sampling
|
|||
|---|---|---|---|
|
#18+
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 но думал уже пофиксили, т.к. давно про это не слышал ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2018, 06:11 |
|
||
|
dynamic_sampling
|
|||
|---|---|---|---|
|
#18+
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. И анализировать, как это работает конкретно в вашем энвайроменте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2018, 08:02 |
|
||
|
dynamic_sampling
|
|||
|---|---|---|---|
|
#18+
По вашему совету снял трассу 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"; Это что? Баг, резалт-кэш или еще какая-то гадость? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2018, 13:46 |
|
||
|
dynamic_sampling
|
|||
|---|---|---|---|
|
#18+
Valergrad, ALTER SYSTEM SET "_fix_control"='7452863:0'; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2018, 14:13 |
|
||
|
dynamic_sampling
|
|||
|---|---|---|---|
|
#18+
Ага, стало понятней. Для этого запроса используется индекс по RXM, а он в силу своего малого размера - получается с процентом sample block ( 0.005477 ) меньше одного бока ( 0,54 блока ), что и дает результат 0 строк. Таким образом осталось разобраться буквально в одной вещи - отчего процент у динамик сэмплинга такой маленький? Я предположил что процент должен рассчитываться по такой схеме. В таблице по dba_tab_statistics 91294 блока, это 100%. Должны мы взять 128 блоков, это X%. Следовательно X = 128*100/91294 = 0.14020 В то время как наша цифра ( 0.005477 ) в 25 с лишний раз меньше. Это как-то связано с мультиблочными чтением? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2018, 14:19 |
|
||
|
dynamic_sampling
|
|||
|---|---|---|---|
|
#18+
ValergradВ таблице по dba_tab_statistics 91294 блокаa сумма в dba_segments? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2018, 15:38 |
|
||
|
dynamic_sampling
|
|||
|---|---|---|---|
|
#18+
xtender, 92800 - почти то же самое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2018, 16:20 |
|
||
|
dynamic_sampling
|
|||
|---|---|---|---|
|
#18+
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' ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2018, 16:58 |
|
||
|
dynamic_sampling
|
|||
|---|---|---|---|
|
#18+
[quot orac_list]ValergradЭто можно отключить через "_fix_control"='7452863:OFF' На уровне сессии? Некрасиво как-то...На уровне базы? Опасно. Пока что я убрал параллельность у запроса - на производительность не влияет, а стабильность за счет отсутсвия всяких сэмплингов возрастает. Но это выглядит как явная недоработка оракла - ставить такой низкий процент sample block для такого маленького индекса. Как это дело рассчитывается - так и не нашел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2018, 01:19 |
|
||
|
dynamic_sampling
|
|||
|---|---|---|---|
|
#18+
xtenderValergrad, а ты попробовал 21239293 ? т.е. alter system set optimizer_dynamic_sampling=2? Так у нас уже 2 :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2018, 02:31 |
|
||
|
dynamic_sampling
|
|||
|---|---|---|---|
|
#18+
я про это:xtenderзы. если память мне не изменяет, то есть разница между дефолтным 2 или установленным 2 (т.е. установлен через alter system или файл параметров): при установленных вручную 2 optimizer_dynamic_sampling при параллели не рассчитывается автоматически, а берет установленные 2 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2018, 02:34 |
|
||
|
dynamic_sampling
|
|||
|---|---|---|---|
|
#18+
ValergradТак у нас уже 2 :)прямо установлено в спфайле? видно в show spparameter optimizer_dynamic_sampling? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2018, 02:35 |
|
||
|
dynamic_sampling
|
|||
|---|---|---|---|
|
#18+
_optimizer_dyn_smp_blks чему равен? 32? зы. вообще прислал бы трейсы... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2018, 02:44 |
|
||
|
dynamic_sampling
|
|||
|---|---|---|---|
|
#18+
https://www.red-gate.com/simple-talk/sql/oracle/dynamic-sampling-ii-controlling-the-activity-part-2/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2018, 02:52 |
|
||
|
dynamic_sampling
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2018, 03:21 |
|
||
|
dynamic_sampling
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2018, 03:33 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=39611586&tid=1884327]: |
0ms |
get settings: |
8ms |
get forum list: |
22ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
55ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
72ms |
get tp. blocked users: |
2ms |
| others: | 215ms |
| total: | 396ms |

| 0 / 0 |
