Là phân mảnh mức độ cao là một vấn đề?


7
DBCC SHOWCONTIG scanning 'MyTable' table...
Table: 'MyTable' (2048062382); index ID: 1, database ID: 28
TABLE level scan performed.
- Pages Scanned................................: 1019182
- Extents Scanned..............................: 127400
- Extent Switches..............................: 127399
- Avg. Pages per Extent........................: 8.0
- Scan Density [Best Count:Actual Count].......: 100.00% [127398:127400]
- Logical Scan Fragmentation ..................: 0.01%
- Extent Scan Fragmentation ...................: 77.25%
- Avg. Bytes Free per Page.....................: 135.7
- Avg. Page Density (full).....................: 98.32%

Tôi đã đọc được rằng Mật độ quét = 100% là rất tốt và Phân đoạn quét logic <1% cũng rất tuyệt. 77% Extent Scan Fragment làm phiền tôi, nhưng internet nói bỏ qua nó.

Tôi đang phân tích một truy vấn thực hiện chậm một bảng. Nó chạy ~ 30 giây trong lần thực hiện đầu tiên, sau đó 200 ms cho lần thực hiện thứ hai và tiếp theo. Tôi có thể thiết lập lại hành vi này với DBCC DROPCLEANBUFFERS.

Là phân mảnh quét mở rộng cao là một đầu mối quan trọng?

(Nếu không, tôi có thể sẽ thêm một câu hỏi khác về truy vấn một bảng của tôi).


Phiên bản nào của máy chủ sql bạn đang sử dụng? Số lượng hàng của bảng mà bạn đang kiểm tra mức độ phân mảnh là gì?
Kin Shah

phân mảnh phạm vi được gọi là phân mảnh "bên ngoài" và nó xảy ra khi các phạm vi trong một chỉ mục không liền kề .. Ảnh hưởng đến việc đọc nhưng không nhiều. Tùy thuộc vào số lượng hàng và số lượng trang, nó có thể ảnh hưởng đến hiệu suất. Nếu bảng có ít hơn 1000 trang, thì ngay cả khi bạn xây dựng lại chỉ mục, nó sẽ không giúp được gì nhiều
Kin Shah

@Kin ...depending on the row count and number of pages...các loại truy vấn đang được chạy ... ngay cả khi bạn thực hiện quét toàn bộ bảng, không có khả năng nó sẽ ảnh hưởng đến hiệu suất nhiều, nhưng đối với các mẫu truy vấn điển hình hơn thì tốt nhất là không đáng kể. Ít nhất là trong kinh nghiệm của tôi.
Aaron Bertrand

1
Đi từ "Nó chạy ~ 30 giây trong lần thực hiện đầu tiên, sau đó 200 ms vào lần thứ hai", tôi muốn nói rằng lần thực hiện thứ 2 nhanh vì dữ liệu được lưu trữ. Bây giờ, nếu bạn muốn tập trung tốt hơn vào việc sửa truy vấn đó, tôi muốn nói rằng bạn cần cho chúng tôi xem lược đồ bảng (bao gồm các chỉ mục), chính truy vấn và kế hoạch thực hiện của truy vấn (thực tế, không phải ước tính). Bạn cũng có thể sử dụng SQL Explorer của Plan Sentry để tạo kế hoạch thực và tải nó lên đây.
Mary

@Kin SqlServer2012. 34,530,707 hàng, dữ liệu 8,153,456 KB.
Amy B

Câu trả lời:


9

Theo kinh nghiệm của tôi, ngay cả khi bạn thực hiện quét toàn bộ bảng, không có khả năng phân mảnh phạm vi sẽ ảnh hưởng nhiều đến hiệu suất và đối với các mẫu truy vấn điển hình hơn thì tốt nhất là không đáng kể. Đó là đối với các truy vấn sử dụng dữ liệu được lưu trong bộ nhớ cache phù hợp với bộ nhớ - rõ ràng sự phân mảnh của bất kỳ loại nào sẽ trở nên khá khó khăn nếu dữ liệu nằm trong bộ nhớ và không được đọc trực tiếp khỏi đĩa.

Bây giờ, bạn đã có một bảng> 8 GB, vì vậy có thể phân mảnh phạm vi có thể gây hại cho các truy vấn của bạn. Nếu truy vấn này đang sử dụng quét bảng trên 34 triệu hàng và điều tồi tệ nhất bạn nhận được (chỉ trong lần thực hiện đầu tiên!) Là 30 giây, thì việc giảm số lượng phân mảnh mức độ đó sẽ giúp ích rất nhiều. 30 giây đó được dành để tải dữ liệu vào bộ nhớ và tôi không thể hiểu rằng việc cải thiện mức độ phân mảnh sẽ mua cho bạn nhiều ở đó. Nếu bạn có bộ nhớ dự phòng để giữ bảng này trong bộ nhớ, có lẽ bạn nên xem xét một công việc khởi động hoặc một số quy trình nền chạy định kỳ truy vấn mà không buộc người dùng phải chờ nó, đảm bảo rằng nó vẫn còn mới trong bộ đệm.

Hekaton có thể là dành cho bạn.


Uh, oh, bạn có thể muốn nhấn mạnh rằng trên các bảng rất lớn (trường hợp của tôi 50GB +) đây có thể là một vấn đề . Tôi đã có kinh nghiệm ngay cả khi dữ liệu nằm trong bộ nhớ, mật độ trang kém (ngay cả khi phân mảnh thấp) có thể gây ra sự cố và truy vấn hiệu suất thấp và khiếu nại của người dùng.
Janis Veinbergs

@Janis Đoạn đầu tiên của tôi nói "không chắc" không "không thể" và tôi đã không giải quyết điểm chính xác của bạn ở đầu đoạn thứ hai của tôi? Quan trọng hơn, làm thế nào bạn xác định được rằng mật độ trang kém là nguyên nhân chính xác và duy nhất cho khiếu nại của người dùng?
Aaron Bertrand

không phải lo lắng, tôi chỉ muốn nhấn mạnh hơn vào từ đó :) Vâng, không thể nói rằng đó là nguyên nhân duy nhất. Chỉ là có những trường hợp Phân mảnh logic thấp và có thể chấp nhận được, nhưng mật độ trang có thể được cải thiện và người dùng phàn nàn và khi Chỉ số cụm đó được xây dựng lại, mọi thứ trở lại bình thường. Có thể một cái gì đó khác gây ra điều này được khắc phục bằng cách xây dựng lại ...
Janis Veinbergs

Ok, tôi nghĩ đó không phải là vấn đề phân mảnh hợp lý mà tôi gặp phải, nhưng có lẽ là tác dụng phụ để xây dựng lại: Thống kê được cập nhật, kế hoạch bộ nhớ cache liên quan đến các bảng đó bị vô hiệu hóa và được tạo lại với các kế hoạch hiệu quả hơn.
Janis Veinbergs

@JanisVeinbergs để bạn thực hiện xây dựng lại, không phải tổ chức lại? Vâng, đó là khác nhau. Sắp xếp lại không cập nhật số liệu thống kê, cho người mới bắt đầu. Và có lẽ chỉ cập nhật số liệu thống kê, mà không cần xây dựng lại hoặc sắp xếp lại, sẽ dẫn đến những cải tiến tương tự.
Aaron Bertrand

4

ConstantScan-> NestedLoop-> IndexSeek-> NestedLoop-> Gói KeyLookup

Kế hoạch này đã không truy cập vào toàn bộ bảng vì nó chỉ trả lại 7.000 hàng trong số 34,5M hàng.

Tổng số lượng dữ liệu ra khỏi đĩa là rất nhỏ so với kích thước của toàn bộ bảng 1 ; tìm kiếm ngẫu nhiên thời gian để thực hiện các hoạt động tra cứu chính dường như chiếm ưu thế. Khắc phục sự cố phân mảnh chỉ áp dụng khi các hoạt động quét có liên quan. Khi mẫu truy cập là ngẫu nhiên giống như ở đây, phân mảnh - và số liệu phân mảnh - không liên quan.

Bạn sẽ có thể xác minh những gì đang diễn ra bằng cách xem hoạt động của đĩa trong Performance Monitor hoặc Resource Monitor trong khi truy vấn đang chạy - Tôi hy vọng bạn sẽ thấy thông lượng đĩa rất thấp.

Giả sử phân tích của tôi là chính xác, đây là một số gợi ý (có thể kết hợp) để cải thiện thời gian thực hiện truy vấn, đặc biệt là với bộ đệm lạnh:

  • Đặt (các) tệp dữ liệu trên một hệ thống con lưu trữ có thể xử lý tốt hơn các lần đọc ngẫu nhiên. Theo ước tính sơ bộ, 30s / 7.000 hàng là thời gian tìm kiếm trung bình ~ 4ms, điều này không tệ, vì vậy đây có thể là một đề xuất đắt tiền.

  • Sửa đổi chỉ mục không bao gồm để bao gồm truy vấn bằng cách sử dụng INCLUDEcác cột, do đó loại bỏ sự cần thiết phải tra cứu khóa và do đó hầu hết các hoạt động đĩa ngẫu nhiên. Đây có thể là giải pháp tốt nhất, ngay cả khi bạn hy sinh thêm một chút dung lượng lưu trữ cho nó. Hy vọng cái bàn không quá rộng.

1 Giả sử kích thước hàng bằng nhau.


Ngoài ra, như một bên, DBCC SHOWCONTIGđã bị từ chối trong một thời gian khá lâu - sự thay thế đi về phía trước là sys.dm_db_index_physical_stats.

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.