Với đặc điểm kỹ thuật của bạn rằng bạn đang chọn tất cả các cột, có rất ít sự khác biệt tại thời điểm này . Tuy nhiên, nhận ra rằng các lược đồ cơ sở dữ liệu thay đổi. Nếu bạn dùngSELECT *
bạn sẽ nhận được bất kỳ cột mới nào được thêm vào bảng, mặc dù trong tất cả khả năng, mã của bạn không được chuẩn bị để sử dụng hoặc trình bày dữ liệu mới đó. Điều này có nghĩa là bạn đang phơi bày hệ thống của mình trước những thay đổi về hiệu năng và chức năng không mong muốn.
Bạn có thể sẵn sàng loại bỏ điều này như một chi phí nhỏ, nhưng nhận ra rằng các cột mà bạn không cần vẫn phải là:
- Đọc từ cơ sở dữ liệu
- Gửi qua mạng
- Tham gia vào quá trình của bạn
- (đối với công nghệ loại ADO) Được lưu trong bảng dữ liệu trong bộ nhớ
- Bỏ qua và loại bỏ / thu gom rác
Mục số 1 có nhiều chi phí ẩn bao gồm loại bỏ một số chỉ số che phủ tiềm năng, gây ra tải trang dữ liệu (và đập bộ đệm máy chủ), phát sinh khóa hàng / trang / bảng có thể tránh được.
Cân bằng điều này với mức tiết kiệm tiềm năng của việc chỉ định các cột so với *
và tiết kiệm tiềm năng duy nhất là:
- Lập trình viên không cần phải xem lại SQL để thêm các cột
- Truyền tải mạng của SQL nhỏ hơn / nhanh hơn
- Thời gian xác thực / phân tích truy vấn SQL Server
- Bộ đệm truy vấn SQL Server
Đối với mục 1, thực tế là bạn sẽ thêm / thay đổi mã để sử dụng bất kỳ cột mới nào bạn có thể thêm vào, vì vậy đây là một rửa.
Đối với mục 2, sự khác biệt hiếm khi đủ để đẩy bạn vào một gói hoặc số gói mạng khác nhau. Nếu bạn đi đến điểm mà thời gian truyền câu lệnh SQL là vấn đề chính, có lẽ bạn cần phải giảm tốc độ của câu lệnh trước.
Đối với mục 3, KHÔNG có khoản tiết kiệm nào vì việc mở rộng *
phải xảy ra bằng mọi cách, điều đó có nghĩa là tham khảo lược đồ (các) bảng. Trên thực tế, việc liệt kê các cột sẽ phải chịu cùng một chi phí vì chúng phải được xác nhận theo lược đồ. Nói cách khác, đây là một rửa hoàn toàn.
Đối với mục 4, khi bạn chỉ định các cột cụ thể, bộ đệm của kế hoạch truy vấn của bạn có thể lớn hơn nhưng chỉ khi bạn đang xử lý các nhóm cột khác nhau (không phải là những gì bạn đã chỉ định). Trong trường hợp này, bạn muốn các mục bộ đệm khác nhau vì bạn muốn các gói khác nhau khi cần.
Vì vậy, tất cả điều này xảy ra, bởi vì cách bạn đã chỉ định câu hỏi, cho khả năng phục hồi vấn đề khi đối mặt với các sửa đổi lược đồ cuối cùng. Nếu bạn đang ghi lược đồ này vào ROM (nó xảy ra), thì điều đó *
là hoàn toàn chấp nhận được.
Tuy nhiên, hướng dẫn chung của tôi là bạn chỉ nên chọn các cột bạn cần, điều đó có nghĩa là đôi khi nó sẽ giống như bạn đang yêu cầu tất cả chúng, nhưng các DBA và tiến hóa lược đồ có nghĩa là một số cột mới có thể ảnh hưởng lớn đến truy vấn .
Lời khuyên của tôi là bạn LUÔN LUÔN CHỌN các cột cụ thể . Hãy nhớ rằng bạn giỏi về những gì bạn làm đi làm lại, vì vậy hãy tập thói quen làm đúng.
Nếu bạn đang tự hỏi tại sao một lược đồ có thể thay đổi mà không thay đổi mã, hãy nghĩ về việc ghi nhật ký kiểm toán, ngày hiệu lực / ngày hết hạn và những thứ tương tự khác được DBA thêm vào cho các vấn đề tuân thủ một cách có hệ thống. Một nguồn thay đổi ngầm khác là sự không chuẩn hóa cho hiệu suất ở những nơi khác trong hệ thống hoặc các trường do người dùng xác định.