2013-07-14 42 views
5

Tôi luôn luôn nghe từ các chuyên gia SQL rằng không hiệu quả khi sử dụng ký hiệu '*' trong câu lệnh SELECT và tốt hơn nên liệt kê tất cả các tên trường thay thế.SELECT * - ưu/nhược điểm

Nhưng tôi không tìm thấy nó hiệu quả cho cá nhân tôi khi nói đến việc thêm trường mới vào bảng và sau đó cập nhật tất cả các thủ tục được lưu trữ cho phù hợp.

Vì vậy, ưu điểm và nhược điểm khi sử dụng '*' là gì?
Cảm ơn.

+1

thể trùng lặp của [Có thể chọn \ * Cách dùng bao giờ được chứng minh?] (http://stackoverflow.com/questions/3635781/can-select-usage-ever-be-justified) –

Trả lời

13

Nói chung, việc sử dụng SELECT * không phải là một ý tưởng hay.

Ưu điểm:

  • Khi bạn thêm/gỡ bỏ các cột, bạn không cần phải thực hiện thay đổi mà bạn đã sử dụng SELECT *
  • Nó là ngắn hơn để viết
  • Cũng thấy câu trả lời cho: Can select * usage ever be justified?

Nhược điểm:

  • Bạn đang trả lại nhiều dữ liệu hơn mức bạn cần. Giả sử bạn thêm một cột VARBINARY có chứa 200 nghìn mỗi hàng. Bạn chỉ cần dữ liệu này trong một chỗ cho một hồ sơ duy nhất - sử dụng SELECT * bạn có thể kết thúc trở 2MB mỗi 10 dòng rằng bạn không cần
  • Explicit về những dữ liệu được sử dụng
  • cột Xác định có nghĩa là bạn nhận được một lỗi khi một cột được lấy ra
  • Bộ xử lý truy vấn đã làm một số công việc hơn - tìm ra những gì cột tồn tại trên bàn (nhờ @vinodadhikary)
  • Bạn có thể tìm thấy nơi một cột được sử dụng dễ dàng hơn
  • Bạn nhận tất cả các cột trong các tham gia nếu y ou sử dụng SELECT *
  • Bạn không thể sử dụng tham khảo thứ tự (mặc dù sử dụng tài liệu tham khảo thứ tự cho các cột là xấu thực hành trong chính nó)
  • Cũng thấy câu trả lời cho: What is the reason not to use select *?
+3

Để thêm vào nhược điểm, bộ xử lý truy vấn phải tìm ra những cột nào tồn tại trong bảng cụ thể trước. – vee

+1

@vinodadhikary - Tại sao lại có nhiều công việc hơn việc xác nhận danh sách cột rõ ràng có chứa tất cả các tên cột? Tôi tưởng tượng nó có thể là công việc hơi ít hơn trong thực tế vì nó chỉ cần lấy tất cả các siêu dữ liệu cột không xác nhận riêng từng siêu dữ liệu. –

+0

@MartinSmith, Ký tự hoang dã '*' phải được mở rộng trước khi tất cả các trường được xác thực. Vì vậy, nếu 'select' chứa một' * 'được thêm vào field_list. Tối ưu hóa là tối thiểu như xa như hiệu suất là có liên quan nhưng cuộc gọi chức năng bổ sung được lưu. Tôi thực sự không thể tìm thấy phiên bản nguồn MySQL của Oracle (và tôi thực sự không bận tâm đến nó), nhưng đã tìm thấy phiên bản 'twitter' trong github. Có một cái nhìn tại 'https: // github.com/twitter/mysql/blob/master /', 'sql/sql_select.cc'' JOIN :: chuẩn bị' giữa các dòng 498 và 554 và 'setup_wild' tại dòng 7846 trong' sql/sql_base.cc'. – vee

5

Ưu điểm:

  • khi bạn thực sự cần tất cả các cột, viết ngắn hơn là select *

Nhược điểm:

  • hầu hết thời gian, bạn không cần tất cả các cột, nhưng chỉ một số cột. Sẽ hiệu quả hơn nếu bạn chỉ truy xuất những gì bạn muốn
  • bạn không đảm bảo thứ tự của các cột đã truy xuất (hoặc ít nhất, thứ tự không rõ ràng trong truy vấn), cấm truy cập các cột theo chỉ mục (chỉ theo tên).Nhưng những cái tên cũng xa rõ ràng
  • khi tham gia nhiều bảng có khả năng cột có cùng tên, bạn có thể xác định bí danh cho các cột