Kamil Stawiarski

Kamil Stawiarski Oracle Certified
Master | Oracle ACE

Temat: library cache: mutex X i CURSOR_SHARING=FORCE

Witam,
Chciałem się podzielić ciekawym przypadkiem, na który się natknąłem przy ostatniej optymalizacji.

Przełączyliśmy na 11.1.0.7 (testy wykonywane też na 11.2.0.2) CURSOR_SHARING=FORCE z myślą o testach Adaptive Cursor Sharing i ograniczeniu ilości twardych parsowań. Po kilku dniach instancja zaczęła wykazywać wysoką aktywność w klasie 'Concurrency' - po sprawdzeniu okazało się, że winowajcą jest wait event "library cache: mutex X". Po głębszym dochodzeniu znalazłem zapytanie, które powodowało nadmierne występowanie tego eventu a wyglądało ono mniej więcej tak:


SELECT *
FROM TABELA TR
WHERE TR.UPDATETIMESTAMP>=TIMESTAMP :"SYS_B_0"


Powyższe zapytanie miało około dwóch tysięcy potomnych kursorów a kolejne wykonywanie tego zapytania za każdym razem powoływało kolejny child-cursor. Wykluczyłem działanie Adaptive Cursor Sharing w tym przypadku, bo bind_sensitive i bind_aware były ustawione na 'N' a zresztą na przeszukiwanej kolumnie (typu TIMESTAMP) nie było histogramów.

Po przeszukaniu perspektywy v$sql_shared_cursor okazało się, że kursor nie jest współdzielony ze względu na HASH_MATCH_FAILED, co nie powinno się zdarzyć przy ustawieniu CURSOR_SHARING na FORCE i nie użyciu mechanizmu ACS.

Wykonałem to zapytanie przy ustawionym eventcie 10053 na levelu 1, żeby zobaczyć co tam optymalizator kombinuje pod spodem i zobaczyłem co następuje w fazie transformacji SQL:


WHERE SYS_EXTRACT_UTC("TR"."UPDATETIMESTAMP")>=SYS_EXTRACT_UTC(TIMESTAMP' 2012-02-15 16:08:00.679000000')


Okazało się, że transformator SQL olewał używanie zmiennych wiązanych i liczył plan zawsze z użyciem literału!!!

Kiedy zmieniłem predykat zapytania na:


WHERE TR.UPDATETIMESTAMP >= to_timestamp('2012-02-15 14:08:00.679','YYYY-MM-DD HH24:MI:SS.FF');


co daje takie samo znaczenie oraz wyniki jak poprzednia forma, można zobaczyć w trakcie transformacji co następuje:


WHERE SYS_EXTRACT_UTC("TR"."UPDATETIMESTAMP")>SYS_EXTRACT_UTC(TO_TIMESTAMP(:B1,:B2));


Widać tutaj ewidentnie, że tym razem transformator SQL użył zmiennej wiązanej. Przy takim zapisie nie pojawia się również nadmierna ilość kursorów potomnych - ergo wszystko działa jak powinno.

Konkluzja:
Nie znalazłem na Metalinku żadnego zarejestrowanego bug'a ale może to jest feature a nie bug ;P

Tak czy inaczej mechanizm, który miał w założeniu zmniejszyć ilość twardych parsowań, powoduje ustawiczne twarde parsowania przy użyciu jednej z dwóch, teoretycznie tożsamych klauzul WHERE dla typu danych timestamp :)

Pozdrawiam,
Kamil.Kamil Stawiarski edytował(a) ten post dnia 17.02.12 o godzinie 10:03
Kamil Stawiarski

Kamil Stawiarski Oracle Certified
Master | Oracle ACE

Temat: library cache: mutex X i CURSOR_SHARING=FORCE

.Kamil Stawiarski edytował(a) ten post dnia 17.02.12 o godzinie 09:53

Temat: library cache: mutex X i CURSOR_SHARING=FORCE

Może faktycznie jest to tylko problem timestamp'u, kiedyś jak miałem podobne problemy to zapisałem sobie numery notek

[ID 1169017.1] Deprecating the cursor_sharing = ‘SIMILAR’ setting
[ID 261020.1] High Version Count with CURSOR_SHARING = SIMILAR or FORCE
[ID 377847.1] Unsafe Literals or Peeked Bind Variables

Teraz sprawdzam i drugiej noty już nie widzę ale pierwszy link z google daje http://olegon.ru/archive/index.php/t-8820.html ;p

Może co pomoże :)

Pozdrawiam
Oskar

[edit1]
Note id=12862170.8
"Workaround
Disable literal replacement, for example, set:
cursor_sharing=exact"

Piękny sposób obejścia problemu ehehhe :D

Bug 12649442 - ORA-7445 [kxscod] with CURSOR_SHARING=FORCE or SIMILAR [ID 12649442.8]

A może to któryś z tych bagów, przestudiuj może jeszcze notkę ID 1356828.1 i powiedz co wyszło :)Oskar Graliński edytował(a) ten post dnia 17.02.12 o godzinie 13:11
Paweł S.

Paweł S. DBA,OCP 11g, OCE
11g, Nordea AB

Temat: library cache: mutex X i CURSOR_SHARING=FORCE

Witam,

Po migracji do 11.2.0.2 zauważyłem ten sam problem. Niestety w moim przypadku nie ma możliwości zmiany treści zapytania i jedynym rozwiązaniem jest użycie funkcji sys.dbms_shared_pool.purge co 5 minut :/

W moim przypadku w zapytaniu zostaje użyte ~ 280 zmiennych i bardzo łatwo o wystąpienie HASH_MATCH_FAILED.

Pozdrawiam,
Paweł
Kamil Stawiarski

Kamil Stawiarski Oracle Certified
Master | Oracle ACE

Temat: library cache: mutex X i CURSOR_SHARING=FORCE

Oskar Graliński:
Może faktycznie jest to tylko problem timestamp'u, kiedyś jak miałem podobne problemy to zapisałem sobie numery notek

[ID 1169017.1] Deprecating the cursor_sharing = ‘SIMILAR’ setting
[ID 261020.1] High Version Count with CURSOR_SHARING = SIMILAR or FORCE
[ID 377847.1] Unsafe Literals or Peeked Bind Variables

Teraz sprawdzam i drugiej noty już nie widzę ale pierwszy link z google daje http://olegon.ru/archive/index.php/t-8820.html ;p

Może co pomoże :)

Pozdrawiam
Oskar

Dzięki za notki - też je znalazłem ale w większości odwołują się albo do ACS albo do CURSOR_SHARING=SIMILAR... Albo do wersji 9.x.x.x ... A tutaj problem występuje tylko i wyłącznie przy TIMESTAMP i tylko przy użyciu zapytania z predykatem:


WHERE TR.UPDATETIMESTAMP>=TIMESTAMP '2012-02-15 14:08:00.679'


A jak się użyje alternatywnej notacji:


WHERE TR.UPDATETIMESTAMP >= to_timestamp('2012-02-15 14:08:00.679','YYYY-MM-DD HH24:MI:SS.FF');


To już jest ok :P

Wychodzi na to, że pierwsza notacja jest dla Oracle'a "unsafe" i transformator SQL używa sobie literału zamiast zmiennej... Może tak ma być... Może to feature... ;P

Temat: library cache: mutex X i CURSOR_SHARING=FORCE

Spodziewam się, że to bug i proponowałbym to sprawdzić na 11.2.0.3 tu usunęli np Bug 9680430 - High version count with CURSOR_SHARING = FORCE due to CBO transformation [ID 9680430.8] (where z sysdate)

Nie ma mnie teraz w pracy i nie mam jak tego sprawdzić :)Oskar Graliński edytował(a) ten post dnia 17.02.12 o godzinie 13:40
Paweł S.

Paweł S. DBA,OCP 11g, OCE
11g, Nordea AB

Temat: library cache: mutex X i CURSOR_SHARING=FORCE

Niestety w mojej sytuacji upgrade do 11.2.0.3 nie pomógł :/

Pozdrawiam

konto usunięte

Temat: library cache: mutex X i CURSOR_SHARING=FORCE

Kamil Stawiarski:
Konkluzja:
Nie znalazłem na Metalinku żadnego zarejestrowanego bug'a ale może to jest feature a nie bug ;P

Polecam też temat parametru deffered_segment_creation w kontekście polecanego przez Oracle sposobu przejścia z wersji Enteprise na Standard :)
Kamil Stawiarski

Kamil Stawiarski Oracle Certified
Master | Oracle ACE

Temat: library cache: mutex X i CURSOR_SHARING=FORCE

Krzysztof P.:
Kamil Stawiarski:
Konkluzja:
Nie znalazłem na Metalinku żadnego zarejestrowanego bug'a ale może to jest feature a nie bug ;P

Polecam też temat parametru deffered_segment_creation w kontekście polecanego przez Oracle sposobu przejścia z wersji Enteprise na Standard :)

No cóż... chłopaki robią tak dużo feature'ów, że chyba sami już nie ogarniają i doprowadzają do wzajemnego wykluczania się funkcjonalności... :)
Oskar Graliński:
Spodziewam się, że to bug i proponowałbym to sprawdzić na 11.2.0.3 tu usunęli np Bug 9680430 - High version count with CURSOR_SHARING = FORCE due to CBO transformation [ID 9680430.8] (where z sysdate)

Nie ma mnie teraz w pracy i nie mam jak tego sprawdzić :)

Jak będę miał chwilę to zrobię teścik na 11.2.0.3 ale nie wiem czy w tym tygodniu dam radę... Jakbyś mnie uprzedził w tym, to podziel się, proszę, obserwacjami ... Chociaż nie żywię jakichś przesadnych nadziei na rozwiązanie przed 12 :)Kamil Stawiarski edytował(a) ten post dnia 20.02.12 o godzinie 21:35

konto usunięte

Temat: library cache: mutex X i CURSOR_SHARING=FORCE

Kamil Stawiarski:
No cóż... chłopaki robią tak dużo feature'ów, że chyba sami już nie ogarniają i doprowadzają do wzajemnego wykluczania się funkcjonalności... :)

It is not a bug ! It's an expected behaviour :)))))))))) [Uwaga: czytać "unexpected"]
Kamil Stawiarski

Kamil Stawiarski Oracle Certified
Master | Oracle ACE

Temat: library cache: mutex X i CURSOR_SHARING=FORCE

Paweł S.:
Niestety w mojej sytuacji upgrade do 11.2.0.3 nie pomógł :/

Pozdrawiam

Czyli pozostaje nam czekać na 12... A póki co zadowolić się słowami Krzyśka:
It is not a bug ! It's an expected behaviour :)))))))))) [Uwaga: czytać "unexpected"]

I szukać obejść na własną rękę ... Zresztą jak zwykle :PKamil Stawiarski edytował(a) ten post dnia 21.02.12 o godzinie 09:25

Temat: library cache: mutex X i CURSOR_SHARING=FORCE

po ostatnim PSU dla 11.2.0.2 wpadlem na mutex S i high cpu utilization ;)

myslisz ze 12 cos zmieni ? nie sadze to juz powoli kod zyjacy wlasnym zyciem :-P

Następna dyskusja:

Result Cache 11gR2




Wyślij zaproszenie do