Megosztás a következőn keresztül:


Ideiglenes táblák a Synapse SQL-ben

Ez a cikk alapvető útmutatást tartalmaz az ideiglenes táblák használatához, és kiemeli a Synapse SQL munkamenetszintű ideiglenes tábláinak alapelveit.

A dedikált SQL-készlet és a kiszolgáló nélküli SQL-készlet erőforrásai is használhatnak ideiglenes táblákat. A kiszolgáló nélküli SQL-készletre a jelen cikk végén ismertetett korlátozások vonatkoznak.

ideiglenes táblák

Az ideiglenes táblák hasznosak az adatok feldolgozásakor, különösen az átalakítás során, ahol a köztes eredmények átmenetiek. A Synapse SQL-ben ideiglenes táblák léteznek a munkamenet szintjén. Csak abban a munkamenetben láthatók, amelyben létrehozták őket. Így a munkamenet végén a rendszer automatikusan elveti őket.

Ideiglenes táblák dedikált SQL-készletben

A dedikált SQL-készlet erőforrásában az ideiglenes táblák teljesítménybeli előnyt nyújtanak, mivel eredményeik a távoli tárolás helyett helyire vannak írva.

Ideiglenes tábla létrehozása

Az ideiglenes táblák a tábla neve elé egy # előtagot téve jönnek létre. Például:

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
)

Ideiglenes táblákat is létrehozhat egy CTAS használatával, pontosan ugyanazzal a módszerrel.

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

Megjegyzés:

CTAS egy hatékony parancs, és további előnye, hogy takarékosan bánik a tranzakciónapló-területtel.

Ideiglenes táblák törlése

Új munkamenet létrehozásakor nem létezhetnek ideiglenes táblák. Ha azonban ugyanazt a tárolt eljárást hívja meg, amely egy azonos nevű ideiglenes eljárást hoz létre, az utasítások sikerességének biztosításához CREATE TABLE használjon egy egyszerű, létezés előtti ellenőrzést a következővel DROP:

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

A konzisztencia kódolásához ajánlott ezt a mintát használni táblákhoz és ideiglenes táblákhoz is. Jó ötlet az ideiglenes táblákat DROP TABLE eltávolítani, miután már nincs szükség rájuk.

A tárolt eljárásfejlesztés során gyakran előfordul, hogy az eljárás végén összecsomagolt drop parancsok biztosítják az objektumok megtisztítását.

DROP TABLE #stats_ddl

Kód modularizálása

Az ideiglenes táblák bárhol használhatók egy felhasználói munkamenetben. Ezt a képességet ezután kihasználva modulárissá teheti az alkalmazás kódját. A következő tárolt eljárás a DDL-t hozza létre az adatbázis összes statisztikájának statisztikai név szerinti frissítéséhez:

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

Ebben a szakaszban az egyetlen művelet, amely megtörtént, egy tárolt eljárás létrehozása, amely létrehozza az #stats_ddl ideiglenes táblát. Ha már létezik, a tárolt eljárás törli a #stats_ddl-t. Ez a beállítás biztosítja, hogy ne hiúsuljon meg a futása, ha egy munkameneten belül többször végrehajtják.

Mivel nincs DROP TABLE a tárolt eljárás végén, amikor a tárolt eljárás befejeződik, a létrehozott tábla megmarad, és a tárolt eljáráson kívül is olvasható.

Más SQL Server-adatbázisokkal ellentétben a Synapse SQL lehetővé teszi az ideiglenes tábla használatát az azt létrehozó eljáráson kívül. A dedikált SQL-készleten keresztül létrehozott ideiglenes táblák a munkamenet bármely pontján használhatók. Ennek eredményeképpen modulárisabb és kezelhetőbb kódokkal fog rendelkezni, ahogy az az alábbi példában is látható:

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;

Ideiglenes táblakorlátozások

A dedikált SQL-készlet néhány megvalósítási korlátozással rendelkezik az ideiglenes táblákhoz:

  • Csak a munkamenet-hatókörű ideiglenes táblák támogatottak. A globális ideiglenes táblák nincs támogatva.
  • A nézetek ideiglenes táblákon nem hozhatók létre.
  • Ideiglenes táblák csak kivonat vagy ciklikus elosztással hozhatók létre. A replikált ideiglenes táblaterjesztés nem támogatott.

Ideiglenes táblák kiszolgáló nélküli SQL-készletben

A kiszolgáló nélküli SQL-készletekben támogatottak az ideiglenes táblák, de a használatuk korlátozott. Fájlokat célzó lekérdezésekben nem használhatók.

Például nem kapcsolhat össze ideiglenes táblát a tárolóban lévő fájlokból származó adatokkal. Az ideiglenes táblák száma 100-ra van korlátozva, és a teljes méretük legfeljebb 100 MB lehet.

Következő lépések

A táblák fejlesztéséről a Synapse SQL-erőforrásokról szóló cikkből tudhat meg többet.