2008-09-03 42 views
17

Tôi có một bảng có nhiều hơn một hàng triệu. Bảng này được sử dụng để lập chỉ mục tiff hình ảnh. Mỗi hình ảnh có các trường như date, number, v.v. Tôi có người dùng lập chỉ mục các hình ảnh này theo lô là 500. Tôi cần biết liệu đầu tiên có chèn 500 hàng hay không và sau đó thực hiện 500 cập nhật hoặc khi người dùng kết thúc lập chỉ mục, làm 500 chèn với tất cả dữ liệu. Một điều rất quan trọng là nếu tôi làm 500 lần đầu tiên, lần này là miễn phí đối với tôi bởi vì tôi có thể làm điều đó vào đêm hôm trước.Chi phí Chèn và Cập nhật trong SQL Server

Vì vậy, câu hỏi đặt ra là: tốt hơn là nên chèn hoặc chèn và cập nhật và tại sao? Tôi đã xác định giá trị id cho mỗi hình ảnh và tôi cũng có các chỉ mục khác trên các trường.

Trả lời

25

Cập nhật trong máy chủ Sql dẫn đến các hàng bị mờ - nghĩa là Sql chuyển một hàng ra và đặt một hàng mới vào. Hàng bị gạch chéo sẽ bị xóa sau.

Cả hai lần chèn và cập nhật có thể gây ra phân tách trang theo cách này, cả hai có hiệu quả 'thêm' dữ liệu, nó chỉ là bản cập nhật gắn cờ công cụ cũ ra đầu tiên.

Ngày đầu các bản cập nhật này cần tìm kiếm hàng đầu tiên, cho nhiều dữ liệu có thể mất nhiều thời gian hơn bản cập nhật.

Chèn sẽ chỉ về luôn luôn nhanh hơn, đặc biệt nếu chúng theo thứ tự hoặc nếu bảng bên dưới không có chỉ mục nhóm.

Khi chèn số lượng lớn dữ liệu vào bảng xem xét các chỉ mục hiện tại - có thể mất một lúc để thay đổi và tạo. Việc thêm giá trị ở giữa chỉ mục luôn chậm hơn.

Bạn có thể nghĩ về nó như phụ thêm vào sổ địa chỉ: Ông Z chỉ có thể được thêm vào trang cuối cùng, trong khi bạn sẽ phải tìm khoảng trống ở giữa cho ông M.

1

Tôi không phải là một chàng trai cơ sở dữ liệu, nhưng tôi tưởng tượng thực hiện chèn trong một lần sẽ nhanh hơn vì các bản cập nhật yêu cầu tra cứu trong khi chèn không.

+0

Giovanni, nó cũng sẽ phụ thuộc vào các vấn đề khác như lập chỉ mục (nhóm hoặc không nhóm) và hệ số lấp đầy. Tình hình cụ thể của bạn sẽ đóng góp phần lớn vào cách bạn tiến hành. – Galwegian

2

Thực hiện chèn lần đầu tiên và sau đó cập nhật dường như là ý tưởng tốt hơn vì nhiều lý do. Bạn sẽ được chèn vào thời điểm khối lượng giao dịch thấp. Vì chèn có nhiều dữ liệu hơn, đây là thời điểm tốt hơn để thực hiện.

Vì bạn đang sử dụng giá trị id (có thể được lập chỉ mục) để cập nhật, chi phí cập nhật sẽ rất thấp. Bạn cũng sẽ có ít dữ liệu hơn trong khi cập nhật.

Bạn cũng có thể tắt các giao dịch ở mức hàng loạt (500 lần chèn/cập nhật) và sử dụng nó cho từng bản ghi riêng lẻ, do đó giảm một số chi phí.

Cuối cùng, hãy thử nghiệm điều này để xem hiệu suất thực tế trên máy chủ của bạn trước khi đưa ra quyết định cuối cùng.

1

Kế hoạch thực hiện cho mỗi truy vấn sẽ cho bạn biết giá trị nào sẽ đắt hơn. Các yếu tố hạn chế thực sự sẽ được ghi vào đĩa, vì vậy bạn có thể cần phải chạy một số thử nghiệm trong khi chạy perfmon để xem truy vấn nào gây ra nhiều ghi và gây ra hàng đợi đĩa để có được dài nhất (còn là xấu).

1

Đây không phải là câu hỏi được cắt và khô. Điểm của Krishna và Galegian là điểm trên.

Để cập nhật, tác động sẽ bị giảm bớt nếu các cập nhật ảnh hưởng đến các trường có độ dài cố định. Nếu cập nhật các trường varchar hoặc blob, bạn có thể thêm chi phí phân tách trang trong khi cập nhật khi giá trị mới vượt quá độ dài của giá trị cũ.

1

Tôi nghĩ rằng chèn sẽ chạy nhanh hơn. Chúng không yêu cầu tra cứu (khi bạn thực hiện cập nhật, về cơ bản bạn sẽ làm tương đương với lựa chọn với mệnh đề where). Ngoài ra, chèn sẽ không khóa các hàng theo cách cập nhật, vì vậy nó sẽ không can thiệp vào bất kỳ lựa chọn nào đang xảy ra đối với bảng cùng một lúc.

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