Trong SQL Server 2012, (hoặc bất kỳ phiên bản nào từ năm 2005 trở lên), việc sử dụng SELECT *...
chỉ là vấn đề hiệu năng có thể xảy ra trong câu lệnh CHỌN cấp cao nhất của truy vấn.
Vì vậy, đó không phải là vấn đề trong Lượt xem (*), trong các truy vấn con, trong các mệnh đề EXIST, CTE, cũng như SELECT COUNT(*)..
v.v. Lưu ý, điều này có lẽ cũng đúng với Oracle và DB2 và có thể là PostGres (không chắc chắn) , nhưng rất có khả năng nó vẫn là một vấn đề trong rất nhiều trường hợp đối với MySql.
Để hiểu lý do tại sao (và tại sao nó vẫn có thể là một vấn đề trong CHỌN cấp cao nhất), thật hữu ích để hiểu lý do tại sao nó từng là một vấn đề, đó là vì sử dụng SELECT *..
có nghĩa là " trả về TẤT CẢ các cột ". Nói chung, điều này sẽ trả về nhiều dữ liệu hơn bạn thực sự muốn, điều này rõ ràng có thể dẫn đến nhiều IO hơn, cả đĩa và mạng.
Điều ít rõ ràng hơn là điều này cũng hạn chế những chỉ mục và kế hoạch truy vấn mà trình tối ưu hóa SQL có thể sử dụng, bởi vì nó biết rằng cuối cùng nó phải trả về tất cả các cột dữ liệu. Nếu bạn có thể biết trước rằng bạn chỉ muốn một số cột nhất định, thì nó thường có thể sử dụng các gói truy vấn hiệu quả hơn bằng cách tận dụng các chỉ mục chỉ có các cột đó. May mắn thay, có một cách để nó biết trước điều này, đó là cách để bạn chỉ định rõ ràng các cột bạn muốn trong danh sách cột. Nhưng khi bạn sử dụng "*", bạn sẽ từ bỏ điều này vì "chỉ cần cho tôi mọi thứ, tôi sẽ tìm ra thứ tôi cần."
Có, cũng có sử dụng CPU và bộ nhớ bổ sung để xử lý mỗi cột, nhưng hầu như luôn luôn là nhỏ so với hai điều sau: băng thông mạng và đĩa phụ đáng kể cần thiết cho các cột mà bạn không cần và phải sử dụng ít hơn kế hoạch truy vấn được tối ưu hóa bởi vì nó phải bao gồm mọi cột.
Vậy điều gì đã thay đổi? Về cơ bản, Trình tối ưu hóa SQL đã kết hợp thành công một tính năng gọi là "Tối ưu hóa cột" có nghĩa là, giờ đây chúng có thể tìm ra trong các truy vấn phụ cấp thấp hơn nếu bạn thực sự sẽ sử dụng một cột ở cấp cao hơn của truy vấn.
Kết quả cuối cùng là điều này không còn quan trọng nữa nếu bạn sử dụng 'CHỌN * ..' ở cấp độ thấp hơn / bên trong của truy vấn. Thay vào đó, điều thực sự quan trọng là những gì trong danh sách cột của CHỌN cấp cao nhất. Trừ khi bạn sử dụng SELECT *..
ở trên cùng, sau đó một lần nữa, phải cho rằng bạn muốn TẤT CẢ các cột và do đó không thể sử dụng tối ưu hóa cột một cách hiệu quả.
(* - lưu ý rằng có một vấn đề ràng buộc nhỏ, khác trong Chế độ xem *
khi chúng không luôn luôn đăng ký thay đổi trong danh sách cột khi "*" được sử dụng. Có nhiều cách khác để giải quyết vấn đề này và nó không ảnh hưởng đến hiệu suất.)