Cải thiện tốc độ xây dựng lại chỉ mục trên máy chủ SQL


9

Tôi đang nhập một lượng lớn dữ liệu vào cơ sở dữ liệu trống và trước khi bắt đầu, tôi đã vô hiệu hóa tất cả các chỉ mục không phân cụm không duy nhất để xem liệu tôi có thể cải thiện hiệu suất của việc nhập không.

Bây giờ tôi muốn kích hoạt lại các chỉ mục và tôi tự hỏi liệu tôi có thể làm gì để tối ưu hóa điều này không.

Có> 100 bảng và gần 2.000 chỉ mục sẽ được xây dựng lại. Cơ sở dữ liệu có kích thước 200GB.

Phần chính của tập lệnh tôi đang chạy là đây:

declare c_toggle_index cursor FORWARD_ONLY READ_ONLY for
    select  'alter index ' + QUOTENAME(i.name) + ' on ' + o.name + ' rebuild'
    from    sys.indexes as i
    Inner Join sys.objects o
    On o.object_id = i.object_id
    Where o.is_ms_shipped = 0
    And i.index_id >= 1
    and i.type > 1
    and i.is_disabled = 1

Tôi đã xem xét cài đặt ONLINE = OFF cho câu lệnh thay đổi chỉ mục, nhưng khi các chỉ mục bắt đầu bị vô hiệu hóa, tôi không chắc rằng cài đặt này sẽ có bất kỳ ảnh hưởng nào. Tôi cũng đã xem xét việc thiết lập SORT_IN_TEMPDB = ON, nhưng vì các tệp tempdb nằm trên cùng ổ đĩa với các tệp .mdf của cơ sở dữ liệu nên tôi cho rằng cũng không có lợi ích gì khi làm điều đó.

Trong khi chạy tập lệnh xây dựng lại, tôi nhận thấy rằng tôi có rất nhiều kiểu chờ CXPACKET. Tôi thực sự không hiểu tại sao điều đó sẽ xảy ra hoặc nếu đó là vấn đề mà tôi nên tìm cách giải quyết.

Một điểm cuối cùng có thể có liên quan: toàn bộ máy chủ của tôi hiện không hoạt động ngoài việc nhập dữ liệu này vào cơ sở dữ liệu. Không có hoạt động người dùng khác để xem xét hoặc lo lắng về; mối quan tâm duy nhất của tôi là nhập dữ liệu vào cơ sở dữ liệu trong thời gian ngắn nhất.


3
Khi bạn nói rằng mối quan tâm duy nhất của bạn là thời gian nhập, bạn có nghĩa là thời gian từ khi bắt đầu nhập đến khi kết thúc kích hoạt lại các chỉ mục? Nếu vậy, bạn chỉ nên để các chỉ mục được kích hoạt trong quá trình nhập. 2.000 chỉ mục cho dữ liệu 200GB nghe có vẻ như rất nhiều chỉ mục đối với tôi. Có lẽ bạn nên xem xét các DMV sử dụng chỉ mục để xem liệu có một số có thể được gỡ bỏ.
Max Vernon

1
Chỉ cần làm rõ, bạn cần phải thực hiện nhập 200GB tương tự nhiều lần, và không chỉ một lần?
Jon Seigel

1
Tôi chỉ cần thực hiện nhập một lần nhưng là một phần của quy trình lớn hơn với thời gian giới hạn, vì vậy tôi hiện đang thử nghiệm quy trình đó để làm cho nó phù hợp với cửa sổ đó. @MaxVernon Có vẻ như bạn đúng khi để các chỉ mục được kích hoạt là cách nhanh nhất, mặc dù tôi ngạc nhiên khi tôi đọc rằng thông thường nhanh hơn để vô hiệu hóa các chỉ mục, nhập dữ liệu, sau đó kích hoạt lại các chỉ mục. Đây là cơ sở dữ liệu của bên thứ ba nên việc xóa chỉ mục hoặc thay đổi nó là không thực sự có thể.
paulH

3
Được chứ. Về sự CXPACKETchờ đợi: chỉ mục tự xây dựng lại các chỉ mục quét (ngay cả chỉ mục đang được xây dựng lại ) và những lần quét đó có thể sử dụng song song. Bạn không nên quan tâm đến những chờ đợi đó - sự song hành có thể giúp ích.
Jon Seigel

Câu trả lời:


10

Để đạt được hiệu suất nhập tối ưu trong kịch bản này cần có ba điều:

  1. Chèn bảng cơ sở tối thiểu
  2. Xây dựng chỉ mục không đăng nhập tối thiểu
  3. Tránh đọc vật lý

Ghi nhật ký tối thiểu

Để đạt được các bản ghi được ghi tối thiểu vào một bảng được phân cụm trống mà không có các chỉ mục không được bao gồm yêu cầu:

  1. Sử dụng mô hình phục hồi SIMPLEhoặc BULK_LOGGEDcơ sở dữ liệu
  2. Chỉ định khóa bảng và nhập liệu theo thứ tự (ví dụ TABLOCKORDERgợi ý)

Lưu ý bên:

Cũng có thể đạt được các bản ghi được ghi lại tối thiểu vào một bảng được nhóm có các chỉ mục không được cung cấp với cờ theo dõi 610 được bật. Việc chèn chỉ mục không bao gồm có được ghi lại tối thiểu hay không phụ thuộc vào gói truy vấn được chọn bởi trình tối ưu hóa truy vấn.

Nếu kế hoạch truy vấn sử dụng một trình vòng lặp riêng cho chỉ mục không được bao gồm trình lặp đó có thuộc DMLRequestSorttính được đặt thành true, các chèn chỉ mục không được bao gồm sẽ được ghi lại tối thiểu, với điều kiện các điều kiện khác được đề cập trước đó được đáp ứng.

Xây dựng các chỉ mục không bao gồm riêng

Những lợi thế của việc này là:

  1. Chèn chỉ mục được nhóm có thể được ghi lại tối thiểu mà không cần bật TF 610
  2. CREATE INDEX được ghi lại tối thiểu nếu mô hình phục hồi không FULL

Tránh đọc vật lý

Lý tưởng nhất là dữ liệu được nhập sẽ được lưu trữ trên một máy riêng biệt hoặc ít nhất là trên bộ lưu trữ vật lý riêng biệt với dữ liệu được sử dụng để lưu trữ cơ sở dữ liệu.

Máy chủ cơ sở dữ liệu phải có đủ bộ nhớ để giữ bảng cơ sở lớn nhất trong bộ đệm, còn lại đủ để sắp xếp các hoạt động cần thiết khi xây dựng các chỉ mục không bao gồm.

Một mô hình tốt là tải nhanh bảng cơ sở (tải chỉ mục được nhóm tối thiểu được ghi lại) và sau đó xây dựng tất cả các chỉ mục không bao gồm cho bảng đó trong khi các trang dữ liệu của nó vẫn được lưu trữ.

Câu hỏi phác thảo một quy trình theo đó các bảng cơ sở được tải trước, và sau đó các chỉ mục không bao gồm được xây dựng. Định nghĩa con trỏ không sử dụng một ORDER BYmệnh đề để ít nhất nhóm các chỉ mục không được xây dựng trên cùng một bảng.

Kết quả có khả năng là các trang dữ liệu cho các bảng khác nhau được đọc liên tục vào bộ đệm và sau đó bị loại bỏ vì các chỉ mục không được bao gồm được xây dựng theo thứ tự không xác định.

Chi phí của việc đọc vật lý lặp đi lặp lại hoàn toàn chi phối lợi ích của việc ghi nhật ký tối thiểu có được bằng cách xây dựng các chỉ mục không bao gồm riêng biệt. Điều này giải thích tại sao bạn thấy rằng việc tải các bảng với các chỉ mục hiện có nhanh hơn (bởi vì tất cả các chỉ mục không bao gồm cho một bảng đã cho đều được duy trì trước khi chuyển sang bảng tiếp theo).

Tóm lược

Quá trình nhập nên được làm lại để tải hàng loạt một bảng tại một thời điểm. Điều này có nghĩa là tải bảng và xây dựng tất cả các chỉ mục không bao gồm trước khi chuyển sang bảng tiếp theo. Phiên bản SQL Server phải có đủ bộ nhớ để giữ bảng lớn nhất thực hiện sắp xếp chỉ mục không chứa lớn nhất cùng một lúc.

Bạn cũng có thể thử bật TF 610 trước khi tải dữ liệu vào các bảng với các chỉ mục chưa được đặt sẵn. Điều này thường không nhanh như phương pháp trước, nhưng nó có thể đủ nhanh.

Xem phần sau để biết thêm thông tin:

Hướng dẫn hiệu suất tải dữ liệu

Các hoạt động có thể được ghi lại tối thiểu

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.