#dzieńlasów - wyobraź sobie, że baza danych to las.
Optymalizator to Czerwony Kapturek, który przez ten las się przedziera. Mozoli przez zarośla dla Ciebie. Twoja komenda SQL kazała Kapturkowi ruszyć w drogę aby przynieść Ci w koszyczku dane. Lub dostarczyć dane, które w koszyczku ma zapakowane. Babcia - stara tabela - mieszkająca pośrodku lasu chętnie danymi się podzieli. Chętnie, też przyjmie to co w koszyczku znajdzie.
Ścieżka, którą Kapturek podąża to ścieżka dostępu do danych. Jak będzie długa, kręta i utwardzona zależy od Ciebie - jeśli projektujesz schemat bazy danych.
Możesz po prostu wykarczować trochę zarośli i nieco ubić ziemię tworząc najprostsze i najtańsze ścieżki w postaci indeksów jednokolumnowych. Ale możesz utwardzić ścieżki różnego rodzaju płytkami w postaci indeksów wielokolumnowych, funkcyjnych, bitmapowych,...
Przy ścieżkach stawiasz drogowskazy - więzy integralności i statystyki. Podpowiadają Kapturkowi, którą ścieżkę wybrać. Bez nich Kapturek zabłądzi.
Komendą SQL wskazujesz Kapturkowi właściwe ścieżki - tworząc złączenia, klauzule 'where', 'order by' czy wybierając kolumny w 'select'.
4 poziomy izolacji standardu ANSI + 3 zjawiska towarzyszące
Zilustrowane:
Kluczem do zrozumienia poziomów izolacji jest zaakceptowanie faktu, że to Ty decydujesz na jakim poziomie wykona się Twoja transakcja. Robisz to po to aby ODIZOLOWAĆ dane, na których Twoja transakcja pracuje, od wpływu innych transakcji. Innymi słowy ustanawiając poziom izolacji dla SWOJEJ transakcji, ograniczasz możliwość wykonania zmian, innym transakcjom, na danych potrzebnych TWOJEJ transakcji.
Poziomy izolacji mają duży wpływ na współbieżność transakcji działających na bazie danych. Jeśli więc chcesz aby Twoja aplikacja działała wydajnie i miała wielu zadowolonych użytkowników to używaj najniższego z możliwych poziomów izolacji. W niektórych przypadkach może być korzystne użycie niższego poziomu izolacji i zabezpieczenie Twojej transkacji, czy aplikacji, przed konsekwencjami zjawisk towarzyszących.
► READ UNCOMMITTED - najniższy poziom izolacji. Odczytuje nie commit'owane zmiany dokonane przez inną transakcję.
► READ COMMITTED - poziom izolacji zapewniający odczyt tylko commit'owanych zmian innych transakcji
► REPEATABLE READ - poziom izolacji zawierający READ COMMITTED oraz zapewniający niezmienność jakości danych pomiędzy odczytami tych samych danych
► SERIALIZABLE - poziom izolacji zawierający REPEATABLE READ oraz zapewniający brak różnicy w ilości rekordów pomiędzy kolejnymi odczytami tych samych danych
► DIRTY READ - zjawisko odczytu nie commit'owanych zmian innych transakcji
► NON-REPEATABLE READ - zjawisko różnicy jakościowej pomiędzy kolejnymi odczytami tych samych danych przez jedną transakcję
► PHANTOM READ - zjawisko różnicy ilościowej pomiędzy kolejnymi odczytami tych samych danych przez jedną transakcję
Keywords: #database #rdbms #mysql #postgresql #sqlserver #oracle #oracledatabase #oracledba #programming #coding #development #sql #plsql #backend #programowanie #poziomyizolacji #isolationlevels #bazadanych #bazydanych
10 wartych poznania cech motoru bazy danych
Dopiszesz #11 ?
Nie bardzo rozumiem jak zmiana po wystawieniu kłóci się z tym, co napisałem. Zapis, czy nowej, czy zaktualizowanej starej można zrobić na raz.
Masz dość tnsnames.ora ?
Nie potrzebujesz go, ani zmiennej TNS_ADMIN, używając EZConnect - Easy Connect.
Przykład:
sql użytkownik/hasło@[//]host[:port][/service_name]
service_name - jeśli pominiesz to podłączysz się o ile w listener jest poprawnie zdefiniowana domyślna baza danych.
port - jeśli pominiesz to podłączysz się jeśli listener słucha na 1521
// - możesz dodać jak lubisz notację URL ;-)
Działa, również z: rman, sqlplus, tnsping czy Twoją aplikacją.
Możesz nie używać ani tnsnames.ora ani EZConnect:
sql użytkownik/hasło@(DESCRIPTION=(CONNECT_DATA=(SERVICE_NAME=<service_name>))(ADDRESS=(PROTOCOL=tcp)(HOST=<host>)(PORT=<port>)))
A jeśli używasz 19c to możesz wykorzystać load balancing w connect stringu:
sql użytkownik/hasło@[//]host1,host2[:port][/service_name]
O ile listener'y słuchają na tym samym porcie. Bo jeśli na różnych to:
sql użytkownik/hasło@[//]host1:port1,host2:port2[/service_name]
Notacja testowana z SQLcl - klient w Java. Trzyma historię, pozwala na edycję komend i dokańcza/podpowiada nazwy obiektów oraz słowa kluczowe - klawisz TAB. Możesz też pisać skrypty, uruchamiane po stronie klienta, w JavaScript. Przydatne np. do obróbki wyników.
Do pobrania stąd:
https://www.oracle.com/database/technologies/appdev/sqlcl.html
#dba4dev #marcinbadtke #sqlplus #sqlcl #oracle #oracledatabase #oracledba #sql #tnsnames #ezconnect
Często od developerów bazodanowych wymaga się aby byli bazodanowymi omnibusami.
Od osoby świetnie kodującej w języku programowania, piszącej oprogramowanie używające bazy danych wymaga się aby znała język SQL. Pytanie na jakim poziomie ?
Czy znajomość SQL oznacza, że musisz umieć zamodelować bazę danych ?
Wg mnie bazy danych, szczególnie krytyczne, powinny być projektowane przez architektów baz danych.
Czy znajomość SQL oznacza, że musisz umieć zaprojektować bazę danych ?
Projektowanie bazy danych nie polega na stworzeniu skryptów SQL. Projektant musi wiedzieć jak stworzyć dobry model danych. Taki, który odpowiada potrzebom biznesowym firmy.
Czy znajomość SQL oznacza, że musisz umieć projektować zapytania ?
Wg mnie znajomość SQL nie wystarcza do pisania raportów. Trzeba jeszcze rozumieć potrzeby biznesowe takiego raportu.
Czy znajomość SQL wystarcza do projektowania indeksów ?
Aby dobrze poindeksować dane w bazie trzeba wiedzieć jakimi typami indeksów, użyty motor bazy danych, dysponuje i jaki typ indeksu jest odpowiedni do naszych potrzeb. Trzeba też mieć świadomość jakie indeksy już w bazie danych istnieją i jak ich poprawnie użyć.
Jakie jest Twoje zdanie na temat pojemności sformułowania 'znajomość SQL' w ofertach pracy ?
@Marcin Badtke: Żyłem w przekonaniu, że motor bazy danych dobiera się do zastosowania i SLA,
nigdy w mojej dwudziestokilkuletniej karierze w IT czegoś takiego nie widziałem. Architekci z wieży i tak wybierają tą bazę, którą firma ma w standardzie (Oracle, SQL Server albo DB2). A programiści (jeśli mogą wybrać) tą którą znają, chyba, że akurat co innego jest potrzebne do CV (to seniorzy). A co do zastosowań - to nieważne jak bardzo by się baza danych do czegoś nie nadawała i tak się zawsze uda zastosować - najwyżej ktoś implementujący czasem zapłacze.
@Marcin Badtke: schemat bazy i dane optymalizuje na etapie projektu, a nie testów czy produkcji
Często jedyne dane jakie ma programista to te które sobie z produkcji wyniesie. Więc dopiero gdy usługa ruszy produkcyjnie można optymalizować
MVCC - Multi-Version Concurrency Control w bazach danych
Wideo:
Dawno temu, gdy bazy były małe, a niewielu użytkowników sporadycznie generowało transakcje, instancja bazy danych mogła sobie pozwolić aby blokować dostęp do danych dla każdej transakcji. Nawet do odczytu. Dane blokowane były na krótkie odcinki czasu, a z deadlock'ami nauczono się żyć.
Wraz z globalizacją, postępem technologicznym, rozwojem i upowszechnieniem internetu bazy danych urosły, a liczba ich użytkowników wzrosła wielokrotnie. Generowali oni tak olbrzymie ilości transakcji, że blokowanie danych na czas dostępu powodowało wymierne opóźnienia w ich przetwarzaniu.
W sukurs przyszli producenci baz danych implementując technologię MVCC - Multi-Version Concurrency Control. Technologię umożliwiającą każdej transakcji dostęp do danych bez konieczności ich blokowania na czas dostępu. Znacząco poprawia to współbieżność transakcji oraz praktycznie eliminuje prawdopodobieństwo wystąpienia deadlock'u. Niemniej trzeba mieć na uwadze, że w takim przypadku każda transakcja widzi SWOJĄ wersję danych. Prezentowaną przez instancję bazy danych wg stanu na czas rozpoczęcia danej transakcji.
Różni producenci różnie MVCC implementują. Dla przykładu:
Różne podejścia do implementacji implikują różne konsekwencje. Jedną z konsekwencji jest wydajność wprowadzenia zmiany. Inną wydajność odczytu poprzedniej wersji rekordu. W bazach jak PostgreSQL czy SQL Server, gdzie przechowywane są całe rekordy, odczyt poprzedniej wersji jest mało kosztowny - natychmiast dostępna jest poprzednia wersja całego rekordu.
MySQL i Oracle, natomiast generują poprzednie wersje rekordu 'w locie' - gdy transakcja ich potrzebuje - na podstawie informacji z rollbacksegmentu i UNDO. Powoduje to zwiększone zużycie zasobów CPU oraz IO podczas odczytu zmienianych danych.
PostgreSQL, MySQL i SQL Server - mają osobne procesy garbage collector (SQL Server wątek), które co określony czas czyszczą bazę z niepotrzebnych rekordów. Starają się to zrobić jak najszybciej aby zwolnić miejsce dla kolejnych informacji o zmianach w rekordach. Producenci tych baz zalecają wręcz częsty commit aby baza danych nie rozrastała się niepotrzebnie. Informacje o poprzednich wersjach rekordów znikają z tych baz jak tylko przestaną być potrzebne transakcjom.
Zupełnie inne podejście prezentuje Oracle. W ogóle nie usuwa informacji z UNDO. Nadpisuje jedynie najstarsze najnowszymi. Dzięki takiemu podejściu oszczędza zasoby potrzebne dla garbage collector'a. Bonusem jest ciągła dostępność poprzednich wersji rekordów. Technologia pozwalająca do nich sięgnąć nazywa się FLASHBACK QUERY. Pozwala sprawdzić jak wyglądały dane w przeszłości. W przeszłość można sięgnąć tak daleko na ile pozwala miejsce w tablespace UNDO.
W Oracle dostępne są, również inne możliwości FLASHBACK:
row movement
' i UNDO.#database #rdbms #oracle #mysql #postgresql #sqlserver #mvcc #flashback #oracledatabase #oracledba #sql #plsql #backend #coding #development #programming
MSPANC Panie Salvador Dali