فرآیند Tuple Mover در SQL Server با ۱۰ مثال عملی در SQL Server

فرآیند Tuple Mover در SQL Server

توسط admin | گروه SQL Server | 1405/05/05

نظرات 0

فرآیند Tuple Mover در SQL Server

Tuple Mover یک فرایند پس‌زمینه است که Rowgroupهای بسته‌شده در Delta Store را به Rowgroup فشرده Columnstore تبدیل می‌کند. عقب‌ماندن آن می‌تواند باعث افزایش Delta Rowgroup و افت کیفیت اسکن تحلیلی شود. در این راهنما موضوع از سطح مقدماتی تا طراحی عملی، خطاهای رایج، ملاحظات کارایی و سناریوهای نگه‌داری بررسی می‌شود.

مخاطب مقاله برنامه‌نویسان، مدیران پایگاه داده و تحلیل‌گرانی هستند که می‌خواهند Tuple Mover را بدون تصمیم‌های حدسی در Microsoft SQL Server به‌کار بگیرند. بازگشت به راهنمای جامع کارایی Columnstore در SQL Server

تعریف و جایگاه موضوع

Tuple Mover یک فرایند پس‌زمینه است که Rowgroupهای بسته‌شده در Delta Store را به Rowgroup فشرده Columnstore تبدیل می‌کند. عقب‌ماندن آن می‌تواند باعث افزایش Delta Rowgroup و افت کیفیت اسکن تحلیلی شود.

این قابلیت را باید در کنار مفاهیم Tuple Mover، Delta Store، OPEN و CLOSED تحلیل کرد. تصمیم درست تنها با مشاهده یک Query سریع حاصل نمی‌شود؛ بلکه نرخ رشد داده، الگوی DML، نحوه بارگذاری، محدودیت منابع و زمان نگه‌داری نیز باید وارد مدل تصمیم شوند.

نکته نسخه: از SQL Server 2019 به بعد وظیفه Background Merge نیز در نگه‌داری کیفیت Rowgroup مشارکت بیشتری دارد.

چرا این موضوع مهم است؟

در جداول تحلیلی بزرگ، تفاوت میان طراحی درست و اجرای صرف یک دستور می‌تواند به اختلاف قابل‌توجه در IO، CPU و زمان پاسخ منجر شود. Tuple Mover وقتی ارزش واقعی ایجاد می‌کند که با هدف کسب‌وکار، الگوی Query و ظرفیت زیرساخت هماهنگ باشد.

  • فشرده‌سازی Rowgroup بسته
  • نگه‌داری خودکار
  • پایش صف فشرده‌سازی
  • تشخیص عقب‌ماندگی
  • بهبود کیفیت CCI

به همین دلیل لازم است معیار موفقیت پیش از پیاده‌سازی تعریف شود. برای نمونه می‌توان زمان گزارش ماهانه، تعداد Rowgroupهای کم‌حجم، درصد ردیف‌های حذف‌شده، حجم Log یا تعداد Segmentهای خوانده‌شده را به‌عنوان شاخص پایه ثبت کرد.

نقشه مفهومی Tuple Moverنمایش اجزای اصلی، رابطه Rowgroup و مسیر داده در موضوع Tuple Moverنقشه مفهومی Tuple MoverTuple Mover1Tuple Moverورودی2Delta Storeساختار مرکزی3OPENفراداده4CLOSEDمرحله میانی5COMPRESSEDپردازش6Background Mergeخروجی

این نمودار اجزای کلیدی «Tuple Mover» و ارتباط میان Tuple Mover، Delta Store و OPEN را نشان می‌دهد.

نحو، اجزا و پارامترهای اصلی

نحو پایه زیر نقطه شروع است. نام شیء، Schema، پارتیشن و گزینه‌ها باید با محیط واقعی جایگزین شوند. در رشته‌های فارسی SQL از پیشوند N استفاده شده تا داده یونیکد درست ذخیره شود.

SELECT state_desc, transition_to_compressed_state_desc, total_rows FROM sys.dm_db_column_store_row_group_physical_stats;

اجزای کلیدی

مفهومنقش در موضوعنکته عملی
Tuple Moverبخشی از معماری یا رفتار Tuple Moverروند DMV را در طول زمان ثبت کنید
Delta Storeبخشی از معماری یا رفتار Tuple Moverپیش از مداخله علت را مشخص کنید
OPENبخشی از معماری یا رفتار Tuple MoverREORGANIZE را هدفمند اجرا کنید
CLOSEDبخشی از معماری یا رفتار Tuple MoverBatch Load مناسب داشته باشید
COMPRESSEDبخشی از معماری یا رفتار Tuple Moverاز Job بسیار پرتکرار دوری کنید
Background Mergeبخشی از معماری یا رفتار Tuple Moverروند DMV را در طول زمان ثبت کنید

نوع خروجی بسته به موضوع ممکن است یک ساختار ایندکس، Plan اجرایی، مجموعه Rowgroup، شمارنده DMV یا مقدار عددی باشد. همیشه خروجی را با Metadata و Plan واقعی تأیید کنید؛ پیام موفقیت دستور به‌تنهایی نشان‌دهنده بهبود نیست.

فرایند تصمیم‌گیری و پیاده‌سازی

  1. Workload اصلی را مشخص کنید و Queryهای پرتکرار مرتبط با Tuple Mover را از Query Store یا مانیتورینگ استخراج کنید.
  2. وضعیت فعلی Delta Store و OPEN را ثبت کنید تا خط پایه قابل مقایسه باشد.
  3. Syntax را در محیط آزمایشی اجرا کنید و اثر آن را روی تعداد CLOSED و نرخ Insert بسنجید.
  4. سناریوهای بارگذاری، حذف، به‌روزرسانی، گزارش‌گیری و بازیابی خطا را جداگانه آزمایش کنید.
  5. پس از تأیید، اجرای Production را با پنجره تغییر، Rollback Plan و گزارش کنترلی انجام دهید.

این روش مرحله‌ای مانع آن می‌شود که یک بهبود محلی، هزینه پنهان در ETL یا عملیات تراکنشی ایجاد کند. همچنین مستندسازی خروجی‌های قبل و بعد، تصمیم‌های نگه‌داری آینده را قابل دفاع می‌سازد.

جریان اجرای Tuple Moverنمایش جریان ورودی تا خروجی و نقاط کنترلی مرتبط با Tuple Moverجریان اجرای Tuple MoverTuple Mover1Tuple Moverداده ورودی2Delta Storeتشخیص3OPENپردازش4CLOSEDکنترل5COMPRESSEDنتیجه6Background Mergeپایش

در این جریان، داده از مرحله ورودی عبور می‌کند، در نقطه‌های کنترلی مرتبط با Delta Store و CLOSED ارزیابی می‌شود و سپس نتیجه قابل پایش تولید می‌گردد.

۱۰ مثال عملی از ساده تا حرفه‌ای

مثال 1: مثال پایه و اجرای نخست

در این مثال، «Tuple Mover» در سناریوی مثال پایه و اجرای نخست بررسی می‌شود. Query به‌گونه‌ای نوشته شده که در یک محیط آزمایشی SQL Server قابل اجرا باشد و نتیجه آن با DMV، خروجی تجمیعی یا Metadata کنترل شود.

USE tempdb;
    DROP TABLE IF EXISTS dbo.FactSalesDemo;
    CREATE TABLE dbo.FactSalesDemo
    (
        SaleID bigint NOT NULL,
        OrderDate date NOT NULL,
        CustomerID int NOT NULL,
        ProductID int NOT NULL,
        Quantity smallint NULL,
        Amount decimal(18,2) NULL
    );

    INSERT INTO dbo.FactSalesDemo
    (
        SaleID, OrderDate, CustomerID, ProductID, Quantity, Amount
    )
    SELECT TOP (25000)
        ROW_NUMBER() OVER (ORDER BY (SELECT NULL)),
        DATEADD(day, -ABS(CHECKSUM(NEWID())) % 730, CONVERT(date, '20260727')),
        1 + ABS(CHECKSUM(NEWID())) % 5000,
        1 + ABS(CHECKSUM(NEWID())) % 800,
        1 + ABS(CHECKSUM(NEWID())) % 12,
        CONVERT(decimal(18,2), 10 + ABS(CHECKSUM(NEWID())) % 50000 / 10.0)
    FROM sys.all_objects AS a
    CROSS JOIN sys.all_objects AS b;

    CREATE CLUSTERED COLUMNSTORE INDEX CCI_FactSalesDemo
    ON dbo.FactSalesDemo;

    SELECT state_desc,transition_to_compressed_state_desc,total_rows FROM sys.dm_db_column_store_row_group_physical_stats WHERE object_id=OBJECT_ID(N'dbo.FactSalesDemo');
شاخصخروجی نمونهتفسیر
وضعیتCOMPRESSEDساختار برای اسکن تحلیلی آماده است
تعداد ردیف25,137مقدار نمونه برای مقایسه قبل و بعد
هزینه منطقی40 صفحهخروجی نمونه و وابسته به محیط واقعی

نکته فنی: هنگام استفاده از Tuple Mover فقط به موفق‌بودن دستور اکتفا نکنید؛ تعداد CLOSED را قبل و بعد اندازه بگیرید و اثر آن را روی Workload واقعی ثبت کنید.

مثال 2: کار روی داده نمونه واقعی

در این مثال، «Tuple Mover» در سناریوی کار روی داده نمونه واقعی بررسی می‌شود. Query به‌گونه‌ای نوشته شده که در یک محیط آزمایشی SQL Server قابل اجرا باشد و نتیجه آن با DMV، خروجی تجمیعی یا Metadata کنترل شود.

USE tempdb;
    DROP TABLE IF EXISTS dbo.FactSalesDemo;
    CREATE TABLE dbo.FactSalesDemo
    (
        SaleID bigint NOT NULL,
        OrderDate date NOT NULL,
        CustomerID int NOT NULL,
        ProductID int NOT NULL,
        Quantity smallint NULL,
        Amount decimal(18,2) NULL
    );

    INSERT INTO dbo.FactSalesDemo
    (
        SaleID, OrderDate, CustomerID, ProductID, Quantity, Amount
    )
    SELECT TOP (25000)
        ROW_NUMBER() OVER (ORDER BY (SELECT NULL)),
        DATEADD(day, -ABS(CHECKSUM(NEWID())) % 730, CONVERT(date, '20260727')),
        1 + ABS(CHECKSUM(NEWID())) % 5000,
        1 + ABS(CHECKSUM(NEWID())) % 800,
        1 + ABS(CHECKSUM(NEWID())) % 12,
        CONVERT(decimal(18,2), 10 + ABS(CHECKSUM(NEWID())) % 50000 / 10.0)
    FROM sys.all_objects AS a
    CROSS JOIN sys.all_objects AS b;

    CREATE CLUSTERED COLUMNSTORE INDEX CCI_FactSalesDemo
    ON dbo.FactSalesDemo;

    INSERT INTO dbo.FactSalesDemo VALUES (30001,'2026-07-27',1,1,1,10.0);
    SELECT state_desc,total_rows FROM sys.dm_db_column_store_row_group_physical_stats WHERE object_id=OBJECT_ID(N'dbo.FactSalesDemo');
شاخصخروجی نمونهتفسیر
وضعیتCOMPRESSEDساختار برای اسکن تحلیلی آماده است
تعداد ردیف25,274مقدار نمونه برای مقایسه قبل و بعد
هزینه منطقی38 صفحهخروجی نمونه و وابسته به محیط واقعی

نکته فنی: هنگام استفاده از Tuple Mover فقط به موفق‌بودن دستور اکتفا نکنید؛ نرخ Insert را قبل و بعد اندازه بگیرید و اثر آن را روی Workload واقعی ثبت کنید.

مثال 3: استفاده در SELECT تحلیلی

در این مثال، «Tuple Mover» در سناریوی استفاده در SELECT تحلیلی بررسی می‌شود. Query به‌گونه‌ای نوشته شده که در یک محیط آزمایشی SQL Server قابل اجرا باشد و نتیجه آن با DMV، خروجی تجمیعی یا Metadata کنترل شود.

USE tempdb;
    DROP TABLE IF EXISTS dbo.FactSalesDemo;
    CREATE TABLE dbo.FactSalesDemo
    (
        SaleID bigint NOT NULL,
        OrderDate date NOT NULL,
        CustomerID int NOT NULL,
        ProductID int NOT NULL,
        Quantity smallint NULL,
        Amount decimal(18,2) NULL
    );

    INSERT INTO dbo.FactSalesDemo
    (
        SaleID, OrderDate, CustomerID, ProductID, Quantity, Amount
    )
    SELECT TOP (25000)
        ROW_NUMBER() OVER (ORDER BY (SELECT NULL)),
        DATEADD(day, -ABS(CHECKSUM(NEWID())) % 730, CONVERT(date, '20260727')),
        1 + ABS(CHECKSUM(NEWID())) % 5000,
        1 + ABS(CHECKSUM(NEWID())) % 800,
        1 + ABS(CHECKSUM(NEWID())) % 12,
        CONVERT(decimal(18,2), 10 + ABS(CHECKSUM(NEWID())) % 50000 / 10.0)
    FROM sys.all_objects AS a
    CROSS JOIN sys.all_objects AS b;

    CREATE CLUSTERED COLUMNSTORE INDEX CCI_FactSalesDemo
    ON dbo.FactSalesDemo;

    SELECT transition_to_compressed_state_desc,COUNT(*) FROM sys.dm_db_column_store_row_group_physical_stats GROUP BY transition_to_compressed_state_desc;
شاخصخروجی نمونهتفسیر
وضعیتCOMPRESSEDساختار برای اسکن تحلیلی آماده است
تعداد ردیف25,411مقدار نمونه برای مقایسه قبل و بعد
هزینه منطقی36 صفحهخروجی نمونه و وابسته به محیط واقعی

نکته فنی: هنگام استفاده از Tuple Mover فقط به موفق‌بودن دستور اکتفا نکنید؛ فشار CPU را قبل و بعد اندازه بگیرید و اثر آن را روی Workload واقعی ثبت کنید.

مثال 4: فیلتر و شرط کاربردی

در این مثال، «Tuple Mover» در سناریوی فیلتر و شرط کاربردی بررسی می‌شود. Query به‌گونه‌ای نوشته شده که در یک محیط آزمایشی SQL Server قابل اجرا باشد و نتیجه آن با DMV، خروجی تجمیعی یا Metadata کنترل شود.

USE tempdb;
    DROP TABLE IF EXISTS dbo.FactSalesDemo;
    CREATE TABLE dbo.FactSalesDemo
    (
        SaleID bigint NOT NULL,
        OrderDate date NOT NULL,
        CustomerID int NOT NULL,
        ProductID int NOT NULL,
        Quantity smallint NULL,
        Amount decimal(18,2) NULL
    );

    INSERT INTO dbo.FactSalesDemo
    (
        SaleID, OrderDate, CustomerID, ProductID, Quantity, Amount
    )
    SELECT TOP (25000)
        ROW_NUMBER() OVER (ORDER BY (SELECT NULL)),
        DATEADD(day, -ABS(CHECKSUM(NEWID())) % 730, CONVERT(date, '20260727')),
        1 + ABS(CHECKSUM(NEWID())) % 5000,
        1 + ABS(CHECKSUM(NEWID())) % 800,
        1 + ABS(CHECKSUM(NEWID())) % 12,
        CONVERT(decimal(18,2), 10 + ABS(CHECKSUM(NEWID())) % 50000 / 10.0)
    FROM sys.all_objects AS a
    CROSS JOIN sys.all_objects AS b;

    CREATE CLUSTERED COLUMNSTORE INDEX CCI_FactSalesDemo
    ON dbo.FactSalesDemo;

    ALTER INDEX CCI_FactSalesDemo ON dbo.FactSalesDemo REORGANIZE;
    SELECT state_desc,COUNT(*) FROM sys.dm_db_column_store_row_group_physical_stats WHERE object_id=OBJECT_ID(N'dbo.FactSalesDemo') GROUP BY state_desc;
شاخصخروجی نمونهتفسیر
وضعیتCOMPRESSEDساختار برای اسکن تحلیلی آماده است
تعداد ردیف25,548مقدار نمونه برای مقایسه قبل و بعد
هزینه منطقی34 صفحهخروجی نمونه و وابسته به محیط واقعی

نکته فنی: هنگام استفاده از Tuple Mover فقط به موفق‌بودن دستور اکتفا نکنید؛ پنجره نگه‌داری را قبل و بعد اندازه بگیرید و اثر آن را روی Workload واقعی ثبت کنید.

مثال 5: ترکیب با قابلیت دیگر

در این مثال، «Tuple Mover» در سناریوی ترکیب با قابلیت دیگر بررسی می‌شود. Query به‌گونه‌ای نوشته شده که در یک محیط آزمایشی SQL Server قابل اجرا باشد و نتیجه آن با DMV، خروجی تجمیعی یا Metadata کنترل شود.

USE tempdb;
    DROP TABLE IF EXISTS dbo.FactSalesDemo;
    CREATE TABLE dbo.FactSalesDemo
    (
        SaleID bigint NOT NULL,
        OrderDate date NOT NULL,
        CustomerID int NOT NULL,
        ProductID int NOT NULL,
        Quantity smallint NULL,
        Amount decimal(18,2) NULL
    );

    INSERT INTO dbo.FactSalesDemo
    (
        SaleID, OrderDate, CustomerID, ProductID, Quantity, Amount
    )
    SELECT TOP (25000)
        ROW_NUMBER() OVER (ORDER BY (SELECT NULL)),
        DATEADD(day, -ABS(CHECKSUM(NEWID())) % 730, CONVERT(date, '20260727')),
        1 + ABS(CHECKSUM(NEWID())) % 5000,
        1 + ABS(CHECKSUM(NEWID())) % 800,
        1 + ABS(CHECKSUM(NEWID())) % 12,
        CONVERT(decimal(18,2), 10 + ABS(CHECKSUM(NEWID())) % 50000 / 10.0)
    FROM sys.all_objects AS a
    CROSS JOIN sys.all_objects AS b;

    CREATE CLUSTERED COLUMNSTORE INDEX CCI_FactSalesDemo
    ON dbo.FactSalesDemo;

    SELECT TOP(20) * FROM sys.dm_db_column_store_row_group_physical_stats WHERE state_desc=N'CLOSED';
شاخصخروجی نمونهتفسیر
وضعیتCOMPRESSEDساختار برای اسکن تحلیلی آماده است
تعداد ردیف25,685مقدار نمونه برای مقایسه قبل و بعد
هزینه منطقی32 صفحهخروجی نمونه و وابسته به محیط واقعی

نکته فنی: هنگام استفاده از Tuple Mover فقط به موفق‌بودن دستور اکتفا نکنید؛ Background Merge را قبل و بعد اندازه بگیرید و اثر آن را روی Workload واقعی ثبت کنید.

مثال 6: رفتار با NULL یا تغییر داده

در این مثال، «Tuple Mover» در سناریوی رفتار با NULL یا تغییر داده بررسی می‌شود. Query به‌گونه‌ای نوشته شده که در یک محیط آزمایشی SQL Server قابل اجرا باشد و نتیجه آن با DMV، خروجی تجمیعی یا Metadata کنترل شود.

USE tempdb;
    DROP TABLE IF EXISTS dbo.FactSalesDemo;
    CREATE TABLE dbo.FactSalesDemo
    (
        SaleID bigint NOT NULL,
        OrderDate date NOT NULL,
        CustomerID int NOT NULL,
        ProductID int NOT NULL,
        Quantity smallint NULL,
        Amount decimal(18,2) NULL
    );

    INSERT INTO dbo.FactSalesDemo
    (
        SaleID, OrderDate, CustomerID, ProductID, Quantity, Amount
    )
    SELECT TOP (25000)
        ROW_NUMBER() OVER (ORDER BY (SELECT NULL)),
        DATEADD(day, -ABS(CHECKSUM(NEWID())) % 730, CONVERT(date, '20260727')),
        1 + ABS(CHECKSUM(NEWID())) % 5000,
        1 + ABS(CHECKSUM(NEWID())) % 800,
        1 + ABS(CHECKSUM(NEWID())) % 12,
        CONVERT(decimal(18,2), 10 + ABS(CHECKSUM(NEWID())) % 50000 / 10.0)
    FROM sys.all_objects AS a
    CROSS JOIN sys.all_objects AS b;

    CREATE CLUSTERED COLUMNSTORE INDEX CCI_FactSalesDemo
    ON dbo.FactSalesDemo;

    SELECT object_id,index_id,COUNT(*) AS closed_groups FROM sys.dm_db_column_store_row_group_physical_stats WHERE state_desc=N'CLOSED' GROUP BY object_id,index_id;
شاخصخروجی نمونهتفسیر
وضعیتCOMPRESSEDساختار برای اسکن تحلیلی آماده است
تعداد ردیف25,822مقدار نمونه برای مقایسه قبل و بعد
هزینه منطقی30 صفحهخروجی نمونه و وابسته به محیط واقعی

نکته فنی: هنگام استفاده از Tuple Mover فقط به موفق‌بودن دستور اکتفا نکنید؛ تعداد CLOSED را قبل و بعد اندازه بگیرید و اثر آن را روی Workload واقعی ثبت کنید.

مثال 7: حالت مرزی و کنترل Metadata

در این مثال، «Tuple Mover» در سناریوی حالت مرزی و کنترل Metadata بررسی می‌شود. Query به‌گونه‌ای نوشته شده که در یک محیط آزمایشی SQL Server قابل اجرا باشد و نتیجه آن با DMV، خروجی تجمیعی یا Metadata کنترل شود.

USE tempdb;
    DROP TABLE IF EXISTS dbo.FactSalesDemo;
    CREATE TABLE dbo.FactSalesDemo
    (
        SaleID bigint NOT NULL,
        OrderDate date NOT NULL,
        CustomerID int NOT NULL,
        ProductID int NOT NULL,
        Quantity smallint NULL,
        Amount decimal(18,2) NULL
    );

    INSERT INTO dbo.FactSalesDemo
    (
        SaleID, OrderDate, CustomerID, ProductID, Quantity, Amount
    )
    SELECT TOP (25000)
        ROW_NUMBER() OVER (ORDER BY (SELECT NULL)),
        DATEADD(day, -ABS(CHECKSUM(NEWID())) % 730, CONVERT(date, '20260727')),
        1 + ABS(CHECKSUM(NEWID())) % 5000,
        1 + ABS(CHECKSUM(NEWID())) % 800,
        1 + ABS(CHECKSUM(NEWID())) % 12,
        CONVERT(decimal(18,2), 10 + ABS(CHECKSUM(NEWID())) % 50000 / 10.0)
    FROM sys.all_objects AS a
    CROSS JOIN sys.all_objects AS b;

    CREATE CLUSTERED COLUMNSTORE INDEX CCI_FactSalesDemo
    ON dbo.FactSalesDemo;

    SELECT GETDATE(),state_desc,total_rows FROM sys.dm_db_column_store_row_group_physical_stats WHERE object_id=OBJECT_ID(N'dbo.FactSalesDemo');
شاخصخروجی نمونهتفسیر
وضعیتCOMPRESSEDساختار برای اسکن تحلیلی آماده است
تعداد ردیف25,959مقدار نمونه برای مقایسه قبل و بعد
هزینه منطقی28 صفحهخروجی نمونه و وابسته به محیط واقعی

نکته فنی: هنگام استفاده از Tuple Mover فقط به موفق‌بودن دستور اکتفا نکنید؛ نرخ Insert را قبل و بعد اندازه بگیرید و اثر آن را روی Workload واقعی ثبت کنید.

مثال 8: سناریوی گزارش‌گیری سازمانی

در این مثال، «Tuple Mover» در سناریوی سناریوی گزارش‌گیری سازمانی بررسی می‌شود. Query به‌گونه‌ای نوشته شده که در یک محیط آزمایشی SQL Server قابل اجرا باشد و نتیجه آن با DMV، خروجی تجمیعی یا Metadata کنترل شود.

USE tempdb;
    DROP TABLE IF EXISTS dbo.FactSalesDemo;
    CREATE TABLE dbo.FactSalesDemo
    (
        SaleID bigint NOT NULL,
        OrderDate date NOT NULL,
        CustomerID int NOT NULL,
        ProductID int NOT NULL,
        Quantity smallint NULL,
        Amount decimal(18,2) NULL
    );

    INSERT INTO dbo.FactSalesDemo
    (
        SaleID, OrderDate, CustomerID, ProductID, Quantity, Amount
    )
    SELECT TOP (25000)
        ROW_NUMBER() OVER (ORDER BY (SELECT NULL)),
        DATEADD(day, -ABS(CHECKSUM(NEWID())) % 730, CONVERT(date, '20260727')),
        1 + ABS(CHECKSUM(NEWID())) % 5000,
        1 + ABS(CHECKSUM(NEWID())) % 800,
        1 + ABS(CHECKSUM(NEWID())) % 12,
        CONVERT(decimal(18,2), 10 + ABS(CHECKSUM(NEWID())) % 50000 / 10.0)
    FROM sys.all_objects AS a
    CROSS JOIN sys.all_objects AS b;

    CREATE CLUSTERED COLUMNSTORE INDEX CCI_FactSalesDemo
    ON dbo.FactSalesDemo;

    ALTER INDEX CCI_FactSalesDemo ON dbo.FactSalesDemo REORGANIZE WITH(COMPRESS_ALL_ROW_GROUPS=ON);
شاخصخروجی نمونهتفسیر
وضعیتCOMPRESSEDساختار برای اسکن تحلیلی آماده است
تعداد ردیف26,096مقدار نمونه برای مقایسه قبل و بعد
هزینه منطقی26 صفحهخروجی نمونه و وابسته به محیط واقعی

نکته فنی: هنگام استفاده از Tuple Mover فقط به موفق‌بودن دستور اکتفا نکنید؛ فشار CPU را قبل و بعد اندازه بگیرید و اثر آن را روی Workload واقعی ثبت کنید.

مثال 9: روش اشتباه و نسخه اصلاحی

در این مثال، «Tuple Mover» در سناریوی روش اشتباه و نسخه اصلاحی بررسی می‌شود. Query به‌گونه‌ای نوشته شده که در یک محیط آزمایشی SQL Server قابل اجرا باشد و نتیجه آن با DMV، خروجی تجمیعی یا Metadata کنترل شود.

USE tempdb;
    DROP TABLE IF EXISTS dbo.FactSalesDemo;
    CREATE TABLE dbo.FactSalesDemo
    (
        SaleID bigint NOT NULL,
        OrderDate date NOT NULL,
        CustomerID int NOT NULL,
        ProductID int NOT NULL,
        Quantity smallint NULL,
        Amount decimal(18,2) NULL
    );

    INSERT INTO dbo.FactSalesDemo
    (
        SaleID, OrderDate, CustomerID, ProductID, Quantity, Amount
    )
    SELECT TOP (25000)
        ROW_NUMBER() OVER (ORDER BY (SELECT NULL)),
        DATEADD(day, -ABS(CHECKSUM(NEWID())) % 730, CONVERT(date, '20260727')),
        1 + ABS(CHECKSUM(NEWID())) % 5000,
        1 + ABS(CHECKSUM(NEWID())) % 800,
        1 + ABS(CHECKSUM(NEWID())) % 12,
        CONVERT(decimal(18,2), 10 + ABS(CHECKSUM(NEWID())) % 50000 / 10.0)
    FROM sys.all_objects AS a
    CROSS JOIN sys.all_objects AS b;

    CREATE CLUSTERED COLUMNSTORE INDEX CCI_FactSalesDemo
    ON dbo.FactSalesDemo;

    SELECT trim_reason_desc,COUNT(*) FROM sys.dm_db_column_store_row_group_physical_stats WHERE object_id=OBJECT_ID(N'dbo.FactSalesDemo') GROUP BY trim_reason_desc;
شاخصخروجی نمونهتفسیر
وضعیتCOMPRESSEDساختار برای اسکن تحلیلی آماده است
تعداد ردیف26,233مقدار نمونه برای مقایسه قبل و بعد
هزینه منطقی24 صفحهخروجی نمونه و وابسته به محیط واقعی

نکته فنی: هنگام استفاده از Tuple Mover فقط به موفق‌بودن دستور اکتفا نکنید؛ پنجره نگه‌داری را قبل و بعد اندازه بگیرید و اثر آن را روی Workload واقعی ثبت کنید.

مثال 10: آزمون کارایی و بهینه‌سازی

در این مثال، «Tuple Mover» در سناریوی آزمون کارایی و بهینه‌سازی بررسی می‌شود. Query به‌گونه‌ای نوشته شده که در یک محیط آزمایشی SQL Server قابل اجرا باشد و نتیجه آن با DMV، خروجی تجمیعی یا Metadata کنترل شود.

USE tempdb;
    DROP TABLE IF EXISTS dbo.FactSalesDemo;
    CREATE TABLE dbo.FactSalesDemo
    (
        SaleID bigint NOT NULL,
        OrderDate date NOT NULL,
        CustomerID int NOT NULL,
        ProductID int NOT NULL,
        Quantity smallint NULL,
        Amount decimal(18,2) NULL
    );

    INSERT INTO dbo.FactSalesDemo
    (
        SaleID, OrderDate, CustomerID, ProductID, Quantity, Amount
    )
    SELECT TOP (25000)
        ROW_NUMBER() OVER (ORDER BY (SELECT NULL)),
        DATEADD(day, -ABS(CHECKSUM(NEWID())) % 730, CONVERT(date, '20260727')),
        1 + ABS(CHECKSUM(NEWID())) % 5000,
        1 + ABS(CHECKSUM(NEWID())) % 800,
        1 + ABS(CHECKSUM(NEWID())) % 12,
        CONVERT(decimal(18,2), 10 + ABS(CHECKSUM(NEWID())) % 50000 / 10.0)
    FROM sys.all_objects AS a
    CROSS JOIN sys.all_objects AS b;

    CREATE CLUSTERED COLUMNSTORE INDEX CCI_FactSalesDemo
    ON dbo.FactSalesDemo;

    SELECT state_desc,SUM(total_rows) FROM sys.dm_db_column_store_row_group_physical_stats WHERE object_id=OBJECT_ID(N'dbo.FactSalesDemo') GROUP BY state_desc;
شاخصخروجی نمونهتفسیر
وضعیتCOMPRESSEDساختار برای اسکن تحلیلی آماده است
تعداد ردیف26,370مقدار نمونه برای مقایسه قبل و بعد
هزینه منطقی22 صفحهخروجی نمونه و وابسته به محیط واقعی

نکته فنی: هنگام استفاده از Tuple Mover فقط به موفق‌بودن دستور اکتفا نکنید؛ Background Merge را قبل و بعد اندازه بگیرید و اثر آن را روی Workload واقعی ثبت کنید.

خطاهای رایج

خطاهای زیر در پروژه‌های واقعی مرتبط با Tuple Mover دیده می‌شوند. شدت هر خطا به حجم داده و نسخه SQL Server وابسته است، اما اصل کنترل برای همه محیط‌ها یکسان است.

  • اجرای Rebuild فوری برای هر Rowgroup
  • نادیده گرفتن بار DML
  • فرض زمان‌بندی دقیق
  • عدم پایش CLOSED rowgroup
  • اشتباه گرفتن با Ghost Cleanup

مهم‌ترین هشدار: اجرای Rebuild فوری برای هر Rowgroup. پیش از هر تغییر گسترده، Backup/Restore آزمایشی، ظرفیت Log و امکان بازگشت را بررسی کنید.

ملاحظات کارایی و پایش

برای ارزیابی Tuple Mover حداقل پنج محور باید هم‌زمان دیده شود: تعداد CLOSED, نرخ Insert, فشار CPU, پنجره نگه‌داری, Background Merge. اندازه‌گیری تنها زمان اجرا ممکن است نتیجه گمراه‌کننده بدهد، زیرا Cache گرم، Parallelism، Memory Grant و بار هم‌زمان روی نتیجه اثر دارند.

معیارچرا مهم است؟روش پیشنهادی
تعداد CLOSEDاثر مستقیم بر کیفیت یا هزینه Tuple Mover داردروند DMV را در طول زمان ثبت کنید
نرخ Insertاثر مستقیم بر کیفیت یا هزینه Tuple Mover داردپیش از مداخله علت را مشخص کنید
فشار CPUاثر مستقیم بر کیفیت یا هزینه Tuple Mover داردREORGANIZE را هدفمند اجرا کنید
پنجره نگه‌داریاثر مستقیم بر کیفیت یا هزینه Tuple Mover داردBatch Load مناسب داشته باشید
Background Mergeاثر مستقیم بر کیفیت یا هزینه Tuple Mover دارداز Job بسیار پرتکرار دوری کنید

یک Snapshot منفرد برای تصمیم بلندمدت کافی نیست. داده پایش را در چند بازه کاری، پس از ETL و در ساعات اوج جمع‌آوری کنید تا روند واقعی مشخص شود.

سناریوی عملی و بهینه‌سازی Tuple Moverمقایسه روش نامناسب و بهترین روش برای کارایی و نگه‌داری Tuple Moverسناریوی عملی و بهینه‌سازی Tuple MoverTuple Mover1Tuple Moverروش ضعیف2Delta Storeاثر3OPENریسک4CLOSEDبهترین روش5COMPRESSEDبهبود6Background Mergeکنترل

این سناریو تفاوت میان اجرای بدون پایش و اجرای مبتنی بر Best Practice را برای Tuple Mover مقایسه می‌کند؛ معیارهای اصلی شامل تعداد CLOSED و نرخ Insert هستند.

بهترین روش‌ها

  • روند DMV را در طول زمان ثبت کنید
  • پیش از مداخله علت را مشخص کنید
  • REORGANIZE را هدفمند اجرا کنید
  • Batch Load مناسب داشته باشید
  • از Job بسیار پرتکرار دوری کنید

Best Practice به‌معنای اجرای یک نسخه ثابت برای همه سرورها نیست. باید توصیه‌ها را با اندازه داده، Edition، Compatibility Level، معماری HA/DR و محدودیت پنجره نگه‌داری تطبیق داد.

پرسش‌های متداول

Tuple Mover دقیقاً چه مشکلی را حل می‌کند؟

Tuple Mover یک فرایند پس‌زمینه است که Rowgroupهای بسته‌شده در Delta Store را به Rowgroup فشرده Columnstore تبدیل می‌کند. عقب‌ماندن آن می‌تواند باعث افزایش Delta Rowgroup و افت کیفیت اسکن تحلیلی شود. انتخاب آن باید براساس نوع بارکاری و معیارهای قابل اندازه‌گیری انجام شود.

برای شروع یادگیری Tuple Mover چه پیش‌نیازی لازم است؟

آشنایی با Execution Plan، ایندکس‌ها و دستورات پایه T-SQL کافی است. سپس باید مفاهیم Delta Store و OPEN را روی یک پایگاه داده آزمایشی مشاهده کنید.

آیا Tuple Mover برای همه پروژه‌های تجاری مناسب است؟

خیر. سودمندی آن به حجم داده، نسبت خواندن به نوشتن، SLA گزارش‌ها و هزینه نگه‌داری وابسته است. ارزیابی فنی یا مشاوره SQL Server پیش از استقرار می‌تواند از هزینه‌های بازطراحی جلوگیری کند.

هزینه پیاده‌سازی Tuple Mover چگونه برآورد می‌شود؟

برآورد باید شامل تحلیل Workload، طراحی آزمایش، زمان مهاجرت، پایش پس از اجرا و آموزش تیم باشد. اندازه جدول و حساسیت توقف سرویس نیز روی زمان انجام پروژه اثر مستقیم دارد.

تفاوت Tuple Mover با یک ایندکس یا روش عمومی چیست؟

روش عمومی معمولاً فقط ساختار یا دستور را می‌بیند، اما این موضوع روی Tuple Mover، CLOSED و رفتار واقعی موتور تمرکز دارد. مقایسه باید با Plan، IO، CPU و مدت اجرا انجام شود.

چه زمانی برای اجرای پروژه یا دریافت خدمات مرتبط با Tuple Mover مناسب است؟

هنگامی که گزارش‌ها کند شده‌اند، رشد داده سریع است یا نگه‌داری فعلی نتیجه قابل پیش‌بینی ندارد، بررسی تخصصی ارزشمند است. بهتر است ابتدا Snapshot فنی و معیار موفقیت تعیین شود.

رایج‌ترین خطا در استفاده از Tuple Mover چیست؟

یکی از خطاهای پرتکرار «اجرای Rebuild فوری برای هر Rowgroup» است. خطای دیگر تصمیم‌گیری بدون مقایسه قبل و بعد و بدون توجه به نسخه SQL Server است.

Tuple Mover چه اثری بر Performance دارد؟

اثر اصلی از مسیر تعداد CLOSED، نرخ Insert و فشار CPU دیده می‌شود. نتیجه می‌تواند بسیار مثبت یا در Workload نامناسب منفی باشد، بنابراین تست کنترل‌شده ضروری است.

بهترین روش عملی برای Tuple Mover چیست؟

از یک محیط آزمایشی مشابه Production شروع کنید، روند DMV را در طول زمان ثبت کنید و پیش از مداخله علت را مشخص کنید را اجرا کنید و معیارها را در Query Store یا سامانه پایش ثبت نمایید.

سازگاری Tuple Mover با نسخه‌های SQL Server چگونه است؟

از SQL Server 2019 به بعد وظیفه Background Merge نیز در نگه‌داری کیفیت Rowgroup مشارکت بیشتری دارد. پیش از انتشار در Production، Syntax و گزینه‌های قابل پشتیبانی را روی همان Edition، Version و Compatibility Level بررسی کنید.

سؤالات مصاحبه

پاسخ مناسب به پرسش‌های زیر باید علاوه بر تعریف، شامل سناریو، Trade-off، معیار اندازه‌گیری و نمونه T-SQL باشد.

  1. تفاوت Tuple Mover و Delta Store را با یک سناریوی واقعی توضیح دهید.
  2. برای سنجش اثر Tuple Mover چه شاخص‌هایی را قبل و بعد ثبت می‌کنید؟
  3. در چه شرایطی «اجرای Rebuild فوری برای هر Rowgroup» باعث افت کارایی می‌شود؟
  4. چگونه با استفاده از OPEN و CLOSED مشکل را عیب‌یابی می‌کنید؟
  5. در طراحی یک Job سازمانی برای Tuple Mover چه کنترل خطا و Rollback در نظر می‌گیرید؟
  6. چرا توصیه «روند DMV را در طول زمان ثبت کنید» برای محیط Production مهم است؟

چک‌لیست نهایی

  1. نسخه و Compatibility Level برای Tuple Mover کنترل شد.
  2. خط پایه IO، CPU، Duration و فضای مصرفی ثبت شد.
  3. Query و Syntax در محیط آزمایشی اجرا شد.
  4. اثرات DML و ETL جداگانه سنجیده شد.
  5. خروجی DMV یا Metadata پس از اجرا بررسی شد.
  6. Rollback Plan و ظرفیت Log مشخص شد.
  7. گزارش مقایسه قبل و بعد ذخیره شد.
  8. Job یا رویه نگه‌داری دارای شرط و کنترل خطا است.

جمع‌بندی

Tuple Mover زمانی مفید است که از حالت یک دستور منفرد خارج و به یک فرایند اندازه‌گیری‌شده تبدیل شود. Tuple Mover یک فرایند پس‌زمینه است که Rowgroupهای بسته‌شده در Delta Store را به Rowgroup فشرده Columnstore تبدیل می‌کند. عقب‌ماندن آن می‌تواند باعث افزایش Delta Rowgroup و افت کیفیت اسکن تحلیلی شود. در عمل باید با نسخه SQL Server، شکل داده و هدف گزارش‌گیری سازگار شود.

برای مطالعه ارتباط این موضوع با سایر اجزای Columnstore، راهنمای جامع کارایی Columnstore در SQL Server را ببینید.

خدمات برنامه‌نویسی و پایگاه داده

برنامه‌نویسی در اصفهان

قبول سفارش‌های برنامه‌نویسی و پایگاه داده: 09131253620

انجام پروژه‌های برنامه‌نویسی، آموزش برنامه‌نویسی و آموزش پایگاه داده SQL Server با رویکرد حرفه‌ای، مستندسازی مناسب و قابلیت توسعه انجام می‌شود.

مجموعه‌ای معتبر با سابقه فعالیت حرفه‌ای از سال ۱۳۷۵ شمسی

از سال ۱۳۷۵ شمسی تاکنون در زمینه طراحی و اجرای پروژه‌های برنامه‌نویسی، پایگاه داده، سیستم‌های تحت وب، وب‌سایت و راهکارهای نرم‌افزاری فعالیت می‌کنیم.

برای سفارش پروژه‌های برنامه‌نویسی و پایگاه داده، سیستم‌های تحت وب، وب‌سایت و راهکارهای نرم‌افزاری جدید، با شماره تلفن همراه 09131253620 تماس حاصل فرمایید.

ایتا، واتساپ و تماس مستقیم: +989131253620

تماس با ما

 

0 نظر

نظر محترم شما در مورد مقاله های وب سایت برنامه نویسی و پایگاه داده

نظرات محترم شما در خدمات رسانی بهتر ما را یاری می نمایند. لطفا اگر مایل بودید یک نظر ما را مهمان فرمائید. آدرس ایمیل و وب سایت شما نمایش داده نخواهد شد.

حرف 500 حداکثر