2008-12-08 46 views
7

Trong một bình luận tôi đọcsố lượng lớn chèn có hoặc không có chỉ số

Cũng giống như một mặt lưu ý, đôi khi nhanh hơn để thả các chỉ số của bảng của bạn và tạo lại chúng sau khi phẫu thuật chèn số lượng lớn.

Điều này có đúng không? Trong hoàn cảnh nào?

Trả lời

7

Giống như với Joel, tôi sẽ lặp lại tuyên bố rằng có thể điều đó có thể đúng. Tôi đã thấy rằng chìa khóa để xác định kịch bản mà ông đã đề cập là tất cả trong phân phối dữ liệu và kích thước của chỉ mục mà bạn có trên bảng cụ thể. Trong một ứng dụng mà tôi đã sử dụng để hỗ trợ đã thực hiện nhập hàng loạt thường xuyên 1,8 triệu hàng, với 4 chỉ mục trên bàn, 1 với 11 cột và tổng số 90 cột trong bảng. Quá trình nhập với chỉ mục mất hơn 20 giờ để hoàn thành. Việc giảm chỉ mục, chèn và tạo lại các chỉ mục chỉ mất 1 giờ và 25 phút.

Vì vậy, đó có thể là một trợ giúp lớn, nhưng phần lớn dữ liệu này đi kèm với dữ liệu của bạn, chỉ mục và phân phối giá trị dữ liệu.

+0

Tôi nghĩ trong trường hợp của chúng tôi, phần lớn trong số đó là chúng tôi luôn bắt đầu với một bảng trống và dữ liệu hàng loạt được sắp xếp theo thứ tự cụm. Do đó không có thêm nhiều công việc đang diễn ra. –

+0

Ah vâng, đó sẽ là một phần tốt của nó. Chúng tôi luôn bắt đầu với một bảng trống, nhưng dữ liệu đầu vào là tất cả các nơi! –

6

Vâng, đó là sự thật. Khi có các chỉ mục trên bảng trong khi chèn, máy chủ sẽ cần phải liên tục sắp xếp lại/phân trang bảng để giữ cho các chỉ mục được cập nhật. Nếu bạn thả các chỉ mục, nó chỉ có thể thêm các hàng mà không phải lo lắng về điều đó, và sau đó xây dựng các chỉ mục cùng một lúc khi bạn tạo lại chúng.


Ngoại lệ, tất nhiên, là khi dữ liệu nhập đã có thứ tự chỉ mục. Trong thực tế, tôi nên lưu ý rằng tôi đang làm việc trên một dự án ngay bây giờ, nơi hiệu ứng ngược lại này đã được quan sát. Chúng tôi muốn giảm thời gian chạy của một lần nhập khẩu lớn (bãi thải hàng đêm từ một hệ thống máy tính lớn). Chúng tôi đã thử xóa các chỉ mục, nhập dữ liệu và tạo lại chúng. Thực tế, đã tăng đáng kể thời gian để quá trình nhập hoàn tất. Nhưng, đây không phải là điển hình. Nó chỉ đi để cho thấy rằng bạn nên luôn luôn kiểm tra đầu tiên cho hệ thống cụ thể của bạn.

+0

Việc chèn dữ liệu mới vào bảng tạm thời và sau đó thực hiện một cái gì đó như INSERT INTO TABLE x (SELECT * FROM y) có phải là giải pháp khả thi không? Tùy thuộc vào DB, có thể có một số chỉ số tối ưu hóa liên quan - hoặc có lẽ tôi đang waay ra khỏi nhãn hiệu –

+0

Không, bởi vì sau đó bạn đang làm hai chèn. Tất nhiên, tình hình của bạn có thể thay đổi, nhưng nói chung điều này sẽ không giúp ích gì. –

+0

Tuyệt vời - đó chỉ là một ý nghĩ. –

2

Một điều bạn nên xem xét khi thả và tạo lại chỉ mục là nó chỉ nên được thực hiện trên các quy trình tự động chạy trong thời gian sử dụng cơ sở dữ liệu thấp. Mặc dù chỉ mục bị xóa, chỉ mục này không thể được sử dụng cho các truy vấn khác mà người dùng khác có thể đang xáo trộn cùng một lúc. Nếu bạn làm điều này trong giờ sản xuất, người dùng của bạn có thể sẽ bắt đầu phàn nàn về thời gian chờ.

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