Truy vấn và cập nhật cực kỳ chậm sau khi IndexOptizing


12

Cơ sở dữ liệu SQL Server 2017 Enterprise CU16 14.0.3076.1

Gần đây chúng tôi đã thử chuyển từ các công việc bảo trì Index Rebuild mặc định sang Ola Hallengren IndexOptimize. Các công việc Index Rebuild mặc định đã chạy trong một vài tháng mà không có vấn đề gì, và các truy vấn và cập nhật đang hoạt động với thời gian thực hiện chấp nhận được. Sau khi chạy IndexOptimizetrên cơ sở dữ liệu:

EXECUTE dbo.IndexOptimize
@Databases = 'USER_DATABASES',
@FragmentationLow = NULL,
@FragmentationMedium = 'INDEX_REORGANIZE,INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE',
@FragmentationHigh = 'INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE',
@FragmentationLevel1 = 5,
@FragmentationLevel2 = 30,
@UpdateStatistics = 'ALL',
@OnlyModifiedStatistics = 'Y'

hiệu suất đã vô cùng xuống cấp. Một tuyên bố cập nhật mất 100ms trước đó IndexOptimizemất 78.000ms sau đó (sử dụng một kế hoạch giống hệt nhau) và các truy vấn cũng đang thực hiện một số đơn đặt hàng có cường độ tồi tệ hơn.

Vì đây vẫn là một cơ sở dữ liệu thử nghiệm (chúng tôi đang di chuyển một hệ thống sản xuất từ ​​Oracle), chúng tôi đã trở lại bản sao lưu và bị vô hiệu hóa IndexOptimizevà mọi thứ trở lại bình thường.

Tuy nhiên, chúng tôi muốn hiểu điều gì IndexOptimizekhác với "bình thường" Index Rebuildcó thể gây ra sự suy giảm hiệu suất cực đoan này để đảm bảo chúng tôi tránh được điều đó một khi chúng tôi đi vào sản xuất. Bất kỳ đề xuất về những gì cần tìm sẽ được đánh giá rất cao.

Kế hoạch thực hiện cho tuyên bố cập nhật khi nó chậm. tức là
sau khi IndexOptizing tối đa
kế hoạch thực hiện (sắp tới)

Tôi đã không thể nhận ra một sự khác biệt.
Lập kế hoạch cho cùng một truy vấn khi đó là kế hoạch thực hiện nhanh

Câu trả lời:


11

Tôi nghi ngờ bạn đã có một tỷ lệ mẫu khác nhau được xác định giữa hai phương pháp bảo trì của bạn. Tôi tin rằng các tập lệnh của Ola sử dụng lấy mẫu mặc định trừ khi bạn chỉ định @StatisticsSampletham số , nó không giống như bạn đang làm.

Tại thời điểm này, đây là suy đoán, nhưng bạn có thể kiểm tra xem tốc độ lấy mẫu nào hiện đang được sử dụng trên số liệu thống kê của mình bằng cách chạy truy vấn sau trong cơ sở dữ liệu của bạn:

SELECT  OBJECT_SCHEMA_NAME(st.object_id) + '.' + OBJECT_NAME(st.object_id) AS TableName
    ,   col.name AS ColumnName
    ,   st.name AS StatsName
    ,   sp.last_updated
    ,   sp.rows_sampled
    ,   sp.rows
    ,   (1.0*sp.rows_sampled)/(1.0*sp.rows) AS sample_pct
FROM sys.stats st 
    INNER JOIN sys.stats_columns st_col
        ON st.object_id = st_col.object_id
        AND st.stats_id = st_col.stats_id
    INNER JOIN sys.columns col
        ON st_col.object_id = col.object_id
        AND st_col.column_id = col.column_id
    CROSS APPLY sys.dm_db_stats_properties (st.object_id, st.stats_id) sp
ORDER BY 1, 2

Nếu bạn thấy điều này xảy ra trong 1 giây (ví dụ 100%) thì đây có thể là vấn đề của bạn. Có thể thử lại các tập lệnh của Ola bao gồm @StatisticsSampletham số với tỷ lệ phần trăm được trả về bởi truy vấn này và xem điều đó có khắc phục được sự cố của bạn không?


Là bằng chứng hỗ trợ bổ sung cho lý thuyết này, XML của kế hoạch thực hiện cho thấy tỷ lệ lấy mẫu rất khác nhau đối với truy vấn chậm (2,18233%):

<StatisticsInfo LastUpdate="2019-09-01T01:07:46.04" ModificationCount="0" 
    SamplingPercent="2.18233" Statistics="[INDX_UPP_4]" Table="[UPPDRAG]" 
    Schema="[SVALA]" Database="[ulek-sva]" />

So với truy vấn nhanh (100%):

<StatisticsInfo LastUpdate="2019-08-25T23:01:05.52" ModificationCount="555" 
    SamplingPercent="100" Statistics="[INDX_UPP_4]" Table="[UPPDRAG]" 
    Schema="[SVALA]" Database="[ulek-sva]" />

@JoshDarnell LOL, đây là lần xuất hiện thứ hai nơi bạn tìm thấy một số thông tin thống kê hỗ trợ trong kế hoạch truy vấn mà tôi không thấy. Cảm ơn đã chỉnh sửa!
John Eisbrener

Haha tôi quên mất đó là bạn, John! Tôi hứa tôi sẽ không theo dõi bạn
Josh Darnell

@JoshDarnell Tôi đánh giá cao những hiểu biết bổ sung và đó là một lời nhắc tốt khác rằng có rất nhiều thông tin trong kế hoạch thực hiện mà bạn không nên bỏ qua.
John Eisbrener

Rất vui được giúp đỡ! Và vâng, có những thứ tôi cũng nhớ suốt (Tôi đã bị đốt cháy bởi những thứ thống kê, vì vậy tôi có xu hướng đến đó nhanh chóng để xem những gì đang xảy ra).
Josh Darnell

Cảm ơn bạn đã giải thích, nó thực sự là vấn đề. Hầu hết các số liệu thống kê có tỷ lệ mẫu mặc định là 2,2%, tuy nhiên một số ít được tạo sau khi di chuyển từ Oracle có tỷ lệ mẫu 100%. Có vẻ như việc xây dựng lại chỉ mục mặc định giữ 100% nhưng khi chúng tôi sử dụng IndexOptizing, nó cũng áp dụng mặc định là 2,2% cho những người đó. Áp dụng tham số @StatisticSample và chạy lại các truy vấn đã xác minh rằng đây là nguyên nhân gây ra sự cố.
Martin Bergström

5

Câu trả lời của John là giải pháp chính xác, đây chỉ là phần bổ sung cho những phần nào trong kế hoạch thực hiện đã thay đổi và ví dụ về cách dễ dàng phát hiện sự khác biệt với nhà thám hiểm Sentry One Plan

Một tuyên bố cập nhật mất 100ms trước khi IndexOptizing mất 78.000ms sau đó (sử dụng một kế hoạch giống hệt nhau)

Khi xem xét tất cả các kế hoạch truy vấn khi hiệu suất của bạn bị suy giảm, bạn có thể dễ dàng phát hiện ra sự khác biệt.

Hiệu suất xuống cấp

nhập mô tả hình ảnh ở đây

Hai lần đếm trên 35 giây thời gian cpu và thời gian đã trôi qua

Hiệu suất mong đợi

nhập mô tả hình ảnh ở đây

Tốt hơn nhiều

Sự xuống cấp chính là hai lần trên truy vấn cập nhật này:

UPDATE SVALA.INGÅENDEANALYS
                           SET 
                              UPPDRAGAVSLUTAT = @NEW$AVSLUTAT
                        WHERE INGÅENDEANALYS.ID IN 
                           (
                              SELECT IA.ID
                              FROM 
                                 SVALA.INGÅENDEANALYS  AS IA 
                                    JOIN SVALA.INGÅENDEANALYSX  AS IAX 
                                    ON IAX.INGÅENDEANALYS = IA.ID 
                                    JOIN SVALA.ANALYSMATERIAL  AS AM 
                                    ON AM.ID = IA.ANALYSMATERIALID 
                                    JOIN SVALA.ANALYSMATERIALX  AS AMX 
                                    ON AMX.ANALYSMATERIAL = AM.ID 
                                    JOIN SVALA.INSÄNTMATERIAL  AS IM 
                                    ON IM.ID = AM.INSÄNTMATERIALID 
                                    JOIN SVALA.INSÄNTMATERIALX  AS IMX 
                                    ON IMX.INSÄNTMATERIAL = IM.ID
                              WHERE IM.UPPDRAGSID = SVALA.PKGSVALA$STRIPVERSION(@NEW$ID)
                      )

kế hoạch thực hiện cho truy vấn này với hiệu suất bị suy giảm

Kế hoạch truy vấn ước tính của truy vấn cập nhật này có ước tính rất cao khi hiệu suất bị suy giảm:

nhập mô tả hình ảnh ở đây

Mặc dù trong thực tế (kế hoạch thực hiện thực tế) nó vẫn phải thực hiện công việc, nhưng không phải là số tiền điên rồ mà các ước tính cho thấy.

Tác động lớn nhất đến hiệu suất là hai lần quét và kết hợp khớp băm dưới đây:

Quét thực tế về hiệu suất xuống cấp # 1

nhập mô tả hình ảnh ở đây

Quét thực tế trên hiệu suất xuống cấp # 2

nhập mô tả hình ảnh ở đây


Kế hoạch thực hiện cho truy vấn này với hiệu suất dự kiến

Khi bạn so sánh điều đó với các ước tính (hoặc thực tế) của kế hoạch truy vấn với hiệu suất dự kiến ​​bình thường, sự khác biệt rất dễ nhận ra.

nhập mô tả hình ảnh ở đây

Ngoài ra, hai lần truy cập bảng trước đó thậm chí không xảy ra:

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

Bạn không thấy sự loại bỏ này trên phép nối băm vì đầu vào bản dựng (trên cùng) được chèn vào bảng băm trước tiên. Sau đó, các giá trị 0 được thăm dò trong bảng băm này, trả về các giá trị 0.


1
Cảm ơn bạn đã mô tả chi tiết về các kế hoạch, nó rất hữu ích cho sự hiểu biết của tôi về lý do tại sao vấn đề xảy ra. Tôi chắc chắn sẽ xem qua Sentry One Plan Explorer, nó có vẻ rất hữu ích!
Martin Bergström

@ MartinBergström Thật tuyệt khi nghe, cảm ơn bạn đã cung cấp các kế hoạch truy vấn và cung cấp cho chúng tôi tất cả thông tin có liên quan mà chúng tôi đã hỏi trong các nhận xét :). Điều tốt nhất về nhà thám hiểm kế hoạch là nó miễn phí! Nó cũng có thể hoạt động từ bên trong ssms (bằng cách nhấp chuột phải vào kế hoạch thực hiện và nhấn "xem với trình thám hiểm kế hoạch sentryone").
Randi Vertongen

1

Nếu không có thêm thông tin, chúng tôi chỉ có thể đưa những cú đâm nhẹ vào bóng tối, vì vậy bạn nên chỉnh sửa câu hỏi để cung cấp thêm một chút. Chẳng hạn, các kế hoạch truy vấn cho câu lệnh cập nhật mà bạn đã đưa ra thời gian cho cả trước và sau các hoạt động bảo trì chỉ mục vì các kế hoạch có thể khác nhau do các số liệu thống kê chỉ mục đã được cập nhật ( https://www.brentozar.com/pastetheplan / rất hữu ích cho việc này, thay vì điền vào câu hỏi với phần lớn XML hoặc đưa ra một màn hình lấy mà không bao gồm một số thông tin thích hợp mà văn bản của kế hoạch chứa).

Hai điểm rất đơn giản ngoài dơi:

  1. Đã chạy tối ưu hóa chắc chắn hoàn thành? Nếu các bài kiểm tra của bạn đang cạnh tranh với IO của việc xây dựng lại chỉ mục chạy dài sẽ ảnh hưởng đến thời gian.
  2. Bạn đã kiểm tra nhiều lần? Nếu bản cập nhật dựa trên dữ liệu từ một truy vấn xem xét nhiều dữ liệu (chứ không phải là một 'CẬP NHẬT TheTable SET ThisColumn =' Giá trị tĩnh ') thì có thể dữ liệu này thường nằm trong bộ nhớ nhưng đã bị xóa mà các lần chạy đầu tiên của các truy vấn có liên quan sẽ chậm hơn bình thường do nhấn vào đĩa thay vì tìm các trang cần thiết đã có trong vùng đệm trong bộ nhớ.

Cảm ơn bạn đã dành thời gian để trả lời. Tôi đã cập nhật câu hỏi với các liên kết pastetheplan. Việc tối ưu hóa chắc chắn đã hoàn thành, nó chạy được khoảng 1 giờ một ngày trước khi xảy ra sự cố. Chúng tôi đã thử nghiệm nhiều lần và nó thực sự ảnh hưởng đến hai bản sao của cơ sở dữ liệu đang chạy trong hai môi trường thử nghiệm khác nhau theo cùng một cách. Tuyên bố Cập nhật chỉ là ví dụ đơn giản nhất mà tôi tìm thấy, có rất nhiều phần chèn và lựa chọn khác bị ảnh hưởng
Martin Bergström

Bởi "nhiều lần" tôi có nghĩa là thử cập nhật nhiều lần sau khi một phiên bản của chỉ số thay đổi, thay vì chạy tập lệnh tối ưu hóa chỉ mục nhiều lần một cách độc lập (mặc dù đó là cách hữu ích để xác minh kết quả có thể lặp lại). Nếu việc xóa bộ nhớ là (hoặc là một phần của) sự cố thì các lần cập nhật đầu tiên từ lựa chọn sẽ chiếm ưu thế cho vùng đệm để những lần sau sẽ có khả năng nhanh hơn do IO giảm đáng kể.
David Spillett

Xin lỗi nếu câu trả lời của tôi không rõ ràng. Có, chúng tôi đã thử cập nhật nhiều lần. Sự chậm chạp xảy ra trên cơ sở dữ liệu được người kiểm tra sử dụng để kiểm tra ứng dụng cũng như các truy vấn và cập nhật chạy nhiều lần trong ngày mà không cải thiện hiệu suất.
Martin Bergström
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.