Kurs SQL i optymalizacji Oracle

1

Cześć
Jakiś czas temu nosiłem się z zamiarem napisania czegoś w rodzaju kursu/blogu o programowaniu w SQL, PL/SQL i bazie Oracle. Bardziej zaawansowanego niż większość kursów gdzie nauka zaczyna się na SELECT i kończy na JOIN.
Do tej pory napisałem dwa wpisy/kursy i pisze kolejne o indexach w Oracle, mam jeszcze kilka pomysłów o czym pisać(dalej indexy, partycjonowanie, uprawnienia role, jak czytać plany zapytan, jakieś dobre praktyki, listenery).

Poniżej dwa pierwsze kursy jakie napisalem:
Jak zbudowany jest Index w Oracle: https://oracledev.pl/kurs-index-w-oracle/
Jak używać Unique Index: https://oracledev.pl/sql-index-unique-scan/

Dajcie proszę znać o czym warto jeszcze napisać oraz co ewentualnie poprawić w już napisanych kursach żeby lepiej się czytało i wynosiło więcej wartości.

1

https://oracledev.pl/kurs-index-w-oracle/

Same bloki liści poza tym, że są powiązane z blokami gałęzi są również powiązane między sobą. I tak np. blok 0-3 jest powiązany z blokiem 0-6 a ten z kolei z blokiem 0-7 itd.

Tu nie ma przypadkiem bloków 0-3, 3-6, 7-10? I ta pogrubiona 3 nie powinna być przypadkiem 4? :P

I tam na zdjęciu w załączniku przy pkt. 2, który zaznaczyłem jest właśnie zakres 0-3, a tam przy pkt. 1 masz 0, 0, 1, 2. Nie brakuje tej 3? I czemu 0 jest zdublowane?
Pytam bo może to jest dobrze, ale ja Oracla aż tak nie ogarniam

0

Tu nie ma przypadkiem bloków 0-3, 3-6, 7-10? I ta pogrubiona 3 nie powinna być przypadkiem 4? :P

Masz w pełni rację, poprawiłem :)

I tam na zdjęciu w załączniku przy pkt. 2, który zaznaczyłem jest właśnie zakres 0-3, a tam przy pkt. 1 masz 0, 0, 1, 2. Nie brakuje tej 3? I czemu 0 jest zdublowane?

0 jest zdublowane bo indeks nie musi (może i akurat taki indeks opisałem w drugim wpisie: https://oracledev.pl/sql-index-unique-scan/) mieć tylko wartości unikalne.
Co do braku 3 to wprost nie ma nigdzie w dokumentacji, że blok gałęzi zawiera tylko zakres wartości w bloku liścia. Natomiast patrząc po tabeli zorganizowanej jako index (link) dokumentacja pokazuje, że mogą być "dziury" tzn. możemy mieć wskazanie 0-30 w bloku gałęzi ale w bloku liścia mogą zawierać się kluczę z wartością 20 i 30 a pozostałych jest brak. W związku z tym, przez analogię myślę, że jest to poprawne :)
@pavarotti Dzięki wielkie za info zwrotne i uważność :)

2

Trochę uproszczony jest temat indeksów. O użyciu indeksu bądź nie decyduje optymalizator, od kilku wersji jest tylko optymalizator kosztowy i może się okazać, że mimo utworzenia indeksu i spełnienia innych warunków indeks nie zostanie wykorzystany. Na prostym zapytaniu wszystko jest jasne. na bardziej złożonych można się nieźle przejechać. no i należy pamiętać, że dodanie indeksu wydłuża operacje typy INSERT.

1

Kursów wszelkiej maści n/t Oracle jest dużo, nie wiem czy to dobra nisza ;-) Może na rodzimym podwórku plusem będzie to, że po blog po polsku.

Jeśli chodzi o optymalizację, to przydałoby się wyjaśnienie:

  1. Jak wyglądają fazy przetwarzania zapytania (od wysłania przez klienta, po odebranie wyników). Tu jednak trzeba wyjaśnić architekturę bazy, bo sekwencja kroków będzie niezrozumiała.
  2. wprowadzenie czego dotyczy optymalizacja, bo mogą być różne "funkcje celu" (IO/CPU/RAM) i jak działa optymalizator zapytań.

A do tego potrzebne będzie zrozumienie ścieżek dostępu do danych ("access paths"), typów złączeń ("hash join", "nested loop", "sort-merge", "cluster"), czym są "anti-joins", "semi-joins" i "joins",
czym są statystyki systemowe, czym histogramy, latche, mutexy, etc. Cała masa teorii, która trzeba łyknąć zanim się weźmie za optymalizację.

Kiedyś miałem podobny pomysł na bloga, ale zrezygnowałem ze względu na istnienie takich materiałów jak:

Od jednego z kolegów nauczyłem się bardzo prostej techniki. Zadawać pytanie "Dlaczego sądzisz, że to rozwiąże problem?" do każdego pomysłu na rozwiązanie problemu.
Dzięki temu oduczyłem się wprowadzać losowe zmiany, np. dodawanie indeksów, modyfikacja parametrów bazy i sprawdzenie czy pomogło ;-) Wstyd, ale kiedyś tak "optymalizowałem".

Jak chcesz pisać o optymalizacji, to przede wszystkim opisz systematyczne podejście (metodykę).

0

@yarel: Niestety, od jakiegoś czasu mam wrażenie, że w ogóle znajomość baz danych staje się niszą.
Dzięki za fajne tematy, na pewno napiszę o joinach, architekturze Oracle, jednak wszystko po kolei :)
Co do samej metodyki to trzeba wiedzieć jakie działania co robią i jakie niosą konsekwencje. Też kiedyś waliłem indeksy na oślep, tworzyłem dziwne struktury czy zmieniałem parametry bazy żeby zobaczyć czy zaskoczy, ale zmieniło się to gdy zacząłem rozumieć jak działa baza i to chciałbym pokazać w tym blogu/kursie :)

1

Dla zainteresowanych dodałem nowy wpis o RANGE INDEX SCAN: https://oracledev.pl/sql-index-range-scan/
Kolejny wpis będzie odejściem od indexów ale nadal w temacie optymalizacji :)

1

Czyli hinty.

0

Zanim odejdziesz od indeksów, to może warto jeszcze parę słów o innych zagadnieniach związanych z indeksami ;-)

  • reverse range scan
  • skip scan
  • fast index scan
  • full index scan
  • index join / merge
  • parallel index scan
  • function based indexes
  • domain indexes
  • partitioned indexes
  • compressed indexes
  • reverse key indexes
  • virtual indexes
  • invisible indexes
  • local index vs global index
0

@kate87 @yarel
Nie hinty a znaczenie kolejności w klauzuli WHERE :)
Natomiast temat indeksów będę kontynuował:)

0

Tak jak obiecałem dodałem nowy wpis o kolejności wykonywania predykatów w klauzuli WHERE w SQL Oracle.
Link do kursu: https://oracledev.pl/kolejnosc-warunkow-w-where/
W kolejnych wpisach wrócę do opisywania Indexów :)

0

Tak mi się rzuciło w oczy:
"Konsekwencją zakładania indeksów na kolumny które mogą przechowywać nulle jest nieraz niemożność wykorzystania indeksu w przeszukiwaniu."

Nie zgodzę się z tym. Może być to co najwyżej brak możliwości użycia tego indeksu do wyszukiwania rekordów z NULL w danym polu. Natomiast nie przeszkadza to użyć tego indeksu dla rekordów, które mają to pole niepuste.

A do wyszukania rekordów z NULL w polu (pod warunkiem, że jest ich mniejszość w tabeli) jest taki sprytny trick.
Tworzy się indeks złożony na parze (POLE_Z_NULLAMI, POLE_KLUCZA_GŁÓWNEGO).

Wtedy zapytanie typu
WHERE POLE_Z_NULLAMI is null
działa całkiem sprawnie, no chyba że nulli jest tam większość.

0

Co do NULLi w indexie pokazujesz, że aby go wykorzystać trzeba stosować "tricki" a nie chcę w tym wpisie opisywać tricków. Co do samego przeszukania indexu który założony jest na kolumnie z nullem oczywiście jest możliwe jego wykorzystanie dlatego też dodałem w opisie "nieraz" i w sytuacji kiedy będziesz wyszukiwał wartości z null (po prostu) z indexu baza nie skorzysta. We wpisie celowo nie piszę o takich sytuacjach żeby nie mieszać za bardzo. We wcześniejszym zdaniu piszę skąd to się bierze > Index typu B-tree nigdy nie przechowuje wartości całkowicie nullowych
O nullach w indexen będę dedykował osobny wpis.
@robertos7778 Dzięki wielkie za uwagę :)

0

Napisz coś o zapytaniach czyli select, delete, update, display, where, count itp. itd.

Wielu ludziom by się przydało...

0

Właśnie napisałem kolejny kurs o Full Index Scan: KURS ORACLE SQL FULL INDEX SCAN
Średnio dodaję wpisy raz w tygodniu i myślałem aby raz dodawać kurs "z cyklu" a raz offtop czyli np. jeden tydzień kurs z Indexów a jeden z czegoś innego. Co sądzicie o takiej formule?

Kolejny kurs jaki dodam będzie offtop, o dodawaniu DEFAULT na kolumnach NULL i NOT NULL.

Dajcie mi w ogóle znać, jak się czyta moje kursy i co mogę poprawić.

0

Tak jak wspomniałem ostatnio, dodałem nowy Kurs Oracle SQL: Oracle - Default na kolumnach null i not null
Tym razem opisałem nieco więcej o podstawach ale poruszyłem też kwestie jak default wpływa na wydajność. Dajcie znać, czy taka forma jest lepsza? Czy nie ma za dużo podstaw? A może pisać więcej o podstawach?

0

Napisałem ostatnio dwa kolejne kursy:
Dla bardziej początkujących: Oracle SQL: Granty i Role
W temacie Indexów: Index Fast Full Scan
Oraz stworzyłem listę kursów nad którymi będę pracował w najbliższym czasie: Kurs Oracle SQL
Mam w związku z tym pytania:

  1. Kursu Uprawnień i Ról jest pierwszym kursem który napisałem dla użytkowników "prawie" początkujących. Czy temat nie jest wyczerpany zbyt pobieżnie lub czy nie wchodzę w niego zbyt głęboko jak dla początkujących?
  2. Chcę, zacząć pisać kurs o podstawach baz danych czyli np. postaci normalne, diagramy etc. jest to interesujące?
0

Cześć,
Dzisiaj napisałem kolejny kurs o optymalizacji zapytań z serii o indexach: Index Skip Scan
Zastanawiam się nad rozpoczęciem serii kursów dla początkujących np. o postaciach normalnych, diagramach baz oraz podstawach SQL. Warto pisać o czymś takim?

1
oracledev napisał(a):

nad rozpoczęciem serii kursów dla początkujących np. o postaciach normalnych, diagramach baz oraz podstawach SQL. Warto pisać o czymś takim?

Na pewno warto, zawsze są jacyś rozpoczynający przygody z bazami danych i głodni wiedzy, niemniej obyś nie zapomniał też o dotychczasowej linii ;)

1

Cześć,
Nie było mnie jakiś czas ale wróciłem do pisania kursu. Powinienem znów pisać regularnie czyli średnio jeden kurs na tydzień :)
Dzisiaj przedstawiam kurs: Wstęp do Oracle FLASHBACK
Staram się znaleźć odpowiedni balans między ilością przykładów, dogłębnością opisów a długością kursu. Czy poziom szczegółowości tematu jest OK?
Czy warto by dodawać przykładowe zadania, dla tych co chcą poćwiczyć?

0

Cześć,
Dziś umieściłem nowy kurs Oracle SQL o INDEX JOIN SCAN
Dajcie znać, czy dalej lepiej pisać o utrzymaniu indexów czy o indexach bitmapowych?

1

Myślę, że warto rozprawić się z mitem "indeksy trzeba co jakiś czas przebudowywać". Tylko to wymaga sporo roboty przy przygotowaniu danych testowych, ich modyfikacji i testach pokazujących jak wygląda struktura drzewa indeksu i jak zmiany w danych na nie wpływają.

0

Dziś dodałem nowy kurs teoretyczny i jednocześnie rozpocząłem pisanie serii o JOIN W ORACLE
Tradycyjnie pierwszy kurs jest raczej wstępem, przypomnieniem i nakreśleniem działania mechanizmu w samej bazie. 0 kodu ale w kolejnych kursach serii opiszę metody joinowania. O czym warto pisać przy okazji JOINów poza metodami ich łączenia?
Serii o indexach jeszcze nie skończyłem i będzie kontynuowana :)

0

Cześć,
Właśnie napisałem kurs SQL o TABLE ACCESS BY INDEX ROWID
Kolejny kurs opiszę o tym czym jest ROWID, kolejny o pierwszej motodzie joinowania.
A o czym pisać dalej?

1

W pierwszej kolejności opiszę działania dostępu do tabeli poprzez ROWID oraz czym jest ROWID a następnie pokażę jak mechanizm ten wykorzystuje baza przy **korzsytaniu **z indexu.

Literówka w pierwszym akapicie

0
oracledev napisał(a):

A o czym pisać dalej?

Chętnie poczytałbym o obiecankach z komentarzy pod artykułem dotyczącym kolejności warunków w WHERE :)

0

Cześć,
Dziś opublikowałem nowy kurs o ROWID
W kolejnym wpisie opiszę pierwsza metodę joinowania :)

0

Cześć,
W dzisiejszym kursie kontynuuję tematykę JOINowania.
Tym razem Kurs SQL o działaniu i wykorzystaniu: JOIN NESTED LOOPS

0

Cześć!
Udostępniłem nowy kurs o optymalizacji bazy danych Oracle i SQL.
Nowy kurs pod tytułem: Kolejność kolumn w tabeli
Opisuję w nim czy i jakie znaczenie ma kolejność kolumn. Opisuję jak zapisywane są dane w bloku danych Oracle oraz jakie ma to znaczenie na konkretnym przykładzie :)


Rozpocząłem pisanie nowego kursu dla początkujących w SQL i bazach danych dostępny jest on pod adresem: Kurs SQL
Jeżeli ktoś chce być na bieŻąco (Boże, widzisz takie błędy i nie grzmisz) z kursem dla początkujących to przy publikacji nowego kursu będę wrzucał post na forum ale w dziale Edukacja pod w wątku: Kurs SQL i baz danych dla początkujących, baza Oracle

W tym wątku będę wrzucam tylko aktualizacje odnośnie kursów dla średniozaawansowanych, dotyczące czysto bazy Oracle i optymalizacji bazy danych czy zapytań SQL.
Natomiast jeżeli ktoś chce śledzić kursy z obu serii to zapraszam do Facebookowego profilu: OracleDevPL

0

Cześć,
Udostępniam nowy kurs dla średnio zaawansowanym SQL, działaniu bazy Oracle i optymalizacji zapytań.
Nowy kurs Oracle SQL o : HASH JOIN w Oracle

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.