2008-08-26 33 views
14

Tôi có một sproc mà đặt 750K hồ sơ vào một bảng tạm thời thông qua một truy vấn như là một trong những hành động đầu tiên của nó. Nếu tôi tạo chỉ mục trên bảng tạm thời trước khi điền vào, mục sẽ mất gấp đôi thời gian để chạy so với khi tôi lập chỉ mục sau khi điền bảng. (Chỉ mục là một số nguyên trong một cột, bảng được lập chỉ mục chỉ là hai cột mỗi một số nguyên.)Tại sao SQL Server hoạt động nhanh hơn khi bạn lập chỉ mục một bảng sau khi điền vào bảng?

Điều này có vẻ hơi khó khăn đối với tôi, nhưng sau đó tôi không hiểu rõ nhất trên dưới mui xe. Có ai có câu trả lời cho việc này không?

Trả lời

1

này là vì nếu các dữ liệu bạn chèn không có trong thứ tự của các chỉ số, SQL sẽ phải chia trang để nhường chỗ cho hàng bổ sung để giữ chúng lại với nhau một cách logic

2

Bạn nên NEVER EVER tạo một chỉ mục trên một cái bàn trống nếu bạn định tải nó ngay sau đó. Chỉ số phải được duy trì khi dữ liệu trên bảng thay đổi, vì vậy hãy tưởng tượng như thể cho mỗi lần chèn trên bảng, chỉ mục đã được tính toán lại (đó là một hoạt động tốn kém). Nạp bảng đầu tiên và tạo chỉ mục sau khi kết thúc với tải. Đó là sự khác biệt hiệu suất đang diễn ra.

2

Sau khi thực hiện thao tác thao tác dữ liệu lớn, bạn thường xuyên phải cập nhật các chỉ mục cơ bản. Bạn có thể làm điều đó bằng cách sử dụng câu lệnh UPDATE STATISTICS [table].

Tùy chọn khác là thả và tạo lại chỉ mục, nếu bạn đang thực hiện chèn dữ liệu lớn, có khả năng sẽ thực hiện chèn nhanh hơn nhiều. Bạn thậm chí có thể kết hợp nó vào thủ tục lưu trữ của bạn.

41

Nếu bạn tạo chỉ mục nhóm, nó sẽ ảnh hưởng đến cách dữ liệu được sắp xếp vật lý trên đĩa. Tốt hơn là thêm chỉ mục sau thực tế và để cho công cụ cơ sở dữ liệu sắp xếp lại các hàng khi nó biết cách phân phối dữ liệu.

Ví dụ: giả sử bạn cần xây dựng một bức tường gạch có gạch đánh số để những người có số cao nhất ở dưới cùng của bức tường. Nó sẽ là một nhiệm vụ khó khăn nếu bạn chỉ được giao các viên gạch theo thứ tự ngẫu nhiên, mỗi lần một - bạn sẽ không biết gạch nào sẽ trở thành số được đánh số cao nhất, và bạn phải xé tường và xây dựng lại nó nhiều lần. Sẽ dễ dàng hơn nhiều khi xử lý công việc đó nếu bạn có tất cả các viên gạch xếp hàng trước mặt bạn và có thể tổ chức công việc của bạn.

Đó là cách nó dành cho công cụ cơ sở dữ liệu - nếu bạn cho nó biết về toàn bộ công việc, nó có thể hiệu quả hơn nhiều nếu bạn chỉ cho nó ăn hàng tại một thời điểm.

+2

Ví dụ rất tốt +1 –

+0

Tương tự tuyệt vời, cảm ơn! –

6

Đó là vì máy chủ cơ sở dữ liệu phải thực hiện các phép tính mỗi khi bạn chèn một hàng mới. Về cơ bản, bạn kết thúc việc lập lại bảng mỗi lần. Nó không có vẻ là một hoạt động rất tốn kém, và nó không phải, nhưng khi bạn làm điều đó nhiều người trong số họ lại với nhau, bạn bắt đầu thấy tác động. Đó là lý do tại sao bạn thường muốn lập chỉ mục sau khi bạn đã điền các hàng của mình, vì nó sẽ chỉ là chi phí một lần.

1

Điều này do thực tế là khi SQL Server lập chỉ mục bảng với dữ liệu, nó có thể tạo ra các số liệu thống kê chính xác về các giá trị trong cột được lập chỉ mục. Tại một số thời điểm SQL Server sẽ tính toán lại số liệu thống kê, nhưng khi bạn thực hiện chèn lớn việc phân phối các giá trị có thể thay đổi sau khi thống kê được tính toán lần trước.

Thực tế là thống kê đã lỗi thời có thể được phát hiện trên Trình phân tích truy vấn. Khi bạn thấy rằng trên một số bảng nhất định, số hàng dự kiến ​​sẽ khác với số lượng hàng thực tế được xử lý.

Bạn nên sử dụng UPDATE STATISTICS để tính toán lại phân phối giá trị sau khi bạn chèn tất cả dữ liệu. Sau đó không có sự khác biệt hiệu suất cần được quan sát.

3

Hãy suy nghĩ theo cách này.

Với
unorderedList = {5, 1,3}
orderedList = {1,3,5}

thêm 2 để cả hai danh sách.
unorderedList = {5, 1,3,2}
orderedList = {1,2,3,5}

danh sách Những gì bạn nghĩ là dễ dàng hơn để thêm vào?

Btw đặt hàng đầu vào của bạn trước khi tải sẽ giúp bạn tăng cường.

1

Nếu bạn có chỉ mục trên bảng, khi bạn thêm dữ liệu vào bảng, SQL Server sẽ phải sắp xếp lại bảng để đặt chỗ ở vị trí thích hợp cho bản ghi mới. Nếu bạn đang thêm nhiều dữ liệu, nó sẽ phải sắp xếp lại nó nhiều lần. Bằng cách tạo chỉ mục chỉ sau khi dữ liệu được tải, đơn đặt hàng lại chỉ cần xảy ra một lần.

Tất nhiên, nếu bạn đang nhập các bản ghi theo thứ tự chỉ mục, nó không quan trọng quá nhiều.

1

Ngoài chi phí trên chỉ mục, chạy mỗi truy vấn dưới dạng giao dịch là một ý tưởng tồi vì cùng một lý do. Nếu bạn chạy khối chèn (nói 100) trong 1 giao dịch rõ ràng, bạn cũng sẽ thấy hiệu suất tăng lên.

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