Ostatnio dużo słyszałem, że SQL to okropny język i wydaje się, że każdy framework pod słońcem jest dostarczany z warstwą abstrakcji bazy danych.
Zwróć uwagę, że te warstwy po prostu konwertują własne pliki na SQL
. W przypadku większości dostawców baz danych SQL
jest to jedyny sposób komunikacji z silnikiem.
Jednak z mojego doświadczenia wynika, że SQL jest często znacznie łatwiejszym, bardziej wszechstronnym i bardziej przyjaznym dla programistów sposobem zarządzania wprowadzaniem i wyprowadzaniem danych. Każda warstwa abstrakcji, której użyłem, wydaje się być wyraźnie ograniczonym podejściem bez realnych korzyści.
… Powód, dla którego właśnie opisałem powyżej.
Warstwy bazy danych niczego nie dodają , po prostu Cię ograniczają . Sprawiają, że zapytania są bezsprzecznie prostsze, ale nigdy nie są bardziej wydajne.
Z definicji w warstwach bazy danych nie ma niczego, czego nie ma SQL
.
Co sprawia SQL
, że są tak straszne i dlaczego warstwy abstrakcji bazy danych są cenne?
SQL
jest fajnym językiem, jednak praca z nim wymaga trochę szaleństwa.
W teorii, SQL
jest deklaratywna, czyli deklarujesz, co chcesz dostać, a silnik zapewnia to w najszybszy możliwy sposób.
W praktyce istnieje wiele sposobów sformułowania poprawnego zapytania (czyli zapytania, które zwraca poprawne wyniki).
Optymalizatory są w stanie zbudować zamek Lego z niektórych predefiniowanych algorytmów (tak, jest ich wiele), ale po prostu nie mogą tworzyć nowych algorytmów. Nadal potrzeba pomocy SQL
programisty.
Jednak niektórzy ludzie oczekują, że optymalizator utworzy „najlepszy możliwy plan”, a nie „najlepszy plan dostępny dla tego zapytania przy danej implementacji SQL
silnika”.
A jak wszyscy wiemy, kiedy program komputerowy nie spełnia oczekiwań ludzi, wini się program, a nie oczekiwania.
Jednak w większości przypadków przeformułowanie zapytania może dać najlepszy możliwy plan. Są jednak zadania, w przypadku których jest to niemożliwe dzięki nowym i stale rozwijającym się ulepszeniomSQL
tych przypadków liczba jest coraz mniejsza.
Byłoby jednak miło, gdyby dostawcy zapewnili niski poziom dostępu do funkcji, takich jak „pobierz zakres indeksu”, „pobierz wiersz za rowid
” itd., Tak jak C
kompilatory pozwalają na osadzenie asemblera bezpośrednio w języku.
Niedawno napisałem artykuł na ten temat na moim blogu: