Podczas wyboru SQL baza danych zawsze będzie odwoływać się do metadanych tabeli, niezależnie od tego, czy jest to SELECT * dla SELECT a, b, c ... Dlaczego? Bo tam znajdują się informacje o strukturze i układzie tabeli w systemie.
Musi przeczytać te informacje z dwóch powodów. Po pierwsze, aby po prostu skompilować oświadczenie. Musi upewnić się, że określisz co najmniej istniejącą tabelę. Ponadto struktura bazy danych mogła ulec zmianie od czasu ostatniego wykonania instrukcji.
Oczywiście metadane bazy danych są buforowane w systemie, ale nadal trzeba je przetwarzać.
Następnie metadane są używane do generowania planu zapytania. Dzieje się tak za każdym razem, gdy kompilowana jest instrukcja. Ponownie, działa to w przypadku metadanych zapisanych w pamięci podręcznej, ale zawsze jest to robione.
Jedynym przypadkiem, w którym to przetwarzanie nie jest wykonywane, jest sytuacja, gdy baza danych używa wstępnie skompilowanego zapytania lub buforuje poprzednie zapytanie. To jest argument przemawiający za używaniem parametrów wiązania zamiast dosłownego SQL. „SELECT * FROM TABLE WHERE key = 1” to inne zapytanie niż „SELECT * FROM TABLE WHERE key =?” a „1” jest związane z wezwaniem.
Bazy danych w dużym stopniu polegają na buforowaniu stron, aby działać. Wiele nowoczesnych baz danych jest wystarczająco małych, aby całkowicie zmieścić się w pamięci (lub, być może powinienem powiedzieć, nowoczesna pamięć jest wystarczająco duża, aby pomieścić wiele DB). Następnie głównym kosztem we / wy na zapleczu jest rejestrowanie i opróżnianie stron.
Jeśli jednak nadal trafiasz na dysk dla swojej bazy danych, podstawową optymalizacją wykonywaną przez wiele systemów jest poleganie na danych w indeksach, a nie na samych tabelach.
Jeśli masz:
CREATE TABLE customer (
id INTEGER NOT NULL PRIMARY KEY,
name VARCHAR(150) NOT NULL,
city VARCHAR(30),
state VARCHAR(30),
zip VARCHAR(10));
CREATE INDEX k1_customer ON customer(id, name);
Następnie, jeśli wykonasz „SELECT id, name FROM customer WHERE id = 1”, jest bardzo prawdopodobne, że baza danych pobierze te dane z indeksu, a nie z tabel.
Czemu? Prawdopodobnie i tak użyje indeksu, aby spełnić zapytanie (w porównaniu ze skanowaniem tabeli), i chociaż „nazwa” nie jest używana w klauzuli where, indeks ten nadal będzie najlepszą opcją dla zapytania.
Teraz baza danych zawiera wszystkie dane potrzebne do spełnienia zapytania, więc nie ma powodu, aby same trafiać na strony tabeli. Korzystanie z indeksu skutkuje mniejszym ruchem na dysku, ponieważ masz większą gęstość wierszy w indeksie niż ogólnie w tabeli.
Jest to faliste wyjaśnienie konkretnej techniki optymalizacji używanej w niektórych bazach danych. Wiele z nich ma kilka technik optymalizacji i strojenia.
Ostatecznie SELECT * jest przydatne w przypadku dynamicznych zapytań, które trzeba wpisywać ręcznie, nigdy bym go nie używał do „prawdziwego kodu”. Identyfikacja poszczególnych kolumn daje DB więcej informacji, których może użyć do optymalizacji zapytania i daje lepszą kontrolę nad kodem przed zmianami schematu itp.
SELECT
wykonywania / przetwarzania zapytań różni się w zależności od bazy danych.