CXPACKET Chờ đợi hiệu suất điều chỉnh cho SQL Server 2008


7

Tôi có một truy vấn SQL Server 2008 đang làm việc trên hàng triệu bản ghi. Truy vấn là w / in a Proc được điều hành hàng đêm bởi một công việc. Truy vấn có thể mất cả ngày để chạy khi tôi đặt nó lần đầu tiên trên máy chủ, nhưng trong vòng một tuần, nó sẽ giảm xuống dưới một giờ - mà không có sự can thiệp nào từ tôi. Nó CỐ ĐỊNH bằng cách nào đó.

Truy vấn chạy trong tempdb và trước khi tự khắc phục, khi tôi kiểm tra số liệu thống kê hiệu suất trên đó, tôi tìm thấy như sau: CXPACKET: 20.700 giây hoặc 66% thời gian chờ.
PAGEIOLATCH: _SH 2.500 hoặc 8% thời gian chờ.
LOGBUFFER: 1500 giây hoặc 5% thời gian chờ IO_COMPLETION: 1500 giây hoặc 5% thời gian chờ

Tôi đã cố gắng điều chỉnh các chỉ mục, v.v. và các số liệu thống kê ở trên có phần cải thiện so với lần chạy đầu tiên của tôi khi CXPACKET là 77% thời gian chờ đợi. Tôi đọc các mẹo chụp ảnh rắc rối nói rằng tôi nên chia tempdb của mình thành một tệp cho mỗi CPU. Tôi có hệ thống W2K8 32 bit cpu kép và vì vậy tôi chia tempdb thành 2 tệp và tăng đáng kể kích thước của mỗi tệp lên 150 GB mỗi lần tự động 10%, nhưng chúng không tăng nên tôi nghĩ kích thước là đủ.

Khi tôi nhìn vào máy chủ trong khi truy vấn đang chạy, tôi có thể thấy rằng CPU KHÔNG được ghim và đang lơ lửng khoảng <10% công suất. Những gì đã được ghim là DISK IO. Máy có một đĩa đơn.

Nếu không có gì khó chịu, đây là hai truy vấn gây rắc rối (truy vấn đầu tiên được sử dụng là truy vấn con của phần sau - xem giải thích bên dưới):

insert into #ttcbm(tradeId1, tradeId2)
select distinct tp.tradeid tradeId1, tp1.tradeid tradeId2
from #tradeP tp
join #tradeP tp1    
on tp.cmbId = tp1.cmbId
and tp.qs_plyrid = tp1.qs_plyrid    
and tp.tradeId > tp1.tradeId    
OPTION (MAXDOP 1)


insert into #mergeT(tradeId1, tradeId2)
select distinct tp.tradeid tradeId1, tp1.tradeid tradeId2
from #tradep tp
join #tradep tp1
on tp.cmbId = tp1.cmbId
and tp.tradeid > tp1.tradeId
left join #ttcbm x
on tp.tradeId = x.tradeId1
and tp1.tradeId = x.tradeId2
where 1 = 1
and x.tradeId1 is null
and x.tradeId2 is null
OPTION (MAXDOP 1);

Tôi đã thêm MAXDOP 1 cho mỗi mẹo khắc phục sự cố mà tôi đọc được nói rằng CXPACKET là do song song và có lẽ nó đã giúp tôi giảm bớt sự chờ đợi của mình một chút, nhưng không giống như sự cải thiện xảy ra khi truy vấn tự khắc phục, tức là từ 24 giờ để kẻo hơn 1 giờ

bảng #ttcbm có PK là Tradeid1, Tradeid2 và #tradep có pk là (cmbId, qs_plyrid, Tradeid) và cả hai bảng đều có số lượng bản ghi theo thứ tự từ 100K đến 500k. #ttcbm từng là truy vấn con của truy vấn 'chèn vào #mergeT' sau, nhưng tôi đã tách nó ra khi tôi đọc rằng tách ra các truy vấn phức tạp có thể cải thiện hiệu suất khi xảy ra sự cố song song.


Kích thước của dữ liệu? Dung lượng RAM? Khi bạn nói "2 CPU", có bao nhiêu ổ cắm, lõi này và bạn có siêu phân luồng không?
gbn

@gbn. Đó là máy tính để bàn Vostro 420 Tower, RAM 4GB, Intel Core 2 Duo, nó có lõi kép và, tôi giả sử, có 2 ổ cắm, nhưng tôi không chắc về cái sau. en.wikipedia.org/wiki/Intel_Core_2 Dell thông số kỹ thuật không đề cập đến bất cứ điều gì về hyperthreading vì vậy tôi cho rằng nó không được support.dell.com/support/edocs/systems/vos220/en/sqrg/... Tôi không chắc chắn ý bạn là gì về 'kích thước của dữ liệu', nhưng tôi nghĩ bạn có nghĩa là số lượng bản ghi trong bảng #tradep và #ttcbm?
atommc

có, kích thước của dữ liệu
gbn

bảng #tradep có ~ 4,5 triệu bản ghi
atommc

1
@atommc dual cpu 32 bit W2K8thời gian nâng cấp lên 64Bit. Ngoài ra, bạn đã bật / chuyển 3GB cùng với AWE chưa?
Kin Shah

Câu trả lời:


10

Có rất nhiều hiểu lầm về CXPACKET. CXPACKET không phải là nguyên nhân của vấn đề của bạn, nó là một tác dụng phụ. CXPACKET có nghĩa là gì khi bạn thấy đó là luồng của truy vấn song song đang chờ một luồng khác của truy vấn đó thực hiện điều gì đó. Chỉ vì bạn thấy rất nhiều CXPACKET chờ đợi không có nghĩa là có vấn đề với truy vấn, điều đó có nghĩa là có vấn đề ở một nơi khác. Khi bạn thấy CXPACKET chờ, bạn cần xem các luồng khác của SPID và xem những gì chờ đợi khác ngoài CXPACKET. Sự chờ đợi khác là vấn đề.

Đối với vấn đề cụ thể của bạn, lý do khiến thời gian chạy quá điên rồ có lẽ là do SQL Server đang tạo ra một kế hoạch khác vào một số ngày vì số liệu thống kê đã hết hạn (khiến công việc bị kéo dài). Sau đó, bạn có thể cập nhật thủ công số liệu thống kê (hoặc thông qua một công việc) hoặc số liệu thống kê tự động bắt đầu và sau đó kế hoạch sẽ tốt hơn và công việc lại chạy nhanh trở lại.

Khi bạn đã giải quyết được vấn đề về số liệu thống kê, bạn có thể bắt đầu xem xét các lý do khác khiến công việc bị chậm. Thực tế là bạn chỉ có một đĩa duy nhất không giúp ích gì cả.


Là biến / giữ số liệu thống kê cập nhật tự động onđủ để nhắm mắt làm ngơ trước các vấn đề liên quan đến thống kê có thể xảy ra?
Thomas Stringer

1
Không. Hệ thống càng lớn thì càng có nhiều hàng để các chỉ số tự động khởi động. Cách thức hoạt động của thống kê tự động là khi số lượng hàng đã thay đổi 20% số hàng trong bảng +500 (1000 bảng hàng cần 700 hàng để thay đổi, bảng hàng 1.000.000 yêu cầu 200.500 hàng để thay đổi) trạng thái tự động sau đó sẽ chạy cho bảng đó (hoặc chỉ mục hoặc thống kê cụ thể). Cho đến lúc đó các số liệu thống kê lỗi thời. Bảng càng lớn thì càng mất nhiều thời gian để các chỉ số tự động khởi động. Và không phải những con số đó không thể điều chỉnh được.
mrdenny

oh wow, vậy có vẻ như bạn chắc chắn không thể chỉ dựa vào cập nhật thống kê tự động. Theo định nghĩa của bạn, có vẻ như cập nhật thống kê lịch biểu là cách để đi, đặc biệt là với một cơ sở dữ liệu / thể hiện được lên lịch theo thời gian tôi tưởng tượng.
Thomas Stringer

RE: Nhận xét của bạn ở trên về "không thể điều chỉnh". Trên SQL Server 2008 R2, một số điều chỉnh có thể được thực hiện thông qua TF 2371
Martin Smith

số liệu thống kê tự động có liên quan ở đây? Bảng #tradep và bảng #ttcbm chỉ trong tempdb trong vòng đời của Proc và họ không tham chiếu bất kỳ bảng không tạm thời nào.
atommc

5

Hai lý do có thể gây ra sự cải thiện của cùng một truy vấn theo thời gian:

  1. Dữ liệu đang thay đổi
  2. Kế hoạch truy vấn đang thay đổi

Dữ liệu bạn không thể làm nhiều. Để xác minh rằng gói truy vấn đang được cải thiện, hãy thử chạy truy vấn theo cách thủ công trong thời gian bạn biết truy vấn đang chạy nhanh nhất. TIẾT KIỆM kế hoạch truy vấn nhanh Chạy cùng một truy vấn trong thời gian bạn biết nó sẽ chậm, lưu truy vấn chậm So sánh hai kế hoạch, nếu chúng khác nhau, bạn có thể buộc truy vấn của mình sử dụng gói đã lưu. http://technet.microsoft.com/en-us/l Library / cc917694.aspx


2
Bộ nhớ đệm cũng có thể đóng một phần. Nếu SQL được khởi động lại, bộ đệm sẽ bị xóa, điều này có thể giải thích tại sao lúc đầu nó mất quá nhiều thời gian. Ngoài ra việc mở rộng tempdb sẽ phải xảy ra lại và nếu bạn ở trên một đĩa đơn, điều này cũng sẽ thêm vào thời gian đầu tiên.
datagod

Khởi động lại không có tác dụng. Một khi truy vấn bắt đầu chạy tốt thì nó vẫn như vậy. Cách duy nhất để làm cho nó hoạt động kém trở lại là thực hiện THAY ĐỔI trên nó. ALTER Proc nhỏ nhất sẽ khiến truy vấn quay trở lại thực thi 24 giờ.
atommc

Tôi đang gặp khó khăn trong việc tìm hiểu làm thế nào tôi sẽ có được kế hoạch tốt của một truy vấn được nhúng trong một Proc. Khi tôi trích xuất các truy vấn Proc và chạy nó trong Trình phân tích truy vấn, nó sẽ quay trở lại kế hoạch kém và thời gian chạy dài.
atommc

Lấy kế hoạch truy vấn cho toàn bộ Proc.
Jimbo

4

Rất có thể các chờ đợi CXPACKET thực sự được thể hiện không tương xứng nếu bạn có nhiều luồng chờ đợi trên một cái gì đó bị ràng buộc I / O. Bạn có thể kiểm tra điều này bằng cách thiết lập MAXDOP=1và chạy lại truy vấn. Xem tỷ lệ thời gian chờ đợi từ PAGEIOLATCH chờ đợi tăng đáng kể.

Nếu PAGEIOLATCH chờ của bạn chiếm tỷ lệ lớn trong thời gian chờ sau khi kiểm tra thì điều này có thể cho thấy truy vấn của bạn bị ràng buộc I / O.

Truy vấn của bạn có thể tự điều chỉnh vì có gì đó thay đổi kế hoạch truy vấn - hệ thống sẽ gây áp lực lên các tài nguyên như bộ nhớ vào tài khoản khi chọn gói truy vấn phù hợp. Cách tốt nhất để kiểm tra điều này là chạy trình lược tả và nắm bắt kế hoạch thực hiện thực tế từ truy vấn. Nếu bạn có tùy chọn, hãy đặt tên ứng dụng trên kết nối ( Application Name=foobartrong chuỗi kết nối) và lọc theo dấu vết.

Nếu bạn có thể thấy những gì chậm, thì bạn có thể điều chỉnh truy vấn hoặc lập chỉ mục một trong các bảng.


OK, tôi sẽ chạy một dấu vết và xem những gì tôi nhận được.
atommc

0

Bạn có xem xét việc đặt một chỉ mục trên các bảng tạm thời sau khi chúng được tạo không?

Đây có thể là điểm khởi đầu tốt, thứ tự của các trường sẽ phụ thuộc vào phân phối giá trị:

CREATE CLUSTERED INDEX IX_tradeP ON #tradeP(cmbId, qs_plyrid, tradeId);

CXPACKETkhông nên có trong danh sách lo lắng của bạn tại thời điểm này. Hầu hết thời gian, đó là luồng đồng bộ hóa đang chờ các luồng công nhân bị lệch hoàn thành. Rắc rối bắt đầu khi trình tối ưu hóa dự kiến ​​tải sẽ được trải đều trên các luồng công nhân, nhưng trong thực thi thực tế, một luồng sẽ phải thực hiện tất cả công việc.


0

Hoàn toàn tìm ra điều này. Tôi đã loại bỏ tất cả các khóa chính được nhóm trên mỗi bảng liên quan đến vấn đề này. Tôi đã thay thế PK chỉ bằng một chỉ mục thông thường được thêm vào sau khi chèn. Vấn đề là từ việc chèn hàng trăm triệu hàng vào một bảng có khóa chính được nhóm. SQL không thể thực hiện điều đó vì một số lý do. Khi tôi xóa PK cụm, việc chèn chỉ mất vài phút và nhật ký của tôi không tăng thêm 100 GB ... đó chỉ là một đống dữ liệu thẳng vào đống. Tạo chỉ mục thông thường (không bao gồm) sau khi chèn hiệu năng truy vấn được cải thiện mà không tạo ra tình huống khóa.


Vì vậy, bảng của bạn được giữ như một đống bây giờ? Bạn không thêm CI trở lại sau khi chèn?
Martin Smith

chính xác, nó chỉ là một đống cho chèn. Tôi không bao giờ thêm CI, nhưng tôi thêm một chỉ mục không được nhóm vào nó sau khi chèn.
atommc

0

Vấn đề này tiếp tục bật lên bây giờ và một lần nữa. Tôi nghĩ rằng nó có liên quan đến số lượng kích thước tôi phân bổ cho db và nhật ký. DB của tôi> 100GB và tôi để nó phát triển. Tôi nghĩ những gì đang xảy ra là khi autogrow xảy ra quá trình treo với thông báo lỗi này. Tôi sẽ phân bổ một kích thước khổng lồ cho tempdb, templog và db / log và xem nếu nó hoạt động.

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.