Czy /*+parallel(10) enable_parallel_dml*/ może powodować blokowanie sesji?

Czy /*+parallel(10) enable_parallel_dml*/ może powodować blokowanie sesji?
woolfik
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1611
0

Hejka mam pytanko. Co jakiś czas pojawia mi się raport z poniższego zapytania:

Kopiuj
SELECT *
  FROM gv$session a
 WHERE FINAL_BLOCKING_SESSION_STATUS = 'VALID';
       AND  a.last_call_et > 100 

Dzisiaj postanowiłem sobie zalogować dodatkowo listę z V$SQL aby dowiedzieć się które zapytania to blokują i zdarza się to w wielu miejscach systemu natomiast elementem wspólnym jest to:

Kopiuj
/*+parallel(10) enable_parallel_dml*/

Czy ten hint może być przyczyną blokad na chainach?

YA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2384
2

Co masz na myśli pisząc "blokady na chainach"?

enable_parallel_dml sugeruje, że robisz nie tyle zapytania, co aktualizacje danych (DELETE/INSERT/UPDATE). Oracle dzieli robotę na równoległe sesje w oparciu o granule danych (nie wiersze, a bloki albo partycje), więc może się zdarzyć tak, że dwie sesje operujące na różnych blokach, trafią w ten sam logiczny obiekt (np. id klienta) i spróbują coś tam zaktualizować równolegle. W efekcie jedna przyblokuje drugą. W skrajnych przypadkach dostaniesz deadlocka. Wszystko zależy od organizacji fizycznej i samego zapytania. Przy insertach do indeksowanej tabeli możesz mieć podobny problem, wiele sesji wali w ten sam indeks i są waity na aktualizacji indeksu.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.