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 TRUNCATE
sonuç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