2008-10-02 55 views
41

Tôi chưa bao giờ hiểu rõ việc sử dụng MAXDOP. Tôi biết rằng nó làm cho truy vấn nhanh hơn và đó là mục cuối cùng mà tôi có thể sử dụng cho Tối ưu hóa truy vấn.Mục đích của việc sử dụng OPTION (MAXDOP 1) trong SQL Server là gì?

Tuy nhiên, câu hỏi của tôi là khi nào và ở đâu phù hợp nhất để sử dụng trong truy vấn?

+1

Bạn nên bao gồm phiên bản và gói dịch vụ của máy chủ SQL. Điều này có thể đã được sửa trong phiên bản sau ... –

Trả lời

18

Đây là sự đánh bạc chung về tính song song trong SQL Server, nó có thể không trả lời trực tiếp câu hỏi của bạn.

Từ Books Online, trên MAXDOP:

Thiết lập số lượng tối đa bộ xử lý bộ xử lý truy vấn có thể sử dụng để thực hiện một tuyên bố chỉ số duy nhất. Ít bộ xử lý có thể được sử dụng tùy thuộc vào khối lượng công việc của hệ thống hiện tại.

Xem Rickie Lee's blog về tính song song và kiểu chờ CXPACKET. Nó khá thú vị.

Nói chung, trong cơ sở dữ liệu OLTP, ý kiến ​​của tôi là nếu một truy vấn tốn kém đến mức cần phải thực hiện trên một số bộ xử lý, truy vấn cần phải được viết lại thành một cái gì đó hiệu quả hơn.

Tại sao bạn nhận được kết quả tốt hơn khi thêm MAXDOP (1)? Khó có thể nói được nếu không có các kế hoạch thực hiện thực tế, nhưng nó có thể đơn giản vì kế hoạch thực hiện hoàn toàn khác nhau mà không có OPTION, ví dụ bằng cách sử dụng một chỉ mục khác (hoặc nhiều khả năng hơn) JOINing khác nhau, sử dụng MERGE hoặc HASH join.

20

Như Kaboing đã đề cập, MAXDOP(n) thực sự kiểm soát số lõi CPU đang được sử dụng trong bộ xử lý truy vấn.

Trên một hệ thống hoàn toàn nhàn rỗi, SQL Server sẽ cố gắng kéo các bảng vào bộ nhớ càng nhanh càng tốt và nối giữa chúng trong bộ nhớ. Nó có thể là, trong trường hợp của bạn, tốt nhất là làm điều này với một CPU duy nhất. Điều này có thể có tác dụng tương tự như việc sử dụng OPTION (FORCE ORDER) buộc trình tối ưu hóa truy vấn sử dụng thứ tự các phép nối mà bạn đã chỉ định. Trong một số trường hợp, tôi đã thấy OPTION (FORCE PLAN) giảm truy vấn từ 26 giây xuống còn 1 giây thời gian thực hiện.

Books Online tiếp tục nói rằng giá trị có thể cho MAXDOP là:

0 - Sử dụng con số thực tế của CPU có sẵn tùy thuộc vào khối lượng công việc hệ thống hiện tại. Đây là giá trị mặc định và cài đặt được đề xuất.

1 - Ngăn chặn việc tạo kế hoạch song song. Các hoạt động sẽ được thực hiện serially.

2-64 - Giới hạn số lượng bộ xử lý theo giá trị được chỉ định. Có thể sử dụng ít bộ vi xử lý hơn tùy thuộc vào khối lượng công việc hiện tại. Nếu một giá trị lớn hơn số CPU có sẵn được chỉ định, thì số lượng CPU sẵn có thực tế được sử dụng.

Tôi không chắc chắn những gì sử dụng tốt nhất của MAXDOP là, tuy nhiên tôi sẽ tham gia một dự đoán và nói rằng nếu bạn có một bảng với 8 phân vùng trên nó, bạn sẽ muốn chỉ định MAXDOP(8) do I/O những hạn chế, nhưng tôi có thể sai.

Dưới đây là một vài liên kết nhanh tôi thấy về MAXDOP:

Books Online: Degree of Parallelism

General guidelines to use to configure the MAXDOP option

3

Có một vài lỗi parallization trong SQL server với đầu vào không bình thường. OPTION (MAXDOP 1) sẽ bỏ qua chúng.

EDIT: Cũ. Thử nghiệm của tôi đã được thực hiện phần lớn vào SQL 2005. Hầu hết những điều này dường như không tồn tại nữa, nhưng mỗi một lần trong một thời gian chúng tôi đặt câu hỏi giả định khi SQL 2014 làm điều gì đó câm và chúng tôi quay trở lại cách cũ và nó hoạt động. Chúng tôi không bao giờ quản lý để chứng minh rằng nó không chỉ là một thế hệ kế hoạch xấu trên các trường hợp gần đây hơn mặc dù kể từ khi máy chủ SQL có thể được dựa vào để có được cách cũ ngay trong phiên bản mới hơn. Vì tất cả các trường hợp là các truy vấn bị ràng buộc IO, MAXDOP 1 không bị tổn thương.

+1

Bạn có thể giải thích về những lỗi đó không? –

+2

Tôi đã không thể đủ điều kiện các lỗi, nhưng một đặc biệt: khi một tham gia bên trái được dự kiến ​​sẽ phù hợp với rất ít% hàng sẽ cố gắng để spool cả hai bảng và tham gia vòng lặp hơn là tra cứu chỉ với song song trên. – Joshua

+0

@Joshua, Bạn có biết nếu các lỗi vẫn còn liên quan đến SQL 2012, 14 hoặc 16 phiên bản không? – HappyTown

6

Như một cái gì đó của một sang một bên, MAXDOP có thể rõ ràng được sử dụng như một cách giải quyết một lỗi tiềm ẩn khó chịu:

Returned identity values not always correct

+0

+1 Tôi đã đăng nội dung này ngay bây giờ nếu bạn chưa ... – takrl

+0

liên kết bị lỗi - [mirror] (https: //web.archive.org/web/20130412223343/https: //connect.microsoft.com/SQLServer/feedback/details/328811/scope-identity-sometimes-returns-incorrect-value) – user2426679

0

Thêm hai xu của tôi, dựa trên một vấn đề hiệu suất tôi quan sát.

Nếu các truy vấn đơn giản đang bị phân biệt một cách không cần thiết, nó có thể mang lại nhiều vấn đề hơn là giải quyết vấn đề. Tuy nhiên, trước khi thêm MAXDOP vào truy vấn dưới dạng sửa lỗi "đầu gối", có một số cài đặt máy chủ cần kiểm tra.

Trong Jeremiah Peschka - Five SQL Server Settings to Change, MAXDOP và "COST THRESHOLD FOR PARALLELISM" (CTFP) được đề cập là cài đặt quan trọng cần kiểm tra.

Lưu ý: Paul White đã đề cập max server memory aslo làm cài đặt để kiểm tra, theo trả lời Performance problem after migration from SQL Server 2005 to 2012. Bài viết kb tốt để đọc là Using large amounts of memory can result in an inefficient plan in SQL Server

Jonathan Kehayias - Tuning ‘cost threshold for parallelism’ from the Plan Cache giúp tìm ra giá trị tốt cho CTFP.

Why is cost threshold for parallelism ignored?

Aaron Bertrand - Six reasons you should be nervous about parallelism có một cuộc thảo luận về một số kịch bản mà MAXDOP sự là giải pháp.

Các thành phần ức chế song song được đề cập trong Paul White - Forcing a Parallel Query Execution Plan

Các vấn đề liên quan