إشعار
يتطلب الوصول إلى هذه الصفحة تخويلاً. يمكنك محاولة تسجيل الدخول أو تغيير الدلائل.
يتطلب الوصول إلى هذه الصفحة تخويلاً. يمكنك محاولة تغيير الدلائل.
تحتوي هذه المقالة على إرشادات أساسية لاستخدام الجداول المؤقتة وتسلط الضوء على مبادئ الجداول المؤقتة على مستوى الجلسة ضمن Synapse SQL التعليمي.
يمكن لكل من تجمع SQL المخصص وموارد تجمع SQL بدون خادم استخدام جداول مؤقتة. مجموعة SQL بدون خادم لها قيود سيتم مناقشتها في نهاية هذا المقال.
الجداول المؤقتة
الجداول المؤقتة مفيدة عند معالجة البيانات، خاصة أثناء التحويل حيث تكون النتائج الوسيطة مؤقتة. مع Synapse 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، استخدم فحص بسيط للوجود قبل الوجود ب :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. الإجراء المخزن يسقط #stats_ddl إذا كان موجودا بالفعل. هذا السقوط يضمن عدم فشل اللعبة إذا تم تشغيلها أكثر من مرة خلال الجلسة.
وبما أنه لا يوجد في DROP TABLE نهاية الإجراء المخزن، عند اكتمال الإجراء المخزن، يبقى الجدول الذي تم إنشاؤه ويمكن قراءته خارج الإجراء المخزن.
على عكس قواعد بيانات SQL Server الأخرى، يتيح لك Synapse SQL استخدام الجدول المؤقت خارج الإجراء الذي أنشأه. يمكن استخدام الجداول المؤقتة التي تم إنشاؤها عبر تجمع 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 بدون خادم
الجداول المؤقتة في مجموعة SQL بدون خادم مدعومة لكن استخدامها محدود. لا يمكن استخدامها في الاستعلامات التي تستهدف الملفات.
على سبيل المثال، لا يمكنك الانضمام إلى جدول مؤقت يحتوي على بيانات من ملفات في التخزين. عدد الجداول المؤقتة محدود ب 100، وحجمها الكلي محدود ب 100 ميجابايت.
الخطوات التالية
لمعرفة المزيد عن تطوير الجداول، راجع مقالة تصميم الجداول باستخدام موارد Synapse SQL .