Azure Synapse Analytics'te ayrılmış SQL havuzundaki geçici tablolar

Bu makale, geçici tabloları kullanmaya yönelik temel yönergeleri içerir ve oturum düzeyi geçici tabloların ilkelerini vurgular.

Bu makaledeki bilgileri kullanmak kodunuzu modüler hale getirmenize yardımcı olarak hem yeniden kullanılabilirliği hem de bakım kolaylığı sağlar.

Geçici tablolar nedir?

Geçici tablolar, özellikle ara sonuçların geçici olduğu dönüştürme sırasında verileri işlerken yararlıdır. Ayrılmış SQL havuzunda geçici tablolar oturum düzeyinde bulunur.

Geçici tablolar yalnızca oluşturuldukları oturuma görünür ve bu oturum kapatıldığında otomatik olarak bırakılır.

Sonuçları uzak depolama yerine yerel olarak yazıldığından, geçici tablolar bir performans avantajı sunar.

Ayrılmış SQL havuzundaki geçici tablolar

Ayrılmış SQL havuzu kaynağında, sonuçları uzak depolama yerine yerel olarak yazıldığından geçici tablolar bir performans avantajı sunar.

Geçici tablo oluşturma

Geçici tablolar, tablonuzun adının önüne bir #ek eklenerek oluşturulur. Örnek:

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
)

Geçici tablolar da tam olarak aynı yaklaşım kullanılarak CTAS oluşturulabilir:

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]
)
;

Not

CTAS güçlü bir komutdur ve işlem günlüğü alanı kullanımında verimli olmanın ek avantajına sahiptir.

Geçici tabloları bırakma

Yeni bir oturum oluşturulduğunda geçici tablo bulunmamalıdır.

Deyimlerinizin CREATE TABLE başarılı olduğundan emin olmak için, aynı ada sahip bir geçici oluşturan aynı saklı yordamı çağırıyorsanız, aşağıdaki örnekte olduğu gibi ile DROP basit bir ön varlık denetimi kullanılabilir:

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

Kodlama tutarlılığı için bu düzeni hem tablolar hem de geçici tablolar için kullanmak iyi bir uygulamadır. Ayrıca, kodunuzda bunları bitirdiğinizde geçici tabloları kaldırmak için kullanmak DROP TABLE da iyi bir fikirdir.

Saklı yordam geliştirmede, bu nesnelerin temizlendiğinden emin olmak için yordamın sonunda bırakma komutlarının birlikte paketlendiğini görmek yaygındır.

DROP TABLE #stats_ddl

Kodu modüler haleleştirme

Geçici tablolar bir kullanıcı oturumunda herhangi bir yerde görülebildiğinden, uygulama kodunuzu modüler hale getirmek için bu özellik kullanılabilir.

Örneğin, aşağıdaki saklı yordam veritabanındaki tüm istatistikleri istatistik adına göre güncelleştirmek için DDL oluşturur:

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

Bu aşamada, gerçekleşen tek eylem, DDL deyimleriyle geçici bir tablo #stats_ddloluşturan bir saklı yordamın oluşturulmasıdır.

Bu saklı yordam, bir oturumda birden çok kez çalıştırıldığında başarısız olmamasını sağlamak için var olan #stats_ddl bir yordamı bırakır.

Ancak saklı yordamın sonunda olmadığından DROP TABLE saklı yordam tamamlandığında, saklı yordamın dışında okunabilmesi için oluşturulan tablodan ayrılır.

Ayrılmış SQL havuzunda, diğer SQL Server veritabanlarından farklı olarak, geçici tabloyu oluşturan yordamın dışında kullanmak mümkündür. Ayrılmış SQL havuzu geçici tabloları, oturumun içinde herhangi bir yerde kullanılabilir. Bu özellik, aşağıdaki örnekte olduğu gibi daha modüler ve yönetilebilir kodlara yol açabilir:

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;

Geçici tablo sınırlamaları

Ayrılmış SQL havuzu, geçici tablolar uygulanırken birkaç sınırlama getirir. Şu anda yalnızca oturum kapsamlı geçici tablolar desteklenmektedir. Genel Geçici Tablolar desteklenmez.

Ayrıca, görünümler geçici tablolarda oluşturulamaz. Geçici tablolar yalnızca karma veya hepsini bir kez deneme dağıtımıyla oluşturulabilir. Çoğaltılan geçici tablo dağıtımı desteklenmez.

Sonraki adımlar

Tablo geliştirme hakkında daha fazla bilgi edinmek için Ayrılmış SQL havuzu kullanarak tablo tasarlama makalesine bakın.