Bir SQL seçimi sırasında, DB SELECT a, b, c ... için SELECT * olup olmadığına bakılmaksızın her zaman tablonun meta verilerine başvuracaktır. Neden? Çünkü sistemdeki tablonun yapısı ve düzeni hakkındaki bilgiler burada.
Bu bilgileri iki nedenle okuması gerekir. Bir, basitçe ifadeyi derlemek için. En azından mevcut bir tabloyu belirttiğinizden emin olması gerekir. Ayrıca, bir ifadenin son çalıştırılmasından bu yana veritabanı yapısı değişmiş olabilir.
Şimdi, tabii ki, DB meta verileri sistemde önbelleğe alındı, ancak yapılması gereken hala işleniyor.
Ardından, meta veriler sorgu planını oluşturmak için kullanılır. Bu, bir ifade her derlendiğinde de olur. Yine, bu önbelleğe alınmış meta verilere karşı çalışır, ancak her zaman yapılır.
Bu işlemin yapılmadığı tek zaman, DB'nin önceden derlenmiş bir sorgu kullandığı veya önceki bir sorguyu önbelleğe aldığı zamandır. Bu, değişmez SQL yerine bağlama parametrelerini kullanma argümanıdır. "SEÇ * TABLEDEN NEREDE anahtar = 1" sorgudan farklı bir sorgu "SEÇ * TABLEDEN NEREDE anahtar =?" ve "1" çağrıya bağlıdır.
DB'ler orada çalışmak için sayfa önbelleğe alma işlemine büyük ölçüde güvenir. Çoğu modern DB, belleğe tamamen sığacak kadar küçüktür (veya, belki de modern belleğin birçok DB'ye uyacak kadar büyük olduğunu söylemeliyim). Ardından, arka uçtaki birincil G / Ç maliyetiniz günlüğe kaydetme ve sayfa temizlemedir.
Bununla birlikte, hala DB'niz için diske vuruyorsanız, birçok sistem tarafından yapılan birincil optimizasyon, tabloların kendileri yerine dizinlerdeki verilere güvenmektir.
Eğer varsa:
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);
Sonra "SELECT id, name FROM customer WHERE id = 1" yaparsanız, DB'niz bu verileri tablolardan değil dizinden çekmeniz çok olasıdır.
Neden? Sorguyu tatmin etmek için muhtemelen dizini kullanacaktır (tablo taramasına karşı) ve where cümlesinde 'ad' kullanılmasa da, bu dizin yine de sorgu için en iyi seçenek olacaktır.
Artık veritabanı sorguyu karşılamak için ihtiyaç duyduğu tüm verilere sahiptir, bu nedenle tablo sayfalarını kendilerinin vurması için bir neden yoktur. Dizinin kullanılması, genel olarak tabloya kıyasla dizinde daha yüksek bir satır yoğunluğuna sahip olduğunuzdan daha az disk trafiği ile sonuçlanır.
Bu, bazı veritabanları tarafından kullanılan belirli bir optimizasyon tekniğinin el dalgalı bir açıklamasıdır. Birçoğunun birkaç optimizasyon ve ayarlama tekniği vardır.
Sonunda, SELECT * elle yazmanız gereken dinamik sorgular için kullanışlıdır, "gerçek kod" için asla kullanmam. Tek tek sütunların tanımlanması, DB'ye sorguyu optimize etmek için kullanabileceği daha fazla bilgi verir ve şema değişikliklerine vb. Karşı kodunuzda size daha iyi kontrol sağlar.
SELECT
Sorguların nasıl yürütüldüğü / işlendiği veritabanından veritabanına farklı olabilir.