Biến động lớn trong thời gian chèn số lượng lớn


13

Vì vậy, tôi có một quy trình Chèn hàng loạt đơn giản để lấy dữ liệu từ bảng phân tầng của chúng tôi và chuyển nó vào bảng dữ liệu của chúng tôi.

Quá trình này là một tác vụ luồng dữ liệu đơn giản với các cài đặt mặc định cho "Hàng trên mỗi lô" và các tùy chọn là "khóa tab" và "không ràng buộc kiểm tra".

Cái bàn khá rộng. 587.162.986 với kích thước dữ liệu 201GB và 49GB không gian chỉ mục. Chỉ số cụm cho bảng là.

CREATE CLUSTERED INDEX ImageData ON dbo.ImageData
(
    DOC_ID ASC,
    ACCT_NUM ASC,
    MasterID ASC
)

Và khóa chính là:

ALTER TABLE dbo.ImageData 
ADD CONSTRAINT ImageData 
PRIMARY KEY NONCLUSTERED 
(
    ImageID ASC,
    DT_CRTE_DOC ASC
)

Bây giờ chúng tôi đã có một vấn đề trong đó BULK INSERTthông qua SSIS đang chạy rất chậm. 1 giờ để chèn một triệu hàng. Truy vấn điền vào bảng đã được sắp xếp và truy vấn để điền vào sẽ mất dưới một phút để chạy.

Khi quá trình đang chạy, tôi có thể thấy truy vấn đang chờ trên BULK insert, mất từ ​​5 đến 20 giây và hiển thị loại chờ PAGEIOLATCH_EX. Quá trình chỉ có thể INSERTkhoảng một nghìn hàng tại một thời điểm.

Hôm qua trong khi thử nghiệm quá trình này với môi trường UAT của tôi, tôi đã gặp vấn đề tương tự. Tôi đã chạy quá trình một vài lần và cố gắng xác định nguyên nhân gốc rễ của việc chèn chậm này là gì. Rồi đột nhiên nó bắt đầu chạy trong chưa đầy 5 phút. Vì vậy, tôi đã chạy nó một vài lần nữa với cùng một kết quả. Ngoài ra, số lượng chèn hàng loạt đang chờ trong 5 giây hoặc lớn hơn đã giảm từ hàng trăm xuống còn khoảng 4.

Bây giờ điều này thật khó hiểu bởi vì nó không giống như chúng ta đã có một số hoạt động giảm mạnh.

CPU trong suốt thời gian thấp.

CPU

Thời gian chậm hơn dường như có ít chờ đợi hơn trên đĩa.

Chờ đợi

Độ trễ của đĩa thực sự tăng trong khung thời gian mà quá trình đang chạy dưới 5 phút.

Độ trễ

Và IO thấp hơn nhiều trong thời gian mà quá trình này hoạt động kém.

Tôi đang

Tôi đã kiểm tra và không có sự tăng trưởng tập tin vì các tập tin chỉ đầy 70%. Tệp nhật ký vẫn còn 50%. DB ở chế độ Khôi phục đơn giản. DB chỉ có một nhóm tệp nhưng được trải rộng trên 4 tệp.

Vì vậy, những gì tôi đang tự hỏi A: tại sao tôi lại thấy thời gian chờ đợi lớn như vậy trên các chèn số lượng lớn đó. B: loại phép thuật nào đã xảy ra khiến nó chạy nhanh hơn?

Lưu ý bên. Nó chạy như tào lao ngày hôm nay.

CẬP NHẬT nó hiện đang được phân vùng. Tuy nhiên, nó được thực hiện theo một phương pháp tốt nhất là ngớ ngẩn.

CREATE PARTITION SCHEME [ps_Image] AS PARTITION [pf_Image] 
TO ([FG_Image], [FG_Image], [FG_Image], [FG_Image])

CREATE PARTITION FUNCTION [pf_Image](datetime) AS 
RANGE RIGHT FOR VALUES (
      N'2011-12-01T00:00:00.000'
    , N'2013-04-01T00:00:00.000'
    , N'2013-07-01T00:00:00.000'
);

Điều này về cơ bản để lại tất cả dữ liệu trong phân vùng thứ 4. Tuy nhiên vì tất cả sẽ đi đến cùng một nhóm tập tin. Dữ liệu hiện được phân chia khá đều trên các tệp đó.

CẬP NHẬT 2 Đây là những chờ đợi tổng thể khi quá trình hoạt động kém.

Đợi 1

Đây là sự chờ đợi trong khoảng thời gian tôi có thể chạy quy trình đang chạy tốt.

Đợi 2

Hệ thống con lưu trữ được gắn cục bộ RAID, không liên quan đến SAN. Các bản ghi là trên một ổ đĩa khác nhau. Bộ điều khiển Raid là PERC H800 với kích thước bộ đệm 1 GB. (Đối với UAT) Prod là PERC (810).

Chúng tôi đang sử dụng phục hồi đơn giản không có bản sao lưu. Nó được khôi phục từ một bản sao sản xuất hàng đêm.

Chúng tôi cũng đã thiết lập IsSorted property = TRUESSIS vì dữ liệu đã được sắp xếp.


ASYNC_NETWORK_IOcó nghĩa là SQL Server đang chờ gửi hàng đến máy khách ở đâu đó. Tôi cho rằng điều đó đang hiển thị hoạt động của các hàng tiêu thụ SSIS từ bảng phân tầng.
Max Vernon

PAGEIOLATCH_EXASYNC_IO_COMPLETIONđang chỉ ra rằng mất một lúc để lấy dữ liệu từ đĩa vào bộ nhớ. Đây có thể là một chỉ báo của một vấn đề với hệ thống con đĩa, hoặc nó có thể là sự tranh chấp bộ nhớ. SQL Server có bao nhiêu bộ nhớ?
Max Vernon

Với tên bảng của ImageData, bạn có thể tò mò - định nghĩa bảng thực tế là gì? Nếu bạn đang lấy dữ liệu LOB, bạn có thể đã đệm vào đĩa (đi tới BLOBTempStoragePath, nếu không xác định sẽ là thư mục% TEMP% của người dùng thực thi hay còn gọi là ổ C)
billinkc 17/03/2016

Không thể đăng định nghĩa bảng nhưng đó là thông tin ra tài liệu hình ảnh.
Zane

Tôi nghi ngờ đó là vấn đề xử lý song song. Tôi khuyên bạn nên điều chỉnh MAXDOP của mình (bắt đầu từ 1 đến 4) và xem mọi thứ diễn ra như thế nào. Mặt khác, với mục đích thử nghiệm, tôi muốn tạo một lệnh BCP để thay thế SSIS và xem liệu có sự khác biệt nào không.
jyao

Câu trả lời:


1

Tôi không thể chỉ ra nguyên nhân nhưng tôi tin rằng các hàng theo mặc định cho một hoạt động BULK INSERT là "tất cả". Đặt giới hạn trong các hàng có thể giúp thao tác dễ tiêu hóa hơn: đó là lý do tại sao đó là một tùy chọn. (Ở đây và đang diễn ra, tôi đang xem tài liệu "BULK INSERT" của Transact-SQL, vì vậy nó có thể là lối thoát cho SSIS.)

Nó sẽ có tác dụng chia hoạt động thành nhiều lô hàng X, mỗi lô hoạt động như một giao dịch riêng biệt. Nếu có lỗi, các lô đã hoàn thành sẽ vẫn được cam kết vào bảng đích và lô đã bị dừng sẽ quay trở lại. Nếu điều đó có thể chấp nhận được trong những gì bạn đang làm, tức là bạn có thể chạy lại nó sau và bắt kịp, sau đó, hãy thử điều đó.

Không có gì sai khi có chức năng phân vùng đặt tất cả các phần chèn hiện tại vào một phân vùng bảng, nhưng tôi không thấy phân vùng này hữu ích như thế nào với các phân vùng trong cùng một nhóm. Và việc sử dụng datetime rất kém và thực sự bị hỏng đối với datetime và 'YYYY-MM-DD' mà không có công thức CONVERT rõ ràng kể từ SQL Server 2008 (SQL có thể vui vẻ coi điều này là YYYY-DD-MM: không đùa: chỉ cần thay đổi nó thành 'YYYYMMDD', đã sửa: hoặc CHUYỂN ĐỔI (datetime, 'YYYY-MM-DDT00: 00: 00', 126), tôi nghĩ là vậy). Nhưng tôi nghĩ rằng sử dụng proxy cho giá trị ngày (năm là int hoặc năm + quý) để phân vùng sẽ hoạt động tốt hơn.

Có thể đó là một thiết kế được sao chép từ nơi khác hoặc được sao chép qua một số bảng dữ liệu. Nếu đây là - một cơ sở dữ liệu thực sự, một bãi chứa từ kho dữ liệu để cung cấp cho người quản lý bộ phận một số dữ liệu để chơi, thì đó không phải (do bạn) gửi ở nơi khác và có lẽ chỉ đọc khi có liên quan đến người dùng dữ liệu , sau đó, dường như với tôi rằng bạn có thể loại bỏ chức năng phân vùng - hoặc thay đổi nó để đưa tất cả dữ liệu mới vào phân vùng thứ tư bất kể điều gì, và không ai quan tâm. (Có lẽ bạn nên kiểm tra xem không ai quan tâm.)

Cảm giác giống như một thiết kế trong đó kế hoạch sẽ bỏ nội dung của phân vùng 1 trong tương lai và tạo một phân vùng mới để có thêm dữ liệu mới, nhưng có vẻ như điều đó không xảy ra ở đây. Ít nhất nó đã không xảy ra kể từ năm 2013.


0

Tôi đã nhìn thấy sự chậm chạp cực kỳ lẻ tẻ này trong các lần chèn vào các bảng được phân vùng lớn trong dịp này. Bạn đã thử cập nhật bảng đích Thống kê và sau đó chạy lại chưa? Thời gian chờ cực kỳ có thể là do số liệu thống kê kém và nếu một bản cập nhật stat được kích hoạt tại một số thời điểm trong quá trình thử nghiệm của bạn thì điều đó sẽ giải thích cho việc tăng tốc độ. Chỉ cần một suy nghĩ và một bài kiểm tra dễ dàng để xác minh.

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.