Как запустить крутой сэм второе пришествие на windows 10

Программист PL/SQL больше НЕ ведет блоги — разработка приложений для базы данных Oracle

Подсказки из версии 11.2g (2/3) – IGNORE_ROW_ON_DUPKEY_INDEX

Godiva, через год после выпуска 12.1c может показаться бессмысленным писать о подсказках из 11.2g. Однако я набросал эту статью более полутора лет назад, оставил ее в папке «черновики» и забыл о ней. Кроме того, это своего рода продолжение, так что было бы неплохо его закончить, тем более, что я нашел его де-факто законченным в черновиках. Так что просто небольшое обновление и публикация.

Про подсказку IGNORE_ROW_ON_DUPKEY_INDEX , наверное, писать особо нечего — ее можно использовать только в INSERT, она новая с 11.2g (ранее в 10.2g можно было подавить ошибку с помощью DBMS_ERRLOG) . И что интересно — Oracle прямо упоминает, что если найдена неуникальная запись, то она продолжается и блокировка на уровне строки снимается — т.е. те строки, которые вставлены и уже существуют в таблице, не блокируются.

Синтаксис следующий:

Например, те же данные, что и в прошлый раз:

Еще один уникальный индекс:

И попытка вставки с подсказкой IGNORE_ROW_ON_DUPKEY_INDEX:

Даже если бы никто не поверил, я могу снова сыграть :

Когда мне ничего не вставляет, но и не падает на constrain, пока без подсказки:

Или теперь новое для нас, изучающих шведский ORA-00001: brott mot unik begränsning ;). Так много для этого намека, есть еще некоторые предостережения — конечно, его нельзя использовать в сочетании с ударом APPEND (который будет проигнорирован), он относится к конкретному объекту — что в намеке обычно означает, что намек на не -существующий объект не сможет вставить всю вставку, вы не можете использовать его в buks, и это быстрее, чем предложение EXCEPTION.

Совет № 23 – АНАЛИЗ ТАБЛИЦЫ и СОЕДИНЕННЫХ В ЦЕПОЧКИ СТРОЕК

Годива, небольшой совет: недавно мы обнаружили неизвестную часть команды АНАЛИЗ.TABLE , которая позволяет сохранить ROWID связанных строк — LIST CHAINED ROWS INTO . Итак, давайте попробуем.Чтобы запустить эту команду, есть только одно предварительное условие, а именно иметь таблицу, в которой она будет храниться (alá constrain). Таблицу можно получить, запустив скрипты UTLCHAIN.SQL или UTLCHN1.SQL, либо нужно просто создать таблицу с правильной структурой, то есть:

А теперь как это красиво закрепить, чтобы было видно — размер блока 8192 (8 кб), так что давайте сделаем 10 строк по 790 в каждой (оверхед блока должен быть намного меньше, но давайте сохранить буфер):

Хорошо, а теперь обновите какую-нибудь строку, чтобы она не помещалась в блок данных. Давайте, например, умножим на 3000 букву «Х», то есть 9*790+300=10110, и это точно не поместится в блок размером 8 КБ. Сб, случайное обновление строки:

Совершенно ожидаемо рынком, 2 блока данных — один исходный с данными и другой, который был создан путем обновления случайной строки — и одна конкатенированная строка. А теперь, наконец, к тестируемому предложению:

Когда я смотрю на возвращаемый идентификатор строки (AAAHQWAABAAAN6RAAH), LIST CHAINED ROWS INTO говорит мне, что я обновил строку, которая равна 7, по порядку:

Это строка, в которой изначально была буква H, и она прекрасно соответствует последней букве rowid. А теперь последний шаг, просто проверка того, что это действительно была строка с буквой «H»:

Отлично, строка с H отсутствует, а вместо нее последняя строка с Xkama 🙂 Итак, наслаждайтесь LIST CHAINED ROWS INTO . Кстати, в документации написано, что эта команда работает только для любителей метала… но, может быть, я сейчас немного говорю

Oracle Database 12c – новый № 16 – APPROX_COUNT_DISTINCT

Godiva, давайте представим еще одну функцию из пакета функций, нового в версии 12.1c — APPROX_COUNT_DISTINCT . Как следует из названия, функция возвращает количество различных значений и словоПРИБЛИЗИТЕЛЬНО означает, что это «примерно так». В обмен на некоторую неточность мы получаем кратное ускорение. Так что ура для некоторого теста и дополнительной информации ниже:

И его еще нужно заполнить:

Что-то вроде выборки данных, некоторые слегка искажены, некоторые случайны. Рекомендую все-таки считать статистику при CTAS, хотя они и рассчитываются заново, но, к сожалению, в LOOP так не получается. У меня это работает так:

Столбец Описание данных DISTINCT APR CNT DIS APR CNT DIS результат Ошибка
ID Числа от 1 до 3030000 2.8 (идем по индексу) 1s 2975859 1,78%
TEST_RANDOM Случайные числа около 19 с 1 с 2986718 1,42%
TEST_1_100 Числа от 0 до 99, каждое 30300x 2 с менее 1 с 100 0%
TEST_1_2_3 числа 1,2 101x число 3 3029798x менее 1 с до 1 с 3 0%
TEST_1_25000 1x 2524899,101x 25000-30000 1с-2с менее 1с 5018 3,2%
ТЕСТ_10_1 30300x 0,3-9, 606000x 1 1с-2с менее 1с 9 0%

Итак, небольшой вывод: в отличие от DISTINCT, зависимость данных будет проявляться не в медлительности, а в неточности. Что очень приятно, к сожалению я недооценил свой компьютер и ускорение видно де-факто только в двух случаях, но и так видно, что APPROX_COUNT_DISTINCT играет совсем в другой лиге против обычного COUNT, и намного быстрее даже против индекс. В плане выполнения это выглядит примерно так:

Примерный план выполнения

Однако, хотя этоsort показывает, что в этом примере ничего не было отсортировано на самом деле, нам нужно выяснить, работает ли он так. Наслаждайтесь APPROX_COUNT_DISTINCT !

Читайте также:  Как вернуть процесс проводник windows 10

Одна из самых сексуальных вещей. (2/?)’ >ALTER SESSION SET EVENTS ‘10053’ > Одна из самых сексуальных вещей. (2/?)

Спустя долгое время снова Годива, я вернулся.

Хотя я был из варианта Одна из самых сексуальных вещей. (1/?)» href=»http://www.plsql.cz/?p=1939″ target=»_blank»> отслеживание СВО очень понравилось (и до сих пор здесь) и я сразу же написал следующую часть, поэтому я мучился от нехватки времени, в чем в основном виновата моя замечательная учительница шведского.Да, в свои годы я делала и сдавала задания, которые в школе обменяла бы на пятерку или отметку и с пометкой «факультативно» , Но теперь я пытался выполнять задания качества A++ (в смысле да, это должно рассмешить мою учительницу-феминистку/пожалуйста, и нет, это не должно быть грамматически правильным). выходит, что женщина занимается :/. А еще, скажем прямо, после долгого перерыва в блоге можно Serious Sam II и Trine 2.

Но теперь вернемся к отслеживанию CBO. В предыдущем посте я как бы намекнул, насколько круто отслеживать событие 10053 . Однако это было начало, что также показывает, что такая вещь существует. Oracle просто нечего думать об оптимизации select * from dual . Времена, когда последовательность перетаскивалась через select в и подобная таблица создавалась несколько раз, чтобы избежать защелок, тоже прошли, так что в целом даже мы, программисты, ничего не думаем о select * from dual , это нормально — только не используй это как придурок, когда нам это не нужно. Так что давайте попробуем подкинуть следы чего-нибудь посмелее, но опять же, не слишком, мы начинаем — достаточно двух столов.

создать таблицу tbl_1000 как выбрать rownum как id, mod ( rownum ,10) как tbl_1000id из двойного подключения по уровню
создать таблицу tbl_10000 как выбрать rownum как id, mod(rownum ,100) как tbl_10000id от двойного подключения по уровню

Одна таблица tbl_1000 с 1000 строками, а другая tbl_10000 с 10000 строками. И давайте сделаем еще одну вещь:

begin
DBMS_STATS.delete_table_stats(‘AZOR6’, ‘tbl_1000’);
конец;

Почему? Потому что недавно на 12с, который у меня дома, Oracle вычисляет статистику во время CTAS и мне не очень интересна статистика . Что меня интересует, так это то, что он снова показывает мне, как красиво сэмплировать CBO.

ALTER SESSION SET EVENTS ‘10053 контекст имени трассировки навсегда, уровень 1’;

выбрать количество (*) из tbl_1000 присоединиться tbl_10000 на (tbl_1000.tbl_1000id = tbl_10000. tbl_10000id);

И далее до файла: orcl12_ora_6508.trc

O по сравнению с select * from dual более интересны попытки Oracle переписать — в смысле переписать его так, чтобы он был более эффективным. Попробуйте выкинуть ненужный джойн и т.д. И даже сейчас никакой оптимизации не получилось. Единственная переработка заключалась в том, чтобы переместить условие соединения из стандартного SQL (соединение включено) в условие WHERE. Никаких изменений с точки зрения оптимизации. Теперь нужно определиться с подъездными путями:

К сожалению, у него нет другого выбора, кроме как выполнить полное сканирование таблицы со стоимостью 3 и примерно 1000 строк. С другой стороны, вторая таблица намного интереснее:

Я удалил статистику для TBL_1000, поэтому CBO должен выполнить выборку таблицы, что, согласно трассировке, происходит следующим образом:

Откуда он получает следующий вывод:

Количество строк (10000), количество различных значений (100), количество нулей (0) и стоимость 7. А теперь самое интересное и находки – исходная кардинальность 1716. Откуда взялись это откуда? Это вычисление Oracle для таблицы, не имеющей статистики.Они пишут расчет, потому что, когда Oracle перешел с RBO на CBO, у таблиц было бы количество элементов по умолчанию, равное 100. Я понятия не имею, сколько их сейчас, но это определенно расчет (может быть, я когда-нибудь его изучу) — вероятно, исходя из количества сегментов, размера блока и максимальной длины строки — в конце концов, у Oracle есть некоторая информация. Как узнать значение по умолчанию без статистики, можно легко сделать, отключив динамическую выборку без необходимости отслеживания:

выберите /*+ dynamic_sampling(0) */ count(*) from tbl_100 join tbl_1000 on (tbl_100.tbl_100id=tbl_1000.tbl_1000id);

Еще одно интересное предложение — «макс. образец блока коп. : 64″ показывает, что CBO был готов собрать для меня 64 блока, а в таблице только 21. Таким образом, отбор выполнялся против всей таблицы без каких-либо ограничений. И еще одна интересная строчка — отфильтрованная пробная карта. – что будет связано с уровнем динамической выборки и, возможно, условием where. Низкий уровень и не где, так что решать было нечего — количество строк такое же, как и в таблице.

И теперь происходит то, что должно было произойти. Перестановка, перестановка и перестановка К счастью, я не облажался, я соединил только две таблицы друг над другом, что в конце концов дает ему довольно ограниченное количество перестановок.

У Oracle есть только две таблицы, доступные для оптимизации, поэтому для перестановок у него есть только две опции A-B и B-A, соответственно tbl_1000-tbl_10000 и tbl_10000_tbl-tbl_1000. Сначала попробовал порядок tbl_1000-tbl_10000. При том, что пробовал три комбинации (что может быть не всегда, но очень часто будет) — NL — вложенный цикл, SM — sort merge join и HA — hash join. Для НЛ стоимость была 5751, для СМ 42 и он выиграл ХА с красивой стоимостью всего 10 ;). Я убедился, что Oracle не разговаривает, и попытался намекнуть:

выбрать /*+ use_nl(tbl_10000 tbl_1000) leading(tbl_1000) */ count (*) from tbl_1000 join tbl_10000 на (tbl_1000.tbl_1000id =tbl_10000.tbl_10000id);

И это работает, было еще хуже, когда я попытался намекнуть на соединение слиянием, и в итоге я получил двойную стоимость, что не очень приятно, а. В итоге, после долгих поисков, я понял, что изначально пытался пересчитать ее СТОИМОСТЬ за НЛ, чего мне не удалось сделать, и из-за этого мы проиграли:

begin
dbms_stats.gather_system_stats() ;
end;

Для меня знать sreadtim/mreadtim, что было глупо, тьфу — с одной стороны, у него не было шансов на успех, потому что как я должен что-то исследовать если я сам поменяю? А во-вторых, естественно у меня разные затраты, везде.. После того, как СВО пересчитала эти три соединения для первого заказа, нужно двигаться дальше:

Читайте также:  Как перенаправить весь трафик через tor windows

Он по-прежнему прекрасно печатает, что такое вывод, и я надеюсь, что когда-нибудь здесь, в блоге (я уже сам это видел), я соберусь показать, как отсекается статусное пространство, когда цена поднимается выше цена лучшего плана при перестановке. К сожалению, это нельзя показать на двух таблицах. Далее идет вторая и последняя перестановка:

У нас уже есть лучший план и, казалось бы, он должен быть концом, однако еще более интересна та часть, где сейчас в Oracle 12.1c рассчитывается точка перегиба для адаптивного плана. довольно четкий вывод:

И все.Есть еще рассмотрение, будет ли оно закэшировано, а затем просто печать всех параметров, включая патчи и утверждение плана выполнения. Если кому-то, возможно, было лень и интересно просто посмотреть на trc, скачайте его здесь — есть еще один или два sql, которые я запускал в этом сеансе.

Немного чтения перед ужином с беконом и миндальным маслом

Привет, сегодня очень короткий пост о нескольких PDF-файлах и лекциях, которые привлекли мое внимание за последний месяц, и я думаю, что их стоит прочитать. В противном случае я обязательно продолжу начатое отслеживание СВО и его событий 10053,возможно 10054. И я точно не собираюсь прекращать это сразу — в рамках ограниченного имеющегося времени — на следующих выходных я еду на концерт Wintersun в Вене (ой). Кроме того, из-за красоты шведского языка нашей учительницы в понедельник мне приходится тщательно готовить и писать домашнее задание и в течение семестра корректировать технологию, как пригласить ее на ужин по-шведски..

Слайды об отслеживании событий. Я проверил, что указанный человек также получил доступ ко всем вещам, которые можно отследить (от ora-10000 до ora-10999 + некоторые другие) с помощью перебора на SQLERRM. В отличие от моей собаки — но не случайно. С тем, что ему понравились следующие события:

• 10046 (Millsap) Включить синхронизацию операторов SQL
• 10053 CBO Включить трассировку оптимизатора
• 10079 Данные трассировки, отправленные/полученные через SQL*Net
• 10235 Проверить внутренние структуры диспетчера памяти
• 10032 Статистика сортировки дампа
• 10231 Пропускать поврежденные блоки при полном сканировании таблицы
• 10015 Выгружать заголовки сегментов отмены
• 10013 Отслеживать восстановление транзакций

Так они мне больше нравятся, например их два для СВО — с одним для параллельного — 100054. И мне там не хватает отслеживания дедлоков, что полезно (хотя в случае с оракулом ora-0060 файл .trc затухает так или иначе). И хеш-соединение, которое также является прекрасным отчетом о трассировке.

Документ, в котором объясняется, как обстоят дела с Oracle и гистограммами при присоединении. То есть как там с оценкой селективности джоинов. Следует отметить, что рассматриваемый документ довольно старый и, вероятно, в более новых версиях Oracle он будет выглядеть совершенно иначе. Но что здорово, так это то, что он работает с искаженными данными. И в начале есть очень интересная формула оценки кардинальности, если гистограмм нет и множества совпадают на границах — «принцип включения»:

объединить кардинальность:=мощность(A) * мощность(B) * (1/max(ndv(a),ndv(b)))

И пока мы этим занимаемсязащелки/мьютексы, так что этот документ немного более конкретен — тоже мьютексы, но на этот раз их поведение на дочерних/родительских курсорах. Большое внимание уделяется блокировкам родительского курсора, если необходимо подкинуть дочерний курсор под родительский. Очень мило.

И если вам надоели все эти формулы, опции, представления, мьютексы и KGX, оценки количества элементов в HbH для eq-join, тогда что-нибудь очень болтливое для беззаботного издания.

Это все, а в остальном для моего коллеги эмпирическое правило: AUTO_SAMPLE_SIZE примерно на 2% менее точен, чем оценка_percent = 100, но в 10 раз быстрее. Примечание: не относится к сильно искаженным данным и относится к 11g+.

Удачи Hébičká и Winterusun!

Одна из самых сексуальных вещей. (1/?)’ >ALTER SESSION SET EVENTS ‘10053’ > Одна из самых сексуальных вещей. (1/?)

Возможно, после долгой паузы мне кажется, что меня сбила машина или, может быть, я даже потерял любовь к Oracle Нет, ничего подобного не происходит. Как только отношения между мной и Оракулом стали шведскими. А мы все знаем, что для того, чтобы день был идеальным, ему нужно добрых 5-6 часов..

У меня было множество советов для статей, много вещей, которые можно попробовать — я многое узнал об Oracle, пока не писал, я многое забыл и т. д. И у меня даже есть много незаконченных вещей. в блоге, и я попытаюсь что-нибудь с этим сделать. Однако я наткнулся в Oracle на что-то невероятно СЕКСУАЛЬНОЕ, и мне нужно выкинуть это из головы, и мое сердце бешено колотится Итак, поехали!

Я не знаю, какой процент людей, читающих этот блог, что-нибудь придумает под номером 10046. Если ничего, то в качестве домашнего задания заполните Что они знают, они автоматически запомнят следующее:

ALTER SESSION SET EVENTS ‘10046 контекст имени трассировки навсегда, уровень 12’

Когда программист уже видел это x раз в своей жизни и может получить аналогичный вывод из разных представлений,поэтому он просто использует его и не думает о том, насколько это круто. Однако событие трассировки 10046 — далеко не единственное, что можно отследить и на что можно повлиять. Я долго искал лист и не мог его найти.Парадоксально помог мне в этом шведский язык, когда я выписывал сообщения об ошибках из SQLERRM методом перебора и выписывал шведскую ошибку и английский перевод. Я обнаружил много интересных сообщений об ошибках в зверской силе, которых я никогда не видел и, вероятно, никогда не увижу. Но я также наткнулся на список того, что можно отслеживать, в частности, это значения между 55 и xxx. Из интересного это тупик, хешджойн (это шутка, может когда-нибудь напишу статью) и затем трассировка события 10053 , которое заставило меня сесть на задницу.

Читайте также:  Как выбрать диск для восстановления системы windows

А теперь, что он делает:

Это отслеживается оптимизатором CBO. И до такого уровня, что он записывает все преобразования, которые пытается, все возможные перезаписи, такие вещи, как транзитивные замыкания, расщепление предиката с последующим вычислением стоимости отдельных путей доступа — с тем, что перечисляет оценку строки, память, затраты (и это еще до округления!), все параметры оптимизатора, подсказки, а потом постепенно идет то, что совсем уж круто — перестановки в план оптимизации и списки затрат для отдельных переставленных планов +, возможно, причина отклонения, включая такие вещи, как Oracle убивает его посередине, потому что он уже превысил стоимость лучшего плана, найденного на данный момент, вы можете увидеть, как он запускает sql на динамической выборке во время оптимизации CBO. Просто гребаный отморозок!

Думаю, вы можете себе представить, как я себя чувствовал — даже лучше, чем когда в понедельник мне удалось заикаясь сделать комплимент на шведском учителю, что у нее красивые голубые глаза и милая улыбка на третьем уроке шведского языка в понедельник 😉 Это вероятно, будет немного обширным, потому что журналы и выходы они из трекабольшая, поэтому эта статья является первым и очень высоким уровнем того, чем она является на самом деле :

Сначала выясните, где находятся журналы трассировки:

выбрать значение, имя из v$parameter2, где имя типа ‘user%dump%des%’;

Для меня это C:\app4\AZOR\diag\rdbms\orcl12\orcl12\trace. Хорошо, а теперь

ALTER SESSION SET EVENTS ‘ 10053 контекст имени трассировки навсегда, уровень 1’;

А теперь немного SQL и начнем с самого простого:

выбрать * из двойного ;

А потом, в идеале, ничего не делать, выйти из сеанса или выключить его. А теперь, что содержит этот файл :

  • Заголовок (версия Oracle, ОС, расположение, количество процессоров, объем памяти…)
  • Информация о СЕССИИ – идентификатор, модуль, действие..
  • Блоки запросов и их названия

В этом случае имеется один блок запроса (SEL$1). А под сообщением SPM Аббревиатура далее не поясняется, но по контексту это будет SQL Plan Management (dbm_spm).

  • Проверка ADOP (автоматическая степень параллелизма)

Обратите внимание, что это не так.

  • Список и объяснение используемых сокращений (к сожалению, не всех)
  • Параметры оптимизатора — все, включая настройки + исправления и их статус

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

  • Затем предпринимаются попытки преобразовать блоки запроса

Честно говоря, я не знаю, что он здесь делает. Я уже где-то заметил, что с 10g Oracle переставляет блоки, а не весь sql. Oracle отказался от перестановок на всей sql, потому что для таких SQL, как генерит, например, Siebel (150+ таблиц и джойнов) перестановки часто невозможны (ведь даже факториал 10 не малномер — 362880, насколько я помню, до этого подхода максимум был 60000 и здравствуй базар). Так что лучше разрезать его на части, переставить их, а затем, возможно, переставить друг против друга. Я понятия не имею, почему он не переписывает на уровне всего sql :(, хотя я могу представить, что большинство из них нельзя сделать за пределами блока запроса, что-то обязательно сработает. Тут не о чем думать с моим выбором из двойного — он попытался и не смог.

  • Проверить переменные просмотра на курсоре

Просто сообщение ни о чем не говорит. Этого не может быть, у меня нет переменной ставки

  • оператор SQL после преобразования, т.е. тот, который будет переставлен

Ни одно преобразование не завершилось неудачно, поэтому тот же sql, что и исходный.

  • Список системной статистики
  • Статистика таблицы

В двойной таблице нет ничего интересного. Одна строка, длина 2, без цепочек.

  • Анализ доступа к таблицам

В двойном столе нет ничего интересного. В любом случае, у Oracle есть только опция полного сканирования таблицы, индекса нет.

Oracle даже не пытался переставлять, ему нечего делать, у нас всего одна таблица, так что ничего.

Тьфу, тогда напечатайте other_xml и, следовательно, распечатайте схему подсказки, и все. Так что это было скорее краткое описание того, как выглядит этот файл трассировки. У Oracle не было возможности оптимизации, преобразования, перестановки на таком простом sql и было предопределено идти с полным сканированием таблицы. Тем не менее, я надеюсь, что я показал некоторые интересные вещи об этом, хотя более интересные вещи еще впереди, я хотел бы всегда проверять некоторые интересные части в одном из следующих постов.

А теперь нет в наличии, что бросилось в глаза:

С этим номером 10053 Я надеюсь, что мы по-прежнему будем весело проводить время в блоге, это действительно приятная мелочь. Шучуудачи!

Совет №22. Разработчик PL/SQL. Именование вкладок

Один очень короткий совет сегодня, но в нем есть своя прелесть. Работает с PL/SQL Developer версии 9. Иногда в PL/SQL Developer просто удобно запускать несколько select/commands подряд, примерно так:

выбрать * из двойной;
выбрать * из двойной;
выбрать * из двойной;

Отлично работает, PL/SQL Developer добавляет результаты в закладки. Что меня иногда смущает, так это концепция этих закладок, в случае множественных селектов/команд закладки называются одинаково или даже одинаково, чтобы хрюшка об этом знала 😉

Ну и что? Комментарий над командой, которая может использовать TAB с именем результата:

—TAB=Выбрать из двойного номера 1 и zblunk
выбрать * из двойного;
—TAB=Выбрать из двойного числа 2 и hafik
выбрать * из двойного;
—TAB=Выбрать из двойного числа 3 и будильника
выбрать * из двойного;

Поделиться с друзьями
ОС советы