Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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 ve hem yeniden kullanılabilirliği hem de bakım kolaylığını artırmanıza yardımcı olabilir.
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 #eklenerek oluşturulur. Örneğin:
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]
)
;
Uyarı
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ırak
Yeni bir oturum oluşturulduğunda geçici tablo bulunmamalıdır.
Aynı saklı yordamı, aynı adı taşıyan bir geçici tablo oluşturacak şekilde çağırıyorsanız, CREATE TABLE ifadelerinizin başarılı olduğundan emin olmak için, aşağıdaki örnekte olduğu gibi DROP kullanarak basit bir ön varlık denetimi yapılabilir.
IF OBJECT_ID('tempdb..#stats_ddl') IS NOT NULL
BEGIN
DROP TABLE #stats_ddl
END
Kodlama tutarlılığı için bu deseni 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 bir yordamın sonunda bırakma komutlarının topluca kullanılması yaygın bir uygulamadır.
DROP TABLE #stats_ddl
Kodu modüler hale
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ı için mevcut #stats_ddl öğesini bırakır.
Ancak, saklı yordamın sonunda DROP TABLE olmadığı için, saklı yordam tamamlandığında oluşturulan tablo, saklı yordamın dışında okunabilmesi için bırakı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 dönüşümlü dağıtımla oluşturulabilir. Çoğaltılmış geçici tabloların 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.