Để trả lời câu hỏi của bạn, nó cần được tách ra một chút:
SELECT *
có 3 loại nhược điểm chính:
- Bảo trì mã:sử dụng SELECT * làm giảm tính dễ đọc đối với các bảng / truy vấn phức tạp và có thể gây ra sự cố khi ứng dụng khách mong đợi một kết quả nhất định từ một truy vấn, nhưng bảng thay đổi
- Hiệu suất mạng:sử dụng SELECT * khi trả về kết quả cho ứng dụng khách có nghĩa là tất cả các cột sẽ được trả lại cho ứng dụng khách; nếu máy khách chỉ sử dụng một số cột trong số đó thì băng thông sẽ bị lãng phí và ứng dụng chạy chậm hơn có thể.
- Hiệu suất lập chỉ mục / kế hoạch truy vấn:Trong một số trường hợp, nếu bạn có một truy vấn thực sự chỉ cần trả lại các cột tham gia vào một chỉ mục, nhưng thay vào đó bạn trả lại tất cả, thì bạn có thể nhận được các kế hoạch truy vấn tồi tệ hơn nhiều do động cơ.
Tôi không chắc ý của bạn về "hàm ý liên quan đến diễn giải ký tự đại diện", nhưng tôi nghi ngờ bạn đang hiểu nhầm tại sao SELECT * là một ý tưởng tồi - công cụ SQL dù sao cũng xác nhận các cột được cung cấp; chi phí "mở rộng" ký tự đại diện về cơ bản là 0.
Một thủ tục được lưu trữ không thực sự là một "đơn vị mã được biên dịch":kế hoạch truy vấn cho một thủ tục được lưu trữ thường sẽ được lưu vào bộ nhớ đệm sau khi nó chạy lần đầu tiên, nhưng điều này thực sự đúng với các câu lệnh SQL đặc biệt cũng trong nhiều / hầu hết các trường hợp.
Bây giờ, để thực sự trả lời câu hỏi của bạn: Có , bất kỳ nhược điểm nào khi sử dụng SELECT *
trong SQL đặc biệt cũng áp dụng tương tự cho SQL bên trong một thủ tục được lưu trữ.