Ưu và nhược điểm của việc kiểm tra nếu giá trị tồn tại cho cột duy nhất hoặc để db tăng lỗi duy nhất khi chèn


8

Trong khi viết một truy vấn vào một ngày khác, một ý nghĩ đã đến với tôi và bị mắc kẹt trong tâm trí tôi.

Điều gì là thích hợp hơn, trước tiên hãy kiểm tra xem một giá trị cho một cột duy nhất có tồn tại không, sau đó chèn hoặc chèn và để db tăng lỗi ràng buộc duy nhất? Nó thậm chí sẽ quan trọng?

Chỉnh sửa: Như được đề xuất dưới đây trong câu trả lời rằng vấn đề này phụ thuộc vào cơ sở dữ liệu Tôi đang thêm thẻ postgresql.

Câu trả lời:


3

Tôi không nghĩ rằng câu hỏi của bạn thực sự là cơ sở dữ liệu bất khả tri. Câu trả lời đúng có thể phụ thuộc vào chi tiết triển khai, có thể thay đổi tùy theo nhà cung cấp và nhà cung cấp và thay đổi với phiên bản tiếp theo. Tôi sẽ kiểm tra đồng thời trước khi chọn bất kỳ cách tiếp cận nào trên bất kỳ RDBMS nào.

Ngay bây giờ, trên SQL Server 2008 R2, tôi đang sử dụng như sau:

  1. Đồng thời thấp và số lượng sửa đổi thấp. Để lưu một hàng đơn, tôi tuần tự hóa bằng sp_getapplock và sử dụng MERGE. Tôi nhấn mạnh kiểm tra theo đồng thời cao để xác minh rằng nó hoạt động.

  2. Đồng thời và / hoặc khối lượng cao hơn. Để tránh đồng thời và tăng hiệu suất, tôi không lưu một hàng tại một thời điểm. Tôi tích lũy các thay đổi trên máy chủ ứng dụng của mình và sử dụng TVP để lưu các đợt. Tuy nhiên, để tránh các vấn đề liên quan đến đồng thời, tôi tuần tự hóa bằng cách sử dụng sp_getapplock trước MERGE. Một lần nữa, tôi nhấn mạnh kiểm tra theo đồng thời cao để xác minh rằng nó hoạt động.

Do đó, chúng tôi có hiệu suất tốt và không có vấn đề liên quan đến đồng thời trong sản xuất: không có bế tắc, không vi phạm ràng buộc PK / duy nhất, v.v.


Vì vậy, bạn muốn nói rằng nếu các vấn đề tương tranh được xử lý tốt thì kiểm tra đầu tiên là một ý tưởng tốt?
codecool

1
Có, thường tránh các lỗi thực hiện tốt hơn ném và bắt ngoại lệ, nhưng bạn cần phải đánh giá nó trên nền tảng của mình.
AK

7

Hãy để DB đưa ra một lỗi.

Thử nghiệm trước tiên không an toàn cho đồng thời vì cuối cùng bạn sẽ bị xung đột vì 2 luồng có thể vượt qua "KHÔNG EXIST" và cả hai sẽ cố gắng viết. Điều này áp dụng cho cả chiến lược khóa "ĐỌC CAM KẾT" và MVCC / Ảnh chụp nhanh.

Bạn có thể sử dụng gợi ý khóa để buộc cách ly, nhưng bạn giảm hiệu suất.

Tôi gọi đây là mẫu JFDI (liên kết SO). Để biết "cập nhật nếu tồn tại" thì hãy xem phần này tại đây: Cần trợ giúp Khắc phục sự cố Sql Server 2005 Kịch bản bế tắc . Đây là SQL Server. MySQL có CHỨNG CHỈ IGNORE xử lý việc này một cách duyên dáng. Không chắc chắn về phần còn lại


được rồi Tôi đã không nghĩ về điều đó! Trong trường hợp đồng thời thậm chí kiểm tra có thể thất bại. :)
codecool


Tôi nghĩ sẽ hữu ích khi cả hai thực hiện kiểm tra (và thất bại một cách duyên dáng) nhưng tuân theo câu ngạn ngữ "tin tưởng nhưng xác minh" để nắm bắt thất bại. Nguyên nhân? Xử lý lỗi là tốn kém. Thực tế, tôi đang làm một số bài kiểm tra hôm nay, điều đó sẽ tiết lộ liệu nhận xét này có hợp lý hay không. Nếu bình luận này biến mất, bạn biết kết quả. :-)
Aaron Bertrand

Cũng trong năm 2008 MERGE, có thể giải quyết được những quan sát của Paul nhưng tôi chưa thử nghiệm điều này ở tốc độ tx cao. Chủ yếu là vì tôi chưa đào tạo bộ não của mình để hiểu cú pháp đó.
Aaron Bertrand

1
Mea culpa. Tôi đã thực hiện một số quan sát trong thử nghiệm của tôi ngày hôm nay. Hãy nhớ rằng đây là những thử nghiệm rất cô lập không có sự tương tranh. Đối với chèn thẳng, kiểm tra trước và tránh lỗi nhanh hơn khoảng 10 lần so với để xảy ra lỗi. Nhưng trong các trường hợp khác, bạn sẽ xử lý lỗi phức tạp hơn (TRY / CATCH hoặc IF @@ ERROR <> 0, với ROLLBACK hoặc THWAY, v.v.), hãy chậm hơn gấp đôi nếu bạn kiểm tra trước. Một lần nữa tôi sẽ nhấn mạnh đây chỉ là những quan sát ban đầu của tôi và có nhiều yếu tố có thể ảnh hưởng đến tác động của nó. Có thể mất một thời gian trước khi tôi có thể viết blog về nó một cách kỹ lưỡng.
Aaron Bertrand
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.