Saklı yordamın sonunda, geçici tempdb alanı daha hızlı oluşturan geçici tabloyu neden kesiyor?


12

SQL Server, saklı yordamlar içinde oluşturulan geçici tabloları önbelleğe alır ve yalnızca yordam sona erdiğinde ve daha sonra yürütüldüğünde bunları yeniden adlandırır. Sorum tempdb alanı serbest bırakıldığında bununla ilgili. Prosedürün sonunda masanın kesildiğini okudum . Bunun oturum başına işlendiğini ve MSDN'de temizlemenin gerekli olup olmadığı hakkında bir soru gördüklerini yorumlarda okudum . Peki ya aynı oturum tarafından asla iki kez yürütülmezse?

Ayrıca, masa kapsam dışında kaldığında o alanı boşaltan bir arka plan çöp toplama işlemi olduğunu duydum.

Oluşturulan saklı yordamın sonunda geçici tabloyu kısaltmak, tablonun tempdb içinde kullandığı alanın, aksine beklenmedik durumlara rağmen, kesik ifadesi kullanılmamış olandan daha hızlı yayınlanmasına neden olduğu görülüyor. Neden?

Böyle bir kısaltılmış ifadeyi kullanmanın veya kullanmamanın göreceli performans sonuçları ne olur? SNAPSHOT izolasyonunu kullanırken, tempdb sıklıkla vurgulanır ve tempdb'de kullanılan alanın mümkün olan en kısa sürede serbest bırakılmasının tempdb'nin gereksiz yere büyümesini önleyeceğini düşünürüm. Bu potansiyel yer tasarrufu performansın maliyetine neden olur mu?

Sorunu yeniden oluşturmak için bazı kodlar (çoğunlukla @TheGameiswar'dan, bazı değişikliklerle):

SET NOCOUNT ON;
GO
ALTER PROC usp_test
AS
BEGIN
    IF object_id('tempdb..#temp') IS NOT NULL
        DROP TABLE #temp

    SELECT *
    INTO #temp
    FROM [dbo].[Event_28] -- This is a table with 15313 rows, using 35648 KB according to sp_spaceused

    --SELECT SUM(user_object_reserved_page_count) AS [user object pages used]
    --  ,(SUM(user_object_reserved_page_count) * 1.0 / 128) AS [user object space in MB]
    --  ,getdate() AS BeforeTruncate
    --FROM tempdb.sys.dm_db_file_space_usage;
 --   TRUNCATE TABLE #temp
    --SELECT SUM(user_object_reserved_page_count) AS [user object pages used]
    --  ,(SUM(user_object_reserved_page_count) * 1.0 / 128) AS [user object space in MB]
    --  ,getdate() AS AfterTruncate
    --FROM tempdb.sys.dm_db_file_space_usage;

END
GO

SELECT SUM(user_object_reserved_page_count) AS [user object pages used]
    ,(SUM(user_object_reserved_page_count) * 1.0 / 128) AS [user object space in MB]
    ,getdate() AS 'before'
FROM tempdb.sys.dm_db_file_space_usage;

EXEC usp_test
GO

SELECT SUM(user_object_reserved_page_count) AS [user object pages used]
    ,(SUM(user_object_reserved_page_count) * 1.0 / 128) AS [user object space in MB]
    ,getdate() AS 'final'
FROM tempdb.sys.dm_db_file_space_usage;
GO 40

Yorum yapılan satırlar bazı yayınlar için yorumlanmış ve diğerleri için yorumlanmamış olarak bırakılmıştır. Yorum yapıldığında, sorgunun TRUNCATEsonuçları tempdb.sys.dm_db_file_space_usage(4472 daha fazla sayfa ve 34.9375 MB daha büyük), işlem yürütülmeden sonuçla eşleşmeden önce 2.25 ile 4.5 saniye arasında sürdü . Çizgiler (dahil TRUNCATE) yorum yapılmamışken, yalnızca yaklaşık 0.11 - 0.9 saniye sürdü. Bu sonuçlar, bu deney sırasında kaynak tabloda bazı küçük veri artışları olan canlı bir sistemden alınmıştır.

Kodun yorumlandığı örnek çıktı (ilk "son" girişten 2.69 saniye):

user object pages used user object space in MB                 before
---------------------- --------------------------------------- -----------------------
1536                   12.000000                               2017-10-04 21:03:42.197

Beginning execution loop
user object pages used user object space in MB                 final
---------------------- --------------------------------------- -----------------------
6000                   46.875000                               2017-10-04 21:03:42.423

user object pages used user object space in MB                 final
---------------------- --------------------------------------- -----------------------
6000                   46.875000                               2017-10-04 21:03:42.533

user object pages used user object space in MB                 final
---------------------- --------------------------------------- -----------------------
6000                   46.875000                               2017-10-04 21:03:42.643

user object pages used user object space in MB                 final
---------------------- --------------------------------------- -----------------------
6000                   46.875000                               2017-10-04 21:03:42.883

user object pages used user object space in MB                 final
---------------------- --------------------------------------- -----------------------
6000                   46.875000                               2017-10-04 21:03:42.990

user object pages used user object space in MB                 final
---------------------- --------------------------------------- -----------------------
6000                   46.875000                               2017-10-04 21:03:43.100

user object pages used user object space in MB                 final
---------------------- --------------------------------------- -----------------------
6000                   46.875000                               2017-10-04 21:03:43.450

user object pages used user object space in MB                 final
---------------------- --------------------------------------- -----------------------
6000                   46.875000                               2017-10-04 21:03:43.650

user object pages used user object space in MB                 final
---------------------- --------------------------------------- -----------------------
6000                   46.875000                               2017-10-04 21:03:43.767

user object pages used user object space in MB                 final
---------------------- --------------------------------------- -----------------------
6000                   46.875000                               2017-10-04 21:03:43.993

user object pages used user object space in MB                 final
---------------------- --------------------------------------- -----------------------
6000                   46.875000                               2017-10-04 21:03:44.103

user object pages used user object space in MB                 final
---------------------- --------------------------------------- -----------------------
6000                   46.875000                               2017-10-04 21:03:44.213

user object pages used user object space in MB                 final
---------------------- --------------------------------------- -----------------------
6000                   46.875000                               2017-10-04 21:03:44.437

user object pages used user object space in MB                 final
---------------------- --------------------------------------- -----------------------
6000                   46.875000                               2017-10-04 21:03:44.553

user object pages used user object space in MB                 final
---------------------- --------------------------------------- -----------------------
6000                   46.875000                               2017-10-04 21:03:44.663

user object pages used user object space in MB                 final
---------------------- --------------------------------------- -----------------------
6000                   46.875000                               2017-10-04 21:03:44.887

user object pages used user object space in MB                 final
---------------------- --------------------------------------- -----------------------
6000                   46.875000                               2017-10-04 21:03:45.003

user object pages used user object space in MB                 final
---------------------- --------------------------------------- -----------------------
1536                   12.000000                               2017-10-04 21:03:45.113

Kod açıklanmamış örnek sonuçlar (ilk "son" girişten 0.11 saniye):

user object pages used user object space in MB                 before
---------------------- --------------------------------------- -----------------------
1536                   12.000000                               2017-10-04 21:07:39.807

user object pages used user object space in MB                 BeforeTruncate
---------------------- --------------------------------------- -----------------------
6016                   47.000000                               2017-10-04 21:07:39.923

user object pages used user object space in MB                 AfterTruncate
---------------------- --------------------------------------- -----------------------
6016                   47.000000                               2017-10-04 21:07:39.923

Beginning execution loop
user object pages used user object space in MB                 final
---------------------- --------------------------------------- -----------------------
6016                   47.000000                               2017-10-04 21:07:40.160

user object pages used user object space in MB                 final
---------------------- --------------------------------------- -----------------------
1536                   12.000000                               2017-10-04 21:07:40.270

Yanıtlar:


12

Oluşturulan saklı yordamın sonunda geçici tabloyu kısaltmak, tablonun tempdb içinde kullandığı alanın, aksine beklenmedik durumlara rağmen, kesik ifadesi kullanılmamış olandan daha hızlı yayınlanmasına neden olduğu görülüyor. Neden?

Geçici tablo yeterince büyükse ( 128'den fazla uzantı ), fiziksel sayfa ayırmaları ertelenir ve bir arka plan sistemi görevi tarafından gerçekleştirilir. Bir müstehcenlik TRUNCATE TABLEkullanılsın veya kullanılmasın bu doğrudur .

Tek fark küçük bir uygulama detayı. Geçici tablo temizleme tarafından oluşturulan (aksi takdirde aynı) ertelenmiş bırakma görevinden daha kısa bir zamanlayıcıya sahip TRUNCATE TABLEbir görev oluşturmak için açık bir durum oluşur :

Çağrı yığını çünkü onlar gibi insanlar

Bunun tesadüfen mi yoksa tasarım mı olduğu herkesin tahminidir. Elbette her zaman değişebilir, çünkü bu ayrıntı seviyesi desteklenen ürün yüzey alanının çok ötesine geçer.

Ertelenmiş düşüşü (çoğunlukla) belgesiz bir izleme bayrağıyla global olarak devre dışı bırakırsanız:

DBCC TRACEON (671, -1);

... anlaşmaların her iki durumda da eşzamanlı olarak yapılması ve zamanlamada hiçbir fark görmemeniz gerekir.

Böyle bir kısaltılmış ifadeyi kullanmanın veya kullanmamanın göreceli performans sonuçları ne olur? SNAPSHOT izolasyonunu kullanırken, tempdb sıklıkla vurgulanır ve tempdb'de kullanılan alanın mümkün olan en kısa sürede serbest bırakılmasının tempdb'nin gereksiz yere büyümesini önleyeceğini düşünürüm. Bu potansiyel yer tasarrufu performansın maliyetine neden olur mu?

Bunun her iki şekilde de çok fazla fark yaratacağından şüpheliyim. Eğer Tempdb , sizin iş yükü zirve ihtiyaçlarına uygun boyutta olduğu ertelenmiş damla önemli değil bir saniye veya üç gerektiği sonra oluşup oluşmadığını. Aynı iş yapılır; zamanlamada sadece küçük bir farktır.

Öte yandan: TRUNCATE TABLESaklı yordamlarınızın sonunda geçici tablolarda kullanmak daha rahat hissediyorsanız , bununla devam edin. Bunu yapmanın herhangi bir dezavantajının farkında değilim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.