2012-05-31 35 views
5

Tôi đang viết một tập lệnh lớn, đầy đủ các câu lệnh cập nhật sẽ chạy hàng ngày. Một số cập nhật này sẽ ảnh hưởng đến các hàng khác.Hiệu suất của Máy chủ SQL - NẾU Chọn + Cập nhật và Cập nhật

Tôi tin rằng báo cáo cập nhật đó sẽ không ảnh hưởng đến bất cứ điều gì không phải là thói quen rất tốt, nhưng câu hỏi của tôi là:

  • Làm thế nào tồi tệ này có thể ảnh hưởng đến hiệu suất ?? Điều này rất khác với việc chọn các câu lệnh và cập nhật chỉ khi chọn tìm nạp một cái gì đó?

Cảm ơn bạn, Tiago

+1

Tùy thuộc vào mức độ phức tạp của mệnh đề 'WHERE'. Câu lệnh 'UPDATE' sẽ phải tìm ra những hàng đầu tiên để cập nhật - hoặc không có gì. Điều này có thể liên quan đến việc quét bảng, nếu bạn thiếu các chỉ mục thích hợp trên bảng đó. Như mọi khi: ** kiểm tra ** và xem nó tệ như thế nào. Tất nhiên nó sẽ là tốt hơn để xác định chỉ những hàng thực sự cần cập nhật - và sau đó cập nhật chỉ những người. Nhưng bao nhiêu nỗ lực là nó để xác định những hàng đó? –

+0

Nỗ lực sẽ liên quan đến rối tung xung quanh với các biến bảng, và không chỉ một hoặc hai ... Tôi đang nói về 20 câu lệnh cập nhật chạy cùng nhau trong một kịch bản và cập nhật các bảng khác nhau. Xét về nỗ lực phát triển sẽ nhiều hơn là chỉ phát triển các báo cáo cập nhật. Về các điều khoản trong bản cập nhật, hầu hết trong số chúng có một hoặc hai tham gia bên trong nhiều nhất và đơn giản là "null" hoặc "<> 0" trong đó các mệnh đề. –

Trả lời

1

Nó phụ thuộc vào cách bạn đang làm cập nhật. Nếu bạn đang cập nhật bằng cách sử dụng cú pháp được kết hợp (tức là)

UPDATE targetTable 
FROM targetTable INNER JOIN sourceTable 

Sau đó, bạn có thể chỉ cần thêm mệnh đề WHERE để chỉ cập nhật hàng nếu giá trị bạn muốn đặt thực sự khác.

Và vâng, nó có thể ảnh hưởng đến hiệu suất, đặc biệt là nếu bạn xem xét rằng một cái gì đó như thế này ...

UPDATE targetTable SET column = column 

... sẽ bắn một kích hoạt đã được xác định trên UPDATE. Tôi không phải là 100% về điều này, nhưng tôi tin rằng điều này cũng làm cho nó vào nhật ký giao dịch bởi vì nó cần phải được duy trì để sao lưu đuôi đăng nhập và các mục tiêu phản chiếu để có thể kết hợp hoàn toàn với chuỗi các sự kiện.

+0

Tôi sẽ nghiên cứu thêm về chủ đề kích hoạt, điểm tốt ở đó! Nhưng tôi không mong đợi nhiều kích hoạt trên bảng này. –

1

Nếu bạn có nghĩa là để hỏi xem có sự khác biệt giữa UPDATE … WHERE conditionSELECT … WHERE the_same_condition + UPDATE … WHERE the_same_condition về hiệu suất, sau đó tôi thà hy vọng sau này trở thành ít hiệu quả so với trước đây. Cho dù đó là UPDATE hoặc SELECT, các hàng vẫn sẽ phải được tìm ra và với sơ bộ SELECT … WHERE … chúng sẽ phải được tìm ra hai lần nếu có lần truy cập.

Nhưng @Matt Whitfield has got a point về trình kích hoạt. Nếu có kích hoạt khi cập nhật, nó sẽ kích hoạt bất kể có hàng nào được cập nhật hay không. Và nếu có gì đó, kích hoạt sẽ ngay cả khi không có hàng nào được cập nhật (và bạn muốn tránh điều đó), sau đó viết lại trình kích hoạt của bạn hoặc, vâng, đi theo phương pháp SELECT + UPDATE.

+0

Vâng đó là câu hỏi của tôi, và từ những bình luận tôi nhận được ở đây tôi rất quan tâm đến cách tiếp cận chỉ cập nhật. Chỉ cần kiểm tra xem bảng nào có trình kích hoạt khi cập nhật và xem hành vi trên các bảng đó. Cảm ơn! –

3

Đầu tiên và trước hết, CHỌN theo sau là CẬP NHẬT hầu như luôn luôn không chính xác theo đồng thời. Trừ khi mọi thứ chạy dưới mức cô lập SERIALIZABLE, không có gì đảm bảo rằng các hàng không thay đổi giữa số SELECT và UPDATE.

Thứ hai, đối với các trường hợp khi có hàng cần cập nhật, chi phí SELECT + CẬP NHẬT theo định nghĩa cao hơn chỉ là CẬP NHẬT.

Và cuối cùng, đối với trường hợp khi có không phải là hàng để cập nhật chi phí định vị chúng bằng UPDATE thường giống như chi phí định vị chúng bằng SELECT, vì vậy bạn không đạt được gì. Tôi nói 'thường', không phải 'luôn luôn', bởi vì trình tối ưu hóa truy vấn có thể xem xét các chiến lược khác nhau để cập nhật so với chọn và quét để cập nhật diễn ra theo các quy tắc khóa (concurrency) khác với quét để đọc.

Điều có thể có ý nghĩa là có một SELECT rất rẻ có thể tránh được CẬP NHẬT đắt tiền, ngay cả khi không chính xác 100%. Các điều kiện giữa SELECT và UPDATE có thể thay đổi cực kỳ miễn là bạn không nhận được bất kỳ sai âm (SELECT nói không nên có bất kỳ hàng nào nhưng UPDATE sẽ tìm thấy hàng, nó đã được chạy) và số lượng false tích cực là thấp (SELECT nói có hàng, nhưng kiểm tra UPDATE chính xác hơn/đắt tiền không thực sự tìm thấy bất kỳ).

Cuối cùng, đây là vấn đề tối ưu hóa và tất cả các câu hỏi tối ưu hóa bắt đầu bằng cách đo. Đầu tiên xác định vị trí UPDATE tốn kém và sau đó bắt đầu sửa đổi.

Các vấn đề liên quan