Là tốt hơn để điền các biến bằng cách sử dụng SET hoặc SELECT?


8

Cách tốt hơn (liên quan đến hiệu suất) để đặt giá trị thành biến là gì?

  1. Bằng SETlệnh:

    DECLARE @VarString nvarchar(max);
    SET @VarString = 'john doe';
    SELECT @VarString;
  2. Bằng SELECTlệnh:

    DECLARE @VarString nvarchar(max);
    SELECT @VarString = 'john doe';
    SELECT @VarString;

1
Sử dụng CHỌN không phải là ngữ nghĩa, nhưng tôi tò mò muốn biết liệu nó có nhanh hơn SET không.
Rafael Kassner


@RafaelKassner - SELECTnhanh hơn khi gán giá trị cho nhiều biến cùng một lúc . Nếu không, sự khác biệt hiệu suất là không đáng kể.
Nick Chammas

@SQLLearner - Báo cáo đó cho kết quả không thuyết phục. Đầu tiên, áp phích quảng cáo SETnhanh hơn, sau đó giảm một nửa, ông nói thêm: "Thật kỳ lạ, nếu bạn quay số lần chạy lên để nói, 10, thì SETbắt đầu tụt lại phía sau."
Nick Chammas

Câu trả lời:


8

Đừng chọn cái này hay cái kia cho hiệu suất.

Chọn dựa trên những gì phù hợp với phong cách và nhu cầu phát triển của bạn, như được khuyên trong phần kết luận so sánh tuyệt vời này giữa SELECTSET (nhấn mạnh và định dạng nhỏ được thêm vào):

Thực hành tốt nhất đề nghị không dính vào một phương pháp. Tùy thuộc vào kịch bản bạn có thể muốn sử dụng cả hai SEThoặc SELECT.

Sau đây là một vài tình huống để sử dụng SET:

  • Nếu bạn được yêu cầu chỉ định một giá trị trực tiếp cho biến và không có truy vấn nào liên quan đến tìm nạp giá trị
  • Bài tập NULL được mong đợi ( NULLtrả về trong tập kết quả)
  • Các tiêu chuẩn được tuân theo cho mọi di chuyển theo kế hoạch
  • Kết quả không vô hướng được mong đợi và được yêu cầu xử lý

Sử dụng SELECTlà hiệu quả và linh hoạt trong một số trường hợp sau đây:

  • Nhiều biến đang được tạo ra bằng cách gán giá trị trực tiếp
  • Nhiều biến đang được điền bởi một nguồn duy nhất (bảng, dạng xem)
  • Ít mã hóa để gán nhiều biến
  • Sử dụng cái này nếu bạn cần lấy @@ROWCOUNT@ERRORcho câu lệnh cuối cùng được thực thi

3

Tôi nghĩ rằng sự đồng thuận là có sự khác biệt hiệu suất không đáng kể giữa hai người (với SETtốc độ nhanh hơn). Nhưng nếu bạn giống như tôi, tôi sẽ sử dụng SETnơi thích hợp cho mục đích dễ đọc. Anh chàng tiếp theo sẽ duy trì mã của bạn sẽ cảm ơn bạn vì điều đó ;-)


1
Bạn có thể đăng điểm chuẩn chứng minh rằng SET nhanh hơn không?
AK

Alex, xin hãy xem đây là một ví dụ stackoverflow.com/questions/189588/NH
MarlonRibunal

Marlon, báo cáo đó cho kết quả không kết luận. Lưu ý rằng một nửa xuống poster ghi chú rằng: "Thật kỳ lạ, nếu bạn quay số lần chạy lên để nói, 10, thì SET bắt đầu tụt lại phía sau."
Nick Chammas

Đó là lý do tại sao câu trả lời của tôi nghiêng về "mục đích dễ đọc". Kịch bản ca sử dụng trong câu trả lời của bạn là những điểm tuyệt vời.
MarlonRibunal

2

Tôi luôn sử dụng SET trừ khi tôi nhập nhiều biến từ tập kết quả của 1 truy vấn. Bằng cách đó, bằng cách sử dụng SELECT, chúng tôi chỉ truy vấn bảng một lần.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.