Trong quá trình chọn SQL, DB sẽ luôn đề cập đến siêu dữ liệu cho bảng, bất kể đó là CHỌN * cho CHỌN a, b, c ... Tại sao? Vì đó là thông tin về cấu trúc và bố cục của bảng trên hệ thống.
Nó phải đọc thông tin này vì hai lý do. Một, chỉ đơn giản là biên dịch các tuyên bố. Nó cần đảm bảo rằng bạn chỉ định một bảng hiện có ít nhất. Ngoài ra, cấu trúc cơ sở dữ liệu có thể đã thay đổi kể từ lần cuối cùng một câu lệnh được thực thi.
Bây giờ, rõ ràng, siêu dữ liệu DB được lưu trữ trong hệ thống, nhưng nó vẫn đang xử lý cần phải hoàn thành.
Tiếp theo, siêu dữ liệu được sử dụng để tạo kế hoạch truy vấn. Điều này xảy ra mỗi khi một tuyên bố được biên soạn là tốt. Một lần nữa, điều này chạy với siêu dữ liệu được lưu trong bộ nhớ cache, nhưng nó luôn được thực hiện.
Lần duy nhất quá trình xử lý này không được thực hiện là khi DB đang sử dụng truy vấn được biên dịch trước hoặc đã lưu trữ một truy vấn trước đó. Đây là đối số để sử dụng các tham số ràng buộc thay vì SQL bằng chữ. "CHỌN * TABLE TABLE WHERE key = 1" là một truy vấn khác với "CHỌN * TABLE TABLE WHERE key =?" và "1" bị ràng buộc trong cuộc gọi.
DB phụ thuộc rất nhiều vào bộ nhớ đệm trang cho công việc. Nhiều DB hiện đại đủ nhỏ để phù hợp hoàn toàn với bộ nhớ (hoặc, có lẽ tôi nên nói, bộ nhớ hiện đại đủ lớn để phù hợp với nhiều DB). Sau đó, chi phí I / O chính của bạn ở mặt sau là ghi nhật ký và xóa trang.
Tuy nhiên, nếu bạn vẫn đang nhấn đĩa cho DB của mình, việc tối ưu hóa chính được thực hiện bởi nhiều hệ thống là dựa vào dữ liệu trong các chỉ mục, thay vì chính các bảng.
Nếu bạn có:
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);
Sau đó, nếu bạn thực hiện "CHỌN id, đặt tên TỪ khách hàng WHERE id = 1", rất có khả năng DB của bạn sẽ lấy dữ liệu này từ chỉ mục, thay vì từ các bảng.
Tại sao? Dù sao thì nó cũng có thể sử dụng chỉ mục để đáp ứng truy vấn (so với quét bảng) và mặc dù 'name' không được sử dụng trong mệnh đề where, chỉ mục đó vẫn sẽ là lựa chọn tốt nhất cho truy vấn.
Bây giờ cơ sở dữ liệu có tất cả dữ liệu cần thiết để đáp ứng truy vấn, vì vậy không có lý do gì để tự đánh vào các trang của bảng. Việc sử dụng chỉ mục dẫn đến lưu lượng đĩa ít hơn do bạn có mật độ hàng cao hơn trong chỉ mục so với bảng nói chung.
Đây là một giải thích lượn sóng tay về một kỹ thuật tối ưu hóa cụ thể được sử dụng bởi một số cơ sở dữ liệu. Nhiều người có một số kỹ thuật tối ưu hóa và điều chỉnh.
Cuối cùng, SELECT * hữu ích cho các truy vấn động mà bạn phải nhập bằng tay, tôi sẽ không bao giờ sử dụng nó cho "mã thực". Việc xác định các cột riêng lẻ cung cấp cho DB nhiều thông tin hơn mà nó có thể sử dụng để tối ưu hóa truy vấn và cung cấp cho bạn quyền kiểm soát tốt hơn trong mã của mình trước các thay đổi của lược đồ, v.v.
SELECT
các truy vấn được thực thi / xử lý khác với cơ sở dữ liệu.