ai30logo500whitecroped

هیچ محصولی در سبد خرید نیست.

CU12 چه تغییراتی برای SQL Server 2022 داره

cumulativeupdate12 برای SQl Server 2022

در این مقاله به بررسی تغغیرات موجود در cumulativeupdate12 برای SQl Server 2022 میپردازیم
سناریوی هر کدوم رو هم در صورت امکان برای تست در محیط لوکال ارایه میدیم 
نکته اینکه برای سناریو های تست دو تا راه هست 
1) یکی اینکه دو تا Instance  روی دو تا سرور یا VM نصب کرنید یکی شون رو به نسخه قبلی آپدیت کنید و یکی شون رو به نسخه بعدی 

2) یکی دیگه هم میتونید تست ها رو ی روی محیط خودتون قبل از اپدیت انجم بدین و بعد از آپدیت کردن مجددا بررسی کنید 

خب بریم سراغ تغییران این آپدیت 

🧪 Programmability
🔹 2941532 – Scalar UDF Inlining issues

شرح:

مشکلات مربوط به inlining توابع اسکالر که گاهی باعث خطا یا اجرای نادرست می‌شد.

سناریوی تست:

Code

CREATE FUNCTION dbo.SlowFn (@i INT)
RETURNS INT
AS
BEGIN
   
RETURN @i + 1;
END;
GO

— قبل از CU12، این تابع ممکن بود باعث مشکل در اجرای این کوئری بشه:

SELECT dbo.SlowFn(a.object_id) FROM sys.all_objects a;

    • تست تفاوت اجرا با:

Code

SELECT * FROM sys.dm_exec_query_plan(plan_handle) WHERE statement_text LIKE ‘%SlowFn%’

  • بررسی وضعیت inlining قبل و بعد از CU12.

🔹 2961007 – OOM caused by CACHESTORE_PHDR

شرح:

افزایش غیرمنتظره حافظه در cache مربوط به Prepared Handles (PHDR)

سناریوی تست:
 

Code

— آماده‌سازی حجم زیادی از query های prepared به‌صورت دستی:

DECLARE @i INT = 0;
WHILE
@i < 10000
BEGIN
   
EXEC sp_executesql N‘SELECT 1 WHERE 1 = @a’, N‘@a INT’, @i;
   
SET @i += 1;
END

  • قبل از CU12 ممکن بود sys.dm_os_memory_cache_counters رشد غیرعادی برای CACHESTORE_PHDR نشان دهد.
  • بعد از CU12: رشد باید کنترل‌شده‌تر باشد.

🧪 Query Execution

🔹 2833605 – Assertion lobss.cpp:707 (varchar(max), lob not found)

شرح:

در کوئری‌های پیچیده با varchar(max)، خطای assertion ممکن بود رخ بدهد.

سناریوی تست:

Code

CREATE TABLE dbo.TestLob (ID INT, Data VARCHAR(MAX));
INSERT INTO dbo.TestLob VALUES (1, REPLICATE(‘A’, 1000000));

— کوئری پیچیده با UDF یا APPLY
SELECT *
FROM dbo.TestLob t
CROSS APPLY (SELECT LEN(t.Data)) AS ca(len);

  • قبل از CU12 گاهی باعث crash یا dump می‌شد.

🔹 2850899 – Process termination with BLOB cleanup error

شرح:

در صورت وجود خطا در BLOB هنگام shutdown کوئری، ممکن است SQL Server crash کند.

سناریوی تست:

Code

CREATE TABLE dbo.BLOBTest (ID INT, Data VARBINARY(MAX));
INSERT INTO dbo.BLOBTest VALUES (1, 0x010101);

— اجرای کوئری که باعث خطا شود
BEGIN TRY
   
SELECT CAST(Data AS XML) FROM dbo.BLOBTest;  — باعث خطا می‌شود
END TRY
BEGIN CATCH
    PRINT ERROR_MESSAGE();
END CATCH

  • در SQL Server crash لاگ را باید بررسی کرد، مخصوصاً در SQLDump یا ERRORLOG.

🔹 2914479 – Contention on sys.dm_exec_query_statistics_xml

شرح:

زمانی که چند اتصال به طور همزمان این DMV را بخوانند، ممکن است قفل یا کندی ایجاد شود.

سناریوی تست:

  • اجرای اسکریپت همزمان در چند پنجره SSMS:

Code

— اجرا در چند تب همزمان
SELECT * FROM sys.dm_exec_query_statistics_xml(0);

  • قبل از CU12: احتمال افزایش LATCH یا SOS_SCHEDULER_YIELD
  • بعد از CU12: بهبود انتظار قفل‌ها

🧪 Query Optimizer

🔹 2695507 – Parallel Spool باعث نتایج ناسازگار در DML

سناریوی تست:

Code

CREATE TABLE dbo.TestParallel (ID INT PRIMARY KEY, Val INT);
INSERT INTO dbo.TestParallel VALUES (1, 100), (2, 200);

— اجرای UPDATE با شرایطی که ممکن است spool موازی ایجاد کند
UPDATE dbo.TestParallel
SET Val = Val + 10
WHERE ID IN (SELECT ID FROM dbo.TestParallel WHERE Val > 100);

  • بررسی Plan Execution با ACTUAL EXECUTION PLAN
  • قبل از CU12 احتمال داشت نتایج گاهی متفاوت یا ناپایدار باشند.

🔹 2850915 – Access Violation در هنگام Abort در Batch Mode Sort

سناریوی تست:

ایجاد کوئری با ORDER BY در حالت Batch Mode:

Code

CREATE TABLE dbo.SortTest (ID INT, Val INT);
INSERT INTO dbo.SortTest
SELECT TOP (100000) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)), RAND()*1000
FROM sys.all_objects a, sys.all_objects b;

— کوئری با Sort در حالت Batch Mode
SELECT TOP 10 *
FROM dbo.SortTest
ORDER BY Val;

  • قبل از CU12 ممکن بود هنگام لغو کوئری (Cancel) خطای INVALID_POINTER_READ بدهد.
  • بعد از CU12 رفتار پایدارتر و بدون Crash.

🔹 2850932 – Access Violation با Adaptive Join

سناریوی تست:

Code

— جدول‌های کوچک و بزرگ برای فعال‌سازی Adaptive Join
CREATE TABLE dbo.Small (ID INT PRIMARY KEY);
CREATE TABLE dbo.Big (ID INT PRIMARY KEY, Val INT);

INSERT INTO dbo.Small VALUES (1), (2);
INSERT INTO dbo.Big
SELECT TOP (100000) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)), RAND()*1000
FROM sys.all_objects a, sys.all_objects b;

— کوئری با Adaptive Join (در حالت CE جدید)
SELECT *
FROM dbo.Small s
JOIN dbo.Big b
ON s.ID = b.ID
OPTION (USE HINT(
‘ENABLE_ADAPTIVE_JOINS’));

  • در ورژن‌های قبلی ممکن بود در تابع CBpXteHashJoin::FSeparateHash access violation بدهد.

🔹 2890724 – Plan cache dereferencing بدون حذف صحیح Plan

  • CE_FEEDBACK فقط روی Parameter-Sensitive Plan (PSP) کار می‌کنه.
  • این ویژگی در SQL Server 2022 و در Compatibility Level 160 فعال میشه.

Code

ALTER DATABASE [YourDB] SET COMPATIBILITY_LEVEL = 160;

تست:

  • اجرای کوئری با CE Feedback فعال و چندبار اجرای همان کوئری با پارامترهای مختلف:

توضیح کوتاه CE Feedback:

Cardinality Estimator (CE) مسئول تخمین تعداد ردیف‌هایی است که در هر بخش از یک کوئری بازگردانده می‌شود. این تخمین خیلی مهم است چون روی پلن اجرای کوئری تاثیر زیادی می‌گذارد.

CE Feedback قابلیتی است که اجازه می‌دهد SQL Server بازخوردهای واقعی اجرای کوئری را بگیرد و این تخمین‌ها را اصلاح کند تا کوئری‌های بعدی بهینه‌تر اجرا شوند.

چه زمانی مفید است؟

  • وقتی که کوئری‌های شما بر اساس تخمین‌های نادرست (مثلاً خیلی کمتر یا بیشتر تخمین زده شده) کند اجرا می‌شوند.
  • کمک می‌کند که SQL Server خودش یاد بگیرد و در اجرای آینده بهینه‌تر عمل کند.

Code

ALTER DATABASE SCOPED CONFIGURATION SET CE_FEEDBACK = ON;

EXEC sp_executesql N‘SELECT COUNT(*) FROM dbo.Big WHERE Val = @val’, N‘@val INT’, 10;
EXEC sp_executesql N‘SELECT COUNT(*) FROM dbo.Big WHERE Val = @val’, N‘@val INT’, 900;
— تکرار با پارامترهای مختلف

  • مانیتور کردن sys.dm_exec_cached_plans و sys.dm_os_memory_objects
  • بررسی رشد plan cache و مشاهده عدم حذف کامل پلان در ورژن قبلی

🔹 2916821 – Access Violation به دلیل Type Casting اشتباه در CE Feedback

تست:

  • مشابه مورد قبل، اما تمرکز بر ایجاد CE Feedback روی جداول خاص با ستون‌های غیر نرمال مثل computed column

🧪 Replication

🔹 2612953 – Conflict Detection و خطای bigint به int

تست:

— سناریوی ساده conflict merge replication با ستون bigint که ممکن است به int تبدیل شود
— نیاز به تنظیم محیط replication دارد

  • ایجاد جدول با ستون bigint و بررسی رفتار conflict resolution در agent

🔹 2693175 – sp_addsubscription روی Secondary Replica خطا می‌دهد

تست:

  • ایجاد AG (Availability Group) و تلاش برای ایجاد اشتراک روی Secondary با sp_addsubscription
  • مشاهده خطاهای Msg 20032 و 14070 قبل از CU12

🔹 2864330 – replmerg.exe با پارامتر MakeGenerationInterval

تست:

  • اجرای replmerg.exe با پارامتر custom در MakeGenerationInterval و بررسی لاگ برای عملکرد صحیح

🔹 2870454 – sp_helpsubscription خروجی نمی‌دهد بعد از in-place upgrade

تست:

  • پس از in-place upgrade به SQL Server 2022، اجرای:

Code

EXEC sp_helpsubscription;

  • مشاهده می‌کنید که نتیجه خالی است قبل از CU12 – این باگ رفع شده.

🔹 2870518 – ستون _$update_bitmap تطابق ندارد با ساختار جدول

تست:

  • ایجاد سناریوی peer-to-peer replication و تغییر در ساختار جدول اصلی (افزایش ستون)
  • بررسی خطای truncation توسط Agent

🔹 2929215 – خطای 18482 هنگام تعریف Distributor با نام کوچک و collation حساس

تست:

  • شبیه‌سازی محیطی با collation حساس روی Distributor (مثل Latin1_General_CS_AS) و نام Publisher کوچک (مثلاً sqlpub)
  • اجرای sp_adddistributor و مشاهده خطای 18482

اگر اوکی هست، بخش بعدی یعنی Search، Security، SQL OS و سایر بخش‌ها رو ادامه بدم؟

🔍 Search

🔹 2877337 – اضافه شدن فیلدهای جدید به XEvent مربوط به fulltext_filter_usage

سناریوی تست:

Code

— فعال‌سازی XEvent جدید
CREATE EVENT SESSION [fts_usage_test] ON SERVER
ADD EVENT sqlserver.fulltext_filter_usage
(
    ACTION(sqlserver.sql_text)
)
ADD TARGET package0.event_file (SET filename = N‘fts_usage_test.xel’)
WITH (STARTUP_STATE = OFF);
GO

ALTER EVENT SESSION [fts_usage_test] ON SERVER STATE = START;
— اجرای جست‌وجوی Full-Text برای ثبت event
SELECT * FROM dbo.MyFullTextTable WHERE CONTAINS(MyColumn, ‘test’);
ALTER EVENT SESSION [fts_usage_test] ON SERVER STATE = STOP;

  • بعد از اجرای جستجو، فایل .xel را در SSMS باز کنید و فیلدهای جدید min_input_sizemax_input_sizemin_output_sizemax_output_size را بررسی کنید.

🔹 2956576 – مشکل overflow در full-text merging

تست:

  • راه‌اندازی index و جمع‌آوری حجم زیادی از داده‌ها که باعث merge شود (با ردیابی via sys.dm_fts_index_population)
  • قبل از CU12، ممکن بود در شرایط خاص با داده‌های پرتکرار، overflow رخ دهد

🔐 Security

🔹 2917001 – پشتیبانی از iterated و salted hash password verifiers

تست:

  • فقط در CU12 و بالاتر فعال است. اگر از custom membership providers یا داخلی SQL Server password hash ها استفاده می‌کنید:

Code

— ایجاد لاگین جدید
CREATE LOGIN test_user WITH PASSWORD = ‘StrongP@ssw0rd!’;
— بررسی نوع hash در sys.sql_logins ممکن نیست مستقیماً، اما رفتار رمزنگاری سخت‌تر خواهد شد.

  • با فعال بودن این آپدیت، امنیت ذخیره‌سازی پسورد افزایش یافته، اما تست مستقیم نیاز به ابزار خارجی دارد.

⚙ SQL OS

🔹 2830811 – Trace flag 2616 برای جلوگیری از dump تکراری

تست:

Code

— فعال‌سازی TF جدید
DBCC TRACEON (
2616, -1);
— شبیه‌سازی crash (مثلاً با overflow یا کوئری مشکل‌دار)

  • لاگ را چک کنید: در صورت فعال بودن این TF، فقط یک بار dump برای یک exception خاص ایجاد می‌شود.

🔹 2899892 – بهبود در dump فشرده‌شده (Compressed Memory Dump)

تست:

  • نیاز به راه‌اندازی وضعیت بحرانی (مثلاً OOM یا memory pressure شدید)
  • بررسی استفاده از FILE_FLAG_NO_BUFFERING در لاگ
  • مشاهده بهبود I/O و CPU برای dump فایل‌ها نسبت به نسخه قبل

🔹 2956541 – پیام خطای دقیق‌تر برای azure blob targets نامعتبر

تست:

Code

— ایجاد Extended Events با target اشتباه روی Azure Blob
CREATE EVENT SESSION test_xe ON SERVER
ADD EVENT sqlserver.sql_batch_completed
ADD TARGET package0.event_file (
   
SET filename = N‘https://invalid.blob.core.windows.net/xe/invalid.xel’,
    max_file_size=(
5)
);

  • در CU12، پیغام خطا دقیق‌تر مانند: “invalid or expired credentials” را دریافت می‌کنید.

💽 Storage Management

🔹 2153698 – اضافه شدن لینک راهنما به خطای 824

تست:

— تزریق خطای منطقی با ابزار DBCC WRITEPAGE یا استفاده از دیسک معیوب در محیط تست (بسیار بااحتیاط)
— اجرای DBCC CHECKDB یا کوئری روی صفحه آسیب‌دیده

🧱 Table Index Partition

🔹 2766481 – رفع Access Violation هنگام RESUME کردن عملیات REBUILD

تست:

Code

— ایجاد جدول پارتیشن‌بندی‌شده و اجرای REBUILD با RESUME
ALTER INDEX [PK_Test] ON dbo.PartitionedTable REBUILD PARTITION = ALL
WITH (ONLINE = ON, MAX_DURATION = 1, RESUME = ON);

  • قبل از CU12، اجرای RESUME بعد از قطع عملیات گاهی باعث Access Violation می‌شد.

اگر آماده‌ای، در مرحله آخر بریم سراغ بخش Transaction Services و مورد باقی‌مانده از Availability Group. بریم؟

🔄 Transaction Services

🔹 2820084 – رفع مشکل non-yielding scheduler به‌علت contention در Redo Manager روی secondary replica

شرح:

در برخی سناریوها، وقتی حجم بالایی از عملیات لاگ به‌صورت هم‌زمان روی Secondary Replica در Availability Group در حال Redo شدن است، contention روی Redo Manager باعث ایجاد non-yielding scheduler می‌شود و SQL Server پاسخ نمی‌دهد.

✅ سناریوی تست پیشنهادی:

پیش‌نیاز:

  • یک Availability Group با حداقل یک Secondary Replica راه‌اندازی شود.
  • قابلیت readable secondary فعال باشد.
  • بررسی این‌که نسخه SQL Server روی هر دو نود CU12 باشد.

مراحل تست:

Code

اجرای حجم بالای تراکنش روی Primary:

USE TestDB;
GO
BEGIN TRAN;
DECLARE @i INT = 0;
WHILE
@i < 100000
BEGIN
   
INSERT INTO BigLogTable (Col1, Col2) VALUES (NEWID(), REPLICATE(‘X’, 100));
   
SET @i += 1;
END
COMMIT;

Code

بررسی رفتار Secondary:

  • مانیتور لاگ مربوط به Redo Manager از طریق DMV زیر:

SELECT * FROM sys.dm_hadr_database_replica_states
WHERE is_primary_replica = 0;

همچنین بررسی پیام‌های non-yielding scheduler در SQL Error Log روی Secondary:
EXEC xp_readerrorlog 0, 1, N‘non-yielding’;

  1.  

پیش از CU12: اگر contention روی redo threads زیاد باشد، ممکن بود سرور قفل کند یا پیام‌های critical non-yielding دریافت شود.

پس از CU12: رفتار باید پایدارتر باشد و contention روی Redo کاهش یابد.

اگر خواستی، می‌تونم یک اسکریپت PowerShell یا T-SQL مانیتورینگ Redo Queue و Lag هم بهت بدم که بتونی دقیق‌تر رفتار رو در لحظه بررسی کنی. مایلی؟

🛠️ اسکریپت مانیتورینگ Redo Queue / Redo Lag روی Secondary Replica

Code

— اجرا روی نود Secondary
SELECT
    DB_NAME(database_id)
AS [DatabaseName],
    redo_queue_size
AS [RedoQueueSize_KB],
    redo_rate
AS [RedoRate_KBps],
    DATEDIFF(
SECOND, last_redone_time, GETDATE()) AS [RedoLag_Seconds],
    last_redone_lsn,
    last_redone_time,
    is_suspended,
    synchronization_state_desc
FROM sys.dm_hadr_database_replica_states
WHERE is_primary_replica = 0;

این خروجی را با حالت قبل از CU12 مقایسه کن. در صورت بروز مشکل، RedoLag_Seconds یا RedoQueueSize_KB بالا می‌مانند و در نهایت ممکن است Non-yielding رخ دهد. پس از CU12، وضعیت پایدارتر خواهد بود.

حالا بریم سراغ مورد نهایی در CU12:

📌 SQL Server Agent

🔹 2907888 – رفع خطایی که باعث termination شدن SQL Server Agent می‌شد:

پیام خطا:

php

Code

Exception 5 caught at line <LineNumber> of file <FileName>. SQLServerAgent initiating self-termination.

✅ سناریوی تست:

پیش‌نیاز:

  • یک job با stepهای متفاوت (T-SQL, PowerShell, SSIS Package)

مراحل تست:

  1. ساخت یک job با step زیر (مثلاً اجرای یک فایل اشتباه PowerShell):

Code

USE msdb;
GO
EXEC sp_add_job @job_name = N‘TestAgentFailure’;
EXEC sp_add_jobstep
   
@job_name = N‘TestAgentFailure’,
   
@step_name = N‘FailingStep’,
   
@subsystem = N‘PowerShell’,
   
@command = N‘Write-Host “Start”; throw “Crash!”‘,
   
@on_fail_action = 1; — Quit with failure

  1. اجرای job:

Code

EXEC sp_start_job @job_name = N‘TestAgentFailure’;

  1. بررسی اینکه Agent همچنان در حال اجرا باقی می‌ماند:

Code

— بررسی وضعیت سرویس
EXEC xp_servicecontrol ‘QUERYSTATE’, ‘SQLServerAgent’;

پیش از CU12:

در برخی شرایط خاص، Agent به علت exception داخلی از کار می‌افتاد.

پس از CU12:

Agent باید بدون کرش، فقط step را fail کند و log مناسب بنویسد.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *