Buộc truy cập gói kế hoạch KHÔNG ảnh hưởng đến các truy vấn trên thứ cấp
Sử dụng Query Store để buộc một kế hoạch trên chính chắc chắn trông giống như nó buộc kế hoạch trên thứ cấp.
Tôi đã thử chạy một truy vấn trên một máy chủ không phải là prod, và sau đó sp_query_store_flush_db
xóa kho lưu trữ truy vấn (được yêu cầu để có được dữ liệu để đồng bộ hóa với phụ). Đây là phụ ở bên trái (lưu ý cảnh báo được khoanh tròn về việc "chỉ đọc") và chính ở bên phải:
Bây giờ tôi sẽ nhấp vào "Kế hoạch bắt buộc" ở bên phải và sau đó làm mới cả hai chế độ xem:
Vì vậy, "buộc" ít nhất được thực hiện trong các bảng Cửa hàng Truy vấn cơ bản. Điều này có ý nghĩa, cho rằng các bài viết được trích dẫn trong OP đưa ra quan điểm rằng việc buộc truy vấn sẽ được giữ nguyên sau khi chuyển đổi dự phòng:
Câu hỏi: QDS sẽ giữ lại thông tin Kế hoạch FORCED khi chuyển đổi cơ sở dữ liệu từ bản sao chính sang bản sao phụ?
Trả lời: Có, QDS lưu trữ thông tin Kế hoạch cưỡng bức trong bảng sys.query_store_plan, vì vậy trong trường hợp chuyển đổi dự phòng, bạn sẽ tiếp tục thấy hành vi tương tự trên Chính mới.
Nhưng hành vi cưỡng bức có thực sự diễn ra? Bây giờ tôi sẽ chạy cùng một truy vấn trên cả hai máy chủ. Trên chính, như mong đợi, thuộc tính "UsePlan" có trong kế hoạch XML:
<QueryPlan DegreeOfParallelism="1" MemoryGrant="11096" CachedPlanSize="288" CompileTime="82"
CompileCPU="78" CompileMemory="2104" UsePlan="true">
Và trong giao diện người dùng:
Trên thứ cấp (lưu ý tên máy chủ khác nhau), kế hoạch không bị ép buộc . Đây là đoạn mã XML cùng kế hoạch:
<QueryPlan DegreeOfParallelism="1" MemoryGrant="11096" CachedPlanSize="288" CompileTime="32"
CompileCPU="28" CompileMemory="1656">
Hướng dẫn kế hoạch KHÔNG ảnh hưởng đến các truy vấn trên phụ
Tôi đã tạo một hướng dẫn kế hoạch trên chính bằng mã này (tên bảng đã thay đổi để bảo vệ người vô tội):
EXEC sp_create_plan_guide
@name = 'plan-guide-test',
@stmt = N'SELECT TOP (1000) *
FROM dbo.TableName t
WHERE
NOT EXISTS
(
SELECT NULL
FROM dbo.OtherTable o
WHERE t.Id = o.TableName
);',
@type = N'SQL',
@module_or_batch = NULL,
@hints = N'OPTION (MAXDOP 1)';
Tất nhiên, hướng dẫn kế hoạch có hiệu lực trên chính, bằng chứng là kế hoạch thực hiện:
<StmtSimple StatementCompId="1" StatementEstRows="1000" ... StatementType="SELECT"
PlanGuideDB="..._UAT" PlanGuideName="plan-guide-test" ...>
Tôi đã xác nhận tại thời điểm này rằng hướng dẫn kế hoạch đã được nhân rộng lên thứ cấp.
Chạy cùng một truy vấn trên thứ cấp, kế hoạch thực hiện bị thiếu tất cả các dấu hiệu bị ép buộc bởi một hướng dẫn kế hoạch:
<StmtSimple StatementCompId="1" StatementEstRows="1000" ... StatementType="SELECT"
QueryHash="0xECF8A24F126EE77A" QueryPlanHash="0x0E93CF7FEAC1B6EA"
RetrievedFromCache="true" SecurityPolicyApplied="false">