الجداول المؤقتة في تجمع SQL المخصص في Azure Synapse Analytics

تلميح

Microsoft Fabric Data Warehouse هو مستودع علائقي على نطاق مؤسسي قائم على أساس بحيرة البيانات، مع بنية جاهزة للمستقبل، وذكاء اصطناعي مدمج، وميزات جديدة. إذا كنت جديدا في مستودع البيانات، ابدأ ب Fabric Data Warehouse. يمكن لأحمال عمل تجمع SQL المخصصة الحالية الترقية إلى Fabric للوصول إلى قدرات جديدة في علوم البيانات، والتحليلات اللحظية، والتقارير.

تحتوي هذه المقالة على إرشادات أساسية لاستخدام الجداول المؤقتة وتبرز مبادئ الجداول المؤقتة على مستوى الجلسة.

استخدام المعلومات الواردة في هذا المقال يمكن أن يساعدك في تحويل كودك إلى وحدات معيارية، مما يحسن من قابلية إعادة الاستخدام وسهولة الصيانة.

ما هي الجداول المؤقتة؟

الجداول المؤقتة مفيدة عند معالجة البيانات، خاصة أثناء التحويل حيث تكون النتائج الوسيطة مؤقتة. في مجموعة SQL المخصصة، توجد جداول مؤقتة على مستوى الجلسة.

الجداول المؤقتة مرئية فقط للجلسة التي تم إنشاؤها فيها، ويتم إسقاطها تلقائيا عند إغلاق تلك الجلسة.

توفر الجداول المؤقتة ميزة أداء لأن نتائجها مكتوبة على التخزين المحلي بدلا من التخزين عن بعد.

الجداول المؤقتة في مجموعة SQL مخصصة

في موارد SQL المخصصة، تقدم الجداول المؤقتة ميزة أداء لأن نتائجها مكتوبة على التخزين المحلي بدلا من التخزين البعيد.

إنشاء جدول مؤقت

يتم إنشاء الجداول المؤقتة عن طريق إضافة بادئة قبل اسم #الجدول الخاص بك ب . على سبيل المثال:

CREATE TABLE #stats_ddl
(
    [schema_name]        NVARCHAR(128) NOT NULL
,    [table_name]            NVARCHAR(128) NOT NULL
,    [stats_name]            NVARCHAR(128) NOT NULL
,    [stats_is_filtered]     BIT           NOT NULL
,    [seq_nmbr]              BIGINT        NOT NULL
,    [two_part_name]         NVARCHAR(260) NOT NULL
,    [three_part_name]       NVARCHAR(400) NOT NULL
)
WITH
(
    DISTRIBUTION = HASH([seq_nmbr])
,    HEAP
)

يمكن أيضا إنشاء جداول مؤقتة باستخدام CTAS نفس النهج بالضبط:

CREATE TABLE #stats_ddl
WITH
(
    DISTRIBUTION = HASH([seq_nmbr])
,    HEAP
)
AS
(
SELECT
        sm.[name]                                                                AS [schema_name]
,        tb.[name]                                                                AS [table_name]
,        st.[name]                                                                AS [stats_name]
,        st.[has_filter]                                                            AS [stats_is_filtered]
,       ROW_NUMBER()
        OVER(ORDER BY (SELECT NULL))                                            AS [seq_nmbr]
,                                 QUOTENAME(sm.[name])+'.'+QUOTENAME(tb.[name])  AS [two_part_name]
,        QUOTENAME(DB_NAME())+'.'+QUOTENAME(sm.[name])+'.'+QUOTENAME(tb.[name])  AS [three_part_name]
FROM    sys.objects            AS ob
JOIN    sys.stats            AS st    ON    ob.[object_id]        = st.[object_id]
JOIN    sys.stats_columns    AS sc    ON    st.[stats_id]        = sc.[stats_id]
                                    AND st.[object_id]        = sc.[object_id]
JOIN    sys.columns            AS co    ON    sc.[column_id]        = co.[column_id]
                                    AND    sc.[object_id]        = co.[object_id]
JOIN    sys.tables            AS tb    ON    co.[object_id]        = tb.[object_id]
JOIN    sys.schemas            AS sm    ON    tb.[schema_id]        = sm.[schema_id]
WHERE    1=1
AND        st.[user_created]   = 1
GROUP BY
        sm.[name]
,        tb.[name]
,        st.[name]
,        st.[filter_definition]
,        st.[has_filter]
)
;

ملحوظة

CTAS هو أمر قوي وله ميزة إضافية في كفاءته في استخدام مساحة سجل المعاملات.

إسقاط الجداول المؤقتة

عند إنشاء جلسة جديدة، لا ينبغي أن توجد جداول مؤقتة.

إذا كنت تستدعي نفس الإجراء المخزن، الذي ينشئ مؤقتا بنفس الاسم، لضمان نجاح عباراتك CREATE TABLE ، يمكن استخدام فحص بسيط للوجود المسبق باستخدام a DROP كما في المثال التالي:

IF OBJECT_ID('tempdb..#stats_ddl') IS NOT NULL
BEGIN
    DROP TABLE #stats_ddl
END

من أجل اتساق البرمجة، من الجيد استخدام هذا النمط لكل من الجداول والمؤقتة. من الجيد أيضا استخدامها DROP TABLE لإزالة الجداول المؤقتة بعد الانتهاء منها في الكود.

في تطوير الإجراءات المخزنة، من الشائع رؤية أوامر الإسقاط مجمعة معا في نهاية الإجراء لضمان تنظيف هذه الأشياء.

DROP TABLE #stats_ddl

تعديل الكود

نظرا لأن الجداول المؤقتة يمكن رؤيتها في أي مكان خلال جلسة المستخدم، يمكن الاستفادة من هذه القدرة لمساعدتك في تحويل كود التطبيق إلى نموذج معياري.

على سبيل المثال، يقوم إجراء التخزين التالي بتوليد DDL لتحديث جميع الإحصائيات في قاعدة البيانات باسم الإحصائيات:

CREATE PROCEDURE    [dbo].[prc_sqldw_update_stats]
(   @update_type    tinyint -- 1 default 2 fullscan 3 sample 4 resample
    ,@sample_pct     tinyint
)
AS

IF @update_type NOT IN (1,2,3,4)
BEGIN;
    THROW 151000,'Invalid value for @update_type parameter. Valid range 1 (default), 2 (fullscan), 3 (sample) or 4 (resample).',1;
END;

IF @sample_pct IS NULL
BEGIN;
    SET @sample_pct = 20;
END;

IF OBJECT_ID('tempdb..#stats_ddl') IS NOT NULL
BEGIN
    DROP TABLE #stats_ddl
END

CREATE TABLE #stats_ddl
WITH
(
    DISTRIBUTION = HASH([seq_nmbr])
)
AS
(
SELECT
        sm.[name]                                                                AS [schema_name]
,        tb.[name]                                                                AS [table_name]
,        st.[name]                                                                AS [stats_name]
,        st.[has_filter]                                                            AS [stats_is_filtered]
,       ROW_NUMBER()
        OVER(ORDER BY (SELECT NULL))                                            AS [seq_nmbr]
,                                 QUOTENAME(sm.[name])+'.'+QUOTENAME(tb.[name])  AS [two_part_name]
,        QUOTENAME(DB_NAME())+'.'+QUOTENAME(sm.[name])+'.'+QUOTENAME(tb.[name])  AS [three_part_name]
FROM    sys.objects            AS ob
JOIN    sys.stats            AS st    ON    ob.[object_id]        = st.[object_id]
JOIN    sys.stats_columns    AS sc    ON    st.[stats_id]        = sc.[stats_id]
                                    AND st.[object_id]        = sc.[object_id]
JOIN    sys.columns            AS co    ON    sc.[column_id]        = co.[column_id]
                                    AND    sc.[object_id]        = co.[object_id]
JOIN    sys.tables            AS tb    ON    co.[object_id]        = tb.[object_id]
JOIN    sys.schemas            AS sm    ON    tb.[schema_id]        = sm.[schema_id]
WHERE    1=1
AND        st.[user_created]   = 1
GROUP BY
        sm.[name]
,        tb.[name]
,        st.[name]
,        st.[filter_definition]
,        st.[has_filter]
)
SELECT
    CASE @update_type
    WHEN 1
    THEN 'UPDATE STATISTICS '+[two_part_name]+'('+[stats_name]+');'
    WHEN 2
    THEN 'UPDATE STATISTICS '+[two_part_name]+'('+[stats_name]+') WITH FULLSCAN;'
    WHEN 3
    THEN 'UPDATE STATISTICS '+[two_part_name]+'('+[stats_name]+') WITH SAMPLE '+CAST(@sample_pct AS VARCHAR(20))+' PERCENT;'
    WHEN 4
    THEN 'UPDATE STATISTICS '+[two_part_name]+'('+[stats_name]+') WITH RESAMPLE;'
    END AS [update_stats_ddl]
,   [seq_nmbr]
FROM    #stats_ddl
;
GO

في هذه المرحلة، الإجراء الوحيد الذي حدث هو إنشاء إجراء مخزن يولد جدولا مؤقتا، #stats_ddl، مع عبارات DDL.

يقوم هذا الإجراء المخزن بحذف الإجراء الموجود #stats_ddl لضمان عدم فشله إذا تم تشغيله أكثر من مرة خلال الجلسة.

ومع ذلك، بما أنه لا يوجد DROP TABLE في نهاية الإجراء المخزن، عند اكتمال الإجراء المخزن، يغادر الجدول الذي تم إنشاؤه ليتمكن من قراءته خارج الإجراء المخزن.

في مجموعة SQL المخصصة، على عكس قواعد بيانات SQL Server الأخرى، من الممكن استخدام الجدول المؤقت خارج الإجراء الذي أنشأه. يمكن استخدام جداول SQL المؤقتة المخصصة ضمن التجمع في أي مكان داخل الجلسة. يمكن أن تؤدي هذه الميزة إلى كود أكثر مرونة وقابلية للإدارة كما في المثال التالي:

EXEC [dbo].[prc_sqldw_update_stats] @update_type = 1, @sample_pct = NULL;

DECLARE @i INT              = 1
,       @t INT              = (SELECT COUNT(*) FROM #stats_ddl)
,       @s NVARCHAR(4000)   = N''

WHILE @i <= @t
BEGIN
    SET @s=(SELECT update_stats_ddl FROM #stats_ddl WHERE seq_nmbr = @i);

    PRINT @s
    EXEC sp_executesql @s
    SET @i+=1;
END

DROP TABLE #stats_ddl;

قيود الجدول المؤقتة

تجمع SQL المخصص يفرض بعض القيود عند تنفيذ الجداول المؤقتة. حاليا، تدعم فقط الجداول المؤقتة ذات النطاق الجلسي. الجداول المؤقتة العالمية غير مدعومة.

أيضا، لا يمكن إنشاء العروض على جداول مؤقتة. يمكن إنشاء الجداول المؤقتة فقط باستخدام التجزئة أو توزيع الدورية. التوزيع المؤقت المكرر للجدول غير مدعوم.

الخطوات التالية

لمعرفة المزيد عن تطوير الجداول، راجع مقالة تصميم الجداول باستخدام تجمع SQL المخصص .