середа, 30 березня 2016 р.

Определяем блокирующие сессии

Запрос не мой. Помогает, если не могу скомпилировать пакет - находим блокирующую сессию и киляем ее. Вылаживаю, что бы был под рукой.

select distinct orakill from (
 select
        /*+ ordered */
        w1.sid waiting_session,
        h1.sid holding_session,
        w.kgllktype lock_or_pin,
        w.kgllkhdl address,
       (
         select 'ALTER SYSTEM DISCONNECT SESSION ''' || s.SID || ',' || s.SERIAL# || ''' IMMEDIATE;' sqll1
           from v$session s , v$process p
          where s.PADDR=p.ADDR and s.sid = h1.sid
       ) orakill,
        decode (h.kgllkmod, 0, 'None', 1, 'Null', 2, 'Share', 3, 'Exclusive', 'Unknown' ) mode_held,
        decode (w.kgllkreq, 0, 'None', 1, 'Null', 2, 'Share', 3, 'Exclusive', 'Unknown' ) mode_requested
   from dba_kgllock w,
        dba_kgllock h,
        v$session w1,
        v$session h1
  where ( ( (h.kgllkmod != 0)
    and (h.kgllkmod     != 1)
    and ((h.kgllkreq     = 0)
     or (h.kgllkreq      = 1)) )
    and ( ((w.kgllkmod   = 0)
     or (w.kgllkmod      = 1))
    and ((w.kgllkreq    != 0)
    and (w.kgllkreq     != 1)) ) )
    and w.kgllktype      = h.kgllktype
    and w.kgllkhdl       = h.kgllkhdl
    and w.kgllkuse       = w1.saddr
    and h.kgllkuse       = h1.saddr
)

Пересоздание отключенного триггера включает его

Сегодня столкнулись с проблемой - начала выполняться лишняя проверка. Оказалось, что проверка выполнялась в триггере, который уже очень давно был disable, а сейчас он enable. Посмотрели по логам: один из наших программистов внес изменения в функцию и решил везде, где вызывается эта функция внести те же изменения. Поиск всех мест вызовов он проводил через поиск в PL/SQL Developer. Наш триггер тоже попал в результаты поиска. Проблема только в том, что в окне поиска PL/SQL Developer не пишется, что триггер отключен. И вот, он открыл на редактирование триггер с формы поиска, внес корректировки и нажал F8 (компил). После этого триггер стал enable.
По-умолчанию триггеры создаются сразу включенными. Только после создания их статус можно поменять через ALTER TRIGGER. Начиная с 11 версии Оракла можно явно, при создании, задавать в каком статусе будет создан этот триггер.
Наш триггер начинался с текста:
CREATE OR REPLACE TRIGGER ...
И оказывается, что при REPLACE также происходит включение триггера.

вівторок, 22 березня 2016 р.

Второй раз запрос выполняется намного дольше первого или Cardinality feedback

Недавно столкнулся с проблемой, когда запрос первый раз выполняется за 1 секунду, а второй и последующие разы за 30 секунд. Если добавить пробел или поменять регистр любой буквы в запросе, что бы oracle вновь сделал парсинг - то запрос снова выполняется за 1 секунду. Поиски привели меня к Cardinality feedback. В двух словах, это фича, которая позволяет оптимизатору учится на своих ошибках. То есть при первом выполнении делается предполагаемая оценка, а в процессе выполнения собирается реальная оценка и если они отличаются - правильная оценка сохраняется для последующего использования. В следующий раз, когда запрос выполняется, то он будет оптимизирован снова и на этот раз оптимизатор будет использовать скорректированные оценки вместо своих обычных оценок.
В моем случае это приводило к зависаниям при последующих вызовах запроса. И что бы отключить фичу можно использовать либо параметр сессии:
alter session set "_OPTIMIZER_USE_FEEDBACK"=FALSE;
либо хинт:
/*+ opt_param('_OPTIMIZER_USE_FEEDBACK','FALSE') */

 

понеділок, 14 березня 2016 р.

Raspberry Pi & PIR-датчик & перемычка

Купил себе на новый год "малинку" и сразу решил, что соединю ее с датчиком движения, прикручу ее где-то в коридоре и, в случае, когда кто-то посторонний будет шастать - буду отправлять себе смс, что в квартире есть движение.
Вот такая модель пришла: https://www.raspberrypi.org/products/raspberry-pi-2-model-b/
Датчик движения hc-sr501 и пару проводков мама-мама купил в местном интернет-магазине.
Когда все детальки были собраны, свободное время выделено, я нашел две статьи, по которым планировал научиться только детектить движение:
https://www.raspberrypi.org/learning/parent-detector/worksheet/

http://diyhacking.com/raspberry-pi-gpio-control/
О том, как установить операционку писать не буду, в интернете есть много статей.
Подключил датчик к Raspberry, как описано в первой статье, оттуда же скопировал скрипт. Запускаю... На мониторе пишет, что движение есть, хотя я до запуска, специально, развернул датчик в стену. Ну, думаю, стена мешает - повернул в пустой коридор. Все равно пишет, что есть движение. Подумал, что допустил ошибку в скрипте - проверил, все правильно. В общем пробовал, я и так и сяк - датчик выдает, что движение есть и хоть ты тресни. На самом датчике есть два винтика, которые регулируют чувствительность и время реагирование на движение. Покрутил и один и второй - то же самое "Есть движение". Подумал, что датчик поломанный.
Попробовал во время выполнения скрипта отсоединить провод от GP4 - появилась надпись "Движения нет". Ага, значит датчик исправен. Решил покопаться в интернете: перепробовал и дополнительные параметры в процедурах библиотеки GPIO, и подключение к другим пинам, и другие скрипты - результат тот же.
В итоге на поиски в интернете потратил около 3 часов, а результата нет.
Захожу еще на один форум, где люди кидали ссылки с алиэкспресса/ибея на датчики движения, которые они используют. В основном это были hc-sr501, точно такие как и у меня. Решил узнать сколько стоят датчики в Китае (свой брал в Киеве) - открываю ссылку, смотрю цену, смотрю фотки датчика и вижу, что у моего датчика расположение конденсаторов другое. У меня по одному конденсатору с каждого угла, а на фотке тоже 4 конденсатора, только 2 из них находятся рядом. Решил найти такую же модель, как и у меня. По одной из ссылок на ибей нашел "мой" датчик, но самое главное на картинке было описание некоторых элементов датчика:
  
Видите слева перемычку и 3 пина, и подпись repeatable trigger - как вы уже наверное догадались, у меня перемычка стояла в положении non-repeatable trigger. Поменял и ВСЕ ЗАРАБОТАЛО. Я был счастлив =)
Позже я нашел еще несколько картинок, где положения перемычки значились как "L"(Low) и "H"(High)-position.