Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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.