2009-02-22 54 views
9

Có ai đã tìm thấy bất kỳ tăng/giảm hiệu suất nào khi sử dụng BEGIN TRY..END TRY trong máy chủ sql 2008, so với IF @ @ ERROR <> 0 cũ không? Chỉ cần tò mò để biết nếu có hình phạt hiệu suất hay không.SQLServer thử hiệu suất bắt

Trả lời

2

Đây là một câu hỏi cũ, nhưng trong năm 2012 Aaron Bertrand đã viết một bài viết chi tiết Performance impact of different error handling techniques nơi ông so vài phương pháp để đối phó với trường hợp ngoại lệ trong SQL Server và tôi nghĩ rằng nó là đáng nói đến nó ở đây.

Ông nói, rằng chính cách tiếp cận người sử dụng để đối phó với trường hợp ngoại lệ là:

  • Chỉ cần cho động cơ xử lý nó, và bong bóng bất kỳ ngoại lệ lại cho người gọi.
  • Sử dụng BEGIN TRANSACTIONROLLBACK nếu @@ERROR <> 0.
  • Sử dụng TRY/CATCH với ROLLBACK trong khối CATCH (SQL Server 2005+).

Và nhiều mất phương pháp mà họ nên kiểm tra xem họ sẽ chịu vi phạm lần đầu, vì nó có vẻ sạch hơn để xử lý các lặp lại chính mình hơn để buộc các động cơ để làm điều đó.

kết luận của ông là:

Nếu chúng ta nghĩ chúng ta sẽ có một tỷ lệ cao của thất bại, hoặc không có ý tưởng những gì tỷ lệ thất bại tiềm năng của chúng tôi sẽ được, sau đó kiểm tra đầu tiên tránh vi phạm trong động cơ sẽ có giá trị rất lớn trong số của chúng tôi trong khi. Ngay cả trong trường hợp chúng tôi đã chèn thành công mỗi lần, chi phí kiểm tra đầu tiên là biên và dễ dàng được chứng minh bằng chi phí xử lý lỗi sau này (trừ khi tỷ lệ lỗi dự kiến ​​làkhông chính xác là 0%).

Đây là bảng xếp hạng từ bài viết:

summary

CheckInsert | Checks `IF EXISTS` first | Simple `INSERT` 
CheckRollback | Checks `IF EXISTS` first | Use `IF @@ERROR <> 0` 
CheckTryCatch | Checks `IF EXISTS` first | Use `TRY CATCH` 
JustInsert  |       | Simple `INSERT` 
JustRollback |       | Use `IF @@ERROR <> 0` 
JustTryCatch |       | Use `TRY CATCH` 
+0

Xin chào! Tôi không chắc chắn về điểm chính của bạn. Nếu bạn gợi ý rằng ngoài TRY ... CATCH mọi người cũng làm kiểm tra trước, thì điều đó là không liên quan vì nó liên quan đến tất cả các kịch bản có thể xảy ra, và phải rõ ràng, ít nhất là với các chuyên gia DB, rằng việc đọc đơn giản là ít công việc hơn hơn là ghi vào nhật ký và sau đó phải làm nhiều việc hơn để quản lý ROLLBACK. Nếu bạn đang nói để chỉ làm kiểm tra và không sử dụng TRY ... CATCH, thì đó là một sự hiểu lầm nguy hiểm của một bài kiểm tra mà không nói đến lý do tại sao chúng tôi sử dụng xử lý ngoại lệ ở nơi đầu tiên. –

+0

@srutzky, bài viết đó so sánh các biến thể khác nhau, không chỉ những biến thể được hỏi trong câu hỏi này. Bạn có thể thấy hiệu suất biểu đồ của 'TRY ... CATCH' so với' IF @@ ERROR <> 0'. Trong trường hợp có nhiều rollback 'TRY ... CATCH' tốt hơn nhiều, không tệ hơn bạn nghĩ. –

+0

Bài viết đó hầu hết là vô nghĩa. Nó thực sự chỉ phản ánh kịch bản vô lý của việc không thực hiện xác nhận trước. Vì vậy, bỏ qua các bài kiểm tra "Chỉ *". Có bao nhiêu thao tác là một hành động hàng đơn? Ai sẽ cho phép lỗi xảy ra trong các phương pháp dựa trên thiết lập, khi khôi phục có thể mất vài phút? Và bài kiểm tra không bao gồm việc sử dụng thực sự của 'TRY ... CATCH' bằng cách đặt' NẾU EXISTS' bên trong nó. Kịch bản "Tất cả thất bại" là điều thú vị cần lưu ý nhưng không thực tế vì nó sẽ không bao giờ xảy ra và nó bỏ qua tất cả 3 tùy chọn để không so sánh chúng. Điều đó cho thấy 'TRY ... CATCH' là thứ 3 trong 6 bài kiểm tra có liên quan ở đây. –

3

Kể từ SQL 2005, bạn nên cố gắng sử dụng cách TRY CATCH để xử lý các ngoại lệ hoặc ghi nhật ký lỗi. Nó được coi là thực hành tốt nhất. Không nên có hiệu suất lớn hit bằng cách sử dụng nó.

BEGIN TRY 
    BEGIN TRANSACTION 
    -- SQL 
    COMMIT TRANSACTION 
END TRY 
BEGIN CATCH 
    ROLLBACK 
    SELECT 
     ERROR_MESSAGE(), 
     ERROR_NUMBER() -- etc 
END CATCH 
+0

Ông yêu cầu về hiệu suất tương đối ... –

4

Vì các vấn đề về đĩa cơ sở dữ liệu là giống hệt nhau, nên không có vấn đề về hiệu suất đáng kể.

+0

Hiệu suất của 'TRY ... CATCH' và 'NẾU @@ ERROR <> 0' hơi khác. Nhưng, quan trọng hơn, có một sự khác biệt đáng kể nếu bạn cố gắng ngăn chặn lỗi ở nơi đầu tiên. Aaron Bertrand đã cho thấy nó trong một bài viết chi tiết [Tác động hiệu suất của các kỹ thuật xử lý lỗi khác nhau] (http://sqlperformance.com/2012/08/t-sql-queries/error-handling). Tôi đưa ra câu trả lời dưới đây tóm tắt các phát hiện của ông. –

1

Quên hiệu suất, đó là một cảnh chết tiệt an toàn hơn, tốt hơn và dễ hiểu hơn.

Tuy nhiên, việc sử dụng @@ ERROR thường yêu cầu GOTO và/hoặc nhiều câu lệnh IF để quản lý chính xác vì vậy tôi đoán có thể có một sự gia tăng nhỏ trong TRY..CATCH.

+1

Đồng ý. Hiệu suất không phải là mối quan tâm chính ở đây được cho là tốt hơn bao nhiêu trong việc xây dựng T-SQL 'TRY' /' CATCH' đã vượt quá thử nghiệm cho '@@ ERROR' sau mỗi câu lệnh. Mặc dù có hiệu suất nhỏ khi sử dụng 'TRY' /' CATCH', nhưng đó là mức giá chấp nhận được để trả cho các lợi ích khác. –

+0

@srutzky, Tuy nhiên, nếu bạn đang theo dõi hiệu suất, hãy lưu ý rằng hiệu suất của 'TRY ... CATCH' và' IF @@ ERROR <> 0' hơi khác. Nhưng, quan trọng hơn, có một sự khác biệt đáng kể nếu bạn cố gắng ngăn chặn lỗi ở nơi đầu tiên. Aaron Bertrand đã cho thấy nó trong một bài viết chi tiết [Tác động hiệu suất của các kỹ thuật xử lý lỗi khác nhau] (http://sqlperformance.com/2012/08/t-sql-queries/error-handling). Tôi đưa ra câu trả lời dưới đây tóm tắt các phát hiện của ông. –

+0

@VladimirBaranov Bài viết đó không liên quan đến Câu hỏi này. Tất nhiên có tiết kiệm đáng kể trong việc tránh sự cần thiết phải quay trở lại. Đó là giả định và không cần phải được nêu. Nhưng bạn vẫn cần xử lý lỗi và 'TRY ... CATCH' tốt hơn nhiều so với kiểm tra' @@ ERROR <> 0', ngay cả khi 'TRY ... CATCH' chậm hơn một chút. –

0

Hiệu suất của TRY ... CATCH có nhiều khả năng hơn một chút khi không có lỗi. Mặt khác, nó sẽ nhanh hơn trong nhiều trường hợp khi có lỗi.

Tuy nhiên, bạn không nên mã nghiêm ngặt cho hiệu suất. Và, chi phí, nếu có, sẽ khá nhỏ, vì vậy tôi sẽ không trao đổi cú pháp an toàn hơn cho hiệu năng trong trường hợp này. Ngoài ra, việc thử ... Catch làm cho mã dễ dàng hơn một chút để duy trì, đặc biệt là nếu nhóm dev SQL của bạn đã không được xung quanh SQL Server rất dài, mà không may, xảy ra một chút quá thường xuyên. Các tính năng chính: Tôi tưởng tượng điều này sẽ được nhiều hơn các trường hợp một vài năm kể từ bây giờ.