Khi nào nên bỏ chỉ mục và tái tạo?


9

Chúng tôi đang xây dựng một kho dữ liệu ban đầu sẽ là 1 TB và sẽ tăng khoảng 20gigs mỗi tháng.

Đối với các bảng nhất định, chúng tôi đang thực hiện các quy trình ETL hàng ngày và các bảng khác chúng tôi đang thực hiện hàng tuần / hàng tháng.

Khi có một nhập dữ liệu đi vào một bảng, có cần thiết phải bỏ và tạo lại các chỉ mục không?

Có bao giờ có một điểm để giảm và tạo lại các chỉ mục hoặc chúng được tự động cập nhật?

Các số liệu thống kê được thiết lập để cập nhật tự động.

Cảm ơn bạn rất nhiều vì sự giúp đỡ và hướng dẫn của bạn.

Tôi có kịch bản thiên tài này:

SELECT 'ALTER INDEX [' + ix.name + '] ON [' + s.name + '].[' + t.name + '] ' +
       CASE WHEN ps.avg_fragmentation_in_percent > 40 THEN 'REBUILD' ELSE 'REORGANIZE' END +
       CASE WHEN pc.partition_count > 1 THEN ' PARTITION = ' + cast(ps.partition_number as nvarchar(max)) ELSE '' END
FROM   sys.indexes AS ix INNER JOIN sys.tables t
           ON t.object_id = ix.object_id
       INNER JOIN sys.schemas s
           ON t.schema_id = s.schema_id
       INNER JOIN (SELECT object_id, index_id, avg_fragmentation_in_percent, partition_number
                   FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL, NULL)) ps
           ON t.object_id = ps.object_id AND ix.index_id = ps.index_id
       INNER JOIN (SELECT object_id, index_id, COUNT(DISTINCT partition_number) AS partition_count
                   FROM sys.partitions
                   GROUP BY object_id, index_id) pc
           ON t.object_id = pc.object_id AND ix.index_id = pc.index_id
WHERE  ps.avg_fragmentation_in_percent > 10 AND
       ix.name IS NOT NULL

từ đây:

http://weblogs.asp.net/okloeten/archive/2009/01/05/6819737.aspx

Bạn có đề nghị tôi chạy tập lệnh này hàng ngày và dựa trên những phát hiện chạy mã được tạo không?


Tôi sẽ rất biết ơn nếu ai đó giải thích cho tôi vấn đề với câu hỏi của tôi
l --''''''--------- '' '' '' '' '' '' '

Đây là một câu hỏi liên quan mà tôi đã hỏi. dba.stackexchange.com/questions/11389/ Từ Kiến thức mà tôi có được từ câu hỏi này và câu trả lời đã dạy tôi rất nhiều và chúng tôi đã nhận ra những lợi ích to lớn nhờ nó.
swasheck

Câu trả lời:


13

Nếu đây là ETL theo chu kỳ và bạn đang ở trong môi trường dữ liệu phát triển (tức là KHÔNG SỐNG), thì bạn chắc chắn nên quản lý các chỉ mục của mình như một phần của chu kỳ tải.

Tôi làm điều này cho một số bộ dữ liệu mỗi tháng, bộ lớn nhất trong đó thêm khoảng 100 GB hàng tháng vào bộ dữ liệu 5 TB.

Tôi đã thực hiện thử nghiệm rộng rãi và từ kinh nghiệm của bản thân, cách hiệu quả nhất để tải liên quan đến các chỉ mục là:

  1. DISABLE chỉ mục không phân cụm, giữ nguyên chỉ mục cụm
  2. Thực hiện tải nguyên vào bảng dữ liệu của bạn
  3. REBUILD Chỉ số NC

Nếu bạn chỉ thêm các hàng theo định kỳ như một phần của ETL được quản lý, đây là cách để đi. Điều này cũng đảm bảo tất cả các số liệu thống kê của bạn được cập nhật.

Đối với số liệu thống kê, điều quan trọng cần lưu ý là việc thêm 20GB vào cơ sở dữ liệu 1TB sẽ không đạt đến điểm bùng phát cho cập nhật tự động thống kê, do đó bạn có thể thêm cả tháng dữ liệu mà không cần cập nhật thống kê.

Xây dựng lại các chỉ số NC của bạn là một cách tốt xung quanh điều này. Bạn cũng có thể muốn thực hiện xây dựng lại một chỉ mục theo cụm nếu phân mảnh tăng cao (tùy thuộc vào cấu trúc bảng và khóa cụm của bạn).


4
Bạn cũng có thể cập nhật các số liệu thống kê như một phần riêng biệt trong quy trình của mình, được trộn lẫn giữa các bản dựng lại NC nếu việc đó thường quá tốn kém.
Aaron Bertrand

1

Đối với cơ sở dữ liệu 1TB +, việc bỏ và tạo chỉ mục hàng ngày sẽ là quá mức cần thiết (ngay cả khi bạn chỉ tạo lại một số trong số chúng).

Nếu bạn lo lắng về tốc độ chèn / cập nhật trong bảng do chi phí được thêm bởi các cập nhật chỉ mục, thì tôi khuyên bạn nên hai điều:

  1. Sử dụng PK thay thế để chèn chỉ mục được nhóm sẽ có chi phí tối thiểu.
  2. Hồ sơ DWH của bạn và tạo các chỉ mục không phân cụm khi thực sự cần thiết.

Bạn sẽ phải sống với các cập nhật chỉ mục không được nhóm trong các hoạt động chèn / cập nhật.

Nếu bạn lo lắng về sự phân mảnh chỉ mục, thì tôi khuyên bạn nên tạo công việc hàng ngày (công việc Tác nhân SQL) để xây dựng lại các chỉ mục. Thời gian xây dựng lại thực sự có thể là bất cứ điều gì, phụ thuộc vào mức độ phân mảnh. Bạn nên chú ý điều này trong thực tế và thiết lập lịch trình công việc phù hợp.

Bạn có thể thêm một số logic để xây dựng lại các tập lệnh, tùy thuộc vào mức độ phân mảnh. Một số hướng dẫn tốt bạn có thể tìm thấy ở đây .

Điểm mấu chốt là trong mọi trường hợp, bạn không nên xây dựng lại chỉ mục đầy đủ trên cơ sở dữ liệu có kích thước đó.


6
Tôi phải không đồng ý với rất nhiều điều này. Nó sẽ phụ thuộc vào trường hợp sử dụng của anh ta, nhưng dòng cuối cùng under any circumstances you shouldn't do a full index rebuild on a database of that size.không chính xác chút nào. Tôi làm ETL trên các cơ sở dữ liệu rất lớn như nhiệm vụ chính của mình và tôi thấy lợi ích rất lớn từ việc vô hiệu hóa và xây dựng lại các chỉ mục.
JNK

1
Tôi muốn điều này áp dụng trong trường hợp của tôi quá. Trên cơ sở dữ liệu hơn 1TB chạy trên môi trường sản xuất, tôi hầu như không đủ khả năng để thực hiện xây dựng lại chỉ mục không phân cụm hàng đêm cho một số bảng với hơn 500 triệu. hàng. Tôi có một số quy trình ETL chạy mỗi đêm và bước cuối cùng tôi làm từ 3:00 sáng là xây dựng lại các chỉ mục.
Marcel N.

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.