संग्रहीत कार्यविधि के अंत में एक अस्थायी तालिका को क्यों रौंदता है जो इसे मुक्त tempdb स्थान तेजी से बनाता है?


12

SQL सर्वर संग्रहीत प्रक्रियाओं के भीतर अस्थायी तालिकाओं को कैश करता है और प्रक्रिया समाप्त होने और बाद में निष्पादित होने पर केवल उनका नाम बदल देता है। मेरा सवाल टेम्पर्ड स्पेस जारी होने के साथ क्या करना है। मैंने पढ़ा है कि प्रक्रिया के अंत में तालिका को काट दिया जाता है । मैंने टिप्पणियों में पढ़ा है कि यह प्रति-सत्र के आधार पर नियंत्रित किया जाता है और एमएसडीएन पर आवश्यक उत्तर के बारे में एक प्रश्न देखा गया है कि क्या सफाई आवश्यक है या नहीं । लेकिन क्या होगा अगर इसे एक ही सत्र में दो बार निष्पादित नहीं किया जाए?

मैंने यह भी सुना है कि एक पृष्ठभूमि कचरा संग्रह प्रक्रिया है जो तालिका के दायरे से बाहर हो जाने पर उस स्थान को मुक्त कर देती है।

संग्रहीत कार्यविधि के अंत में एक अस्थायी तालिका ट्रंक करना, जिससे यह प्रतीत होता है कि डेटा के लिए टेम्पेड में तालिका का उपयोग करने वाले स्थान को तेजी से जारी किया जाता है, यदि इसके विपरीत कोई अपेक्षा नहीं है, तो ट्रंकेट कथन का उपयोग नहीं किया जाता है। क्यों?

इस तरह के कटु कथन का उपयोग करने या न करने के सापेक्ष प्रदर्शन के निहितार्थ क्या होंगे? SNAPSHOT अलगाव का उपयोग करते समय, tempdb पर अक्सर जोर दिया जाता है और मुझे लगता है कि जितनी जल्दी हो सके एक बड़े अस्थायी तालिका से tempdb में उपयोग किए जाने वाले स्थान को जारी करना अन्यथा tempdb के अनावश्यक विकास को रोक देगा। क्या यह संभावित स्थान बचत प्रदर्शन की लागत पर आएगा?

इस मुद्दे को पुन: पेश करने के लिए कुछ कोड है (ज्यादातर @ TheGameiswar से, कुछ परिवर्तनों के साथ):

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

टिप्पणी की गई पंक्तियों को कुछ रनों के लिए बाहर छोड़ दिया गया और दूसरों के लिए टिप्पणी नहीं की गई। जब TRUNCATEटिप्पणी की गई थी, तो tempdb.sys.dm_db_file_space_usageक्वेरी के परिणाम (4472 अधिक पृष्ठ और 34.9375 एमबी बड़े) परिणाम निष्पादित होने से पहले इसे 2.25 और 4.5 सेकंड के बीच लिया गया था। लाइनों के साथ ( TRUNCATEसंयुक्त राष्ट्र की टिप्पणी सहित ), इसमें केवल 0.11 - 0.9 सेकंड का समय लगा। ये परिणाम एक जीवित प्रणाली से हैं, इस प्रयोग के दौरान स्रोत तालिका में कुछ मामूली डेटा वृद्धि के साथ।

नमूना आउटपुट कोड के साथ टिप्पणी की (पहले से अंतिम "अंतिम" प्रविष्टि के लिए 2.69 सेकंड):

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

अन-कमेंट कोड के साथ नमूना परिणाम (पहले से अंतिम "अंतिम" प्रविष्टि के लिए 0.11 सेकंड):

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

जवाबों:


12

संग्रहीत कार्यविधि के अंत में एक अस्थायी तालिका ट्रंक करना, जिससे यह प्रतीत होता है कि डेटा के लिए टेम्पेड में तालिका का उपयोग करने वाले स्थान को तेजी से जारी किया जाता है, यदि इसके विपरीत कोई अपेक्षा नहीं है, तो ट्रंकेट कथन का उपयोग नहीं किया जाता है। क्यों?

यदि अस्थायी तालिका पर्याप्त ( 128 से अधिक extents ) बड़ी है , तो भौतिक पृष्ठ डीलॉक्लेशन को स्थगित कर दिया जाता है, और पृष्ठभूमि सिस्टम कार्य द्वारा निष्पादित किया जाता है। यह सच है कि एक स्पष्ट TRUNCATE TABLEउपयोग किया जाता है या नहीं।

एकमात्र अंतर एक छोटा कार्यान्वयन विवरण है। अस्थायी तालिका सफाई द्वारा बनाए गए (अन्यथा समान) आस्थगित ड्रॉप कार्य की तुलना में TRUNCATE TABLEएक छोटे टाइमर के साथ एक कार्य बनाने के लिए एक स्पष्ट होता है :

स्टैक को कॉल करें क्योंकि लोग उन्हें पसंद करते हैं

चाहे यह दुर्घटना से हो या डिजाइन से किसी का अनुमान हो। यह किसी भी समय निश्चित रूप से बदल सकता है, क्योंकि विस्तार का यह स्तर समर्थित उत्पाद सतह क्षेत्र से आगे निकल जाता है।

यदि आप एक (अधिकतर) अवांछित चिह्न झंडे के साथ वैश्विक रूप से आस्थगित ड्रॉप को अक्षम करते हैं:

DBCC TRACEON (671, -1);

... दोनों मामलों में समानार्थक रूप से प्रदर्शन किया जाता है, और आपको समय में कोई अंतर नहीं दिखाई देगा।

इस तरह के कटु कथन का उपयोग करने या न करने के सापेक्ष प्रदर्शन के निहितार्थ क्या होंगे? SNAPSHOT अलगाव का उपयोग करते समय, tempdb पर अक्सर जोर दिया जाता है और मुझे लगता है कि जितनी जल्दी हो सके एक बड़े अस्थायी तालिका से tempdb में उपयोग किए जाने वाले स्थान को जारी करना अन्यथा tempdb के अनावश्यक विकास को रोक देगा। क्या यह संभावित स्थान बचत प्रदर्शन की लागत पर आएगा?

मुझे गंभीरता से संदेह है कि यह कभी भी दोनों में बहुत अंतर करेगा। यदि आपके कार्यभार की चरम ज़रूरतों के लिए अस्थायी रूप से टेम्पर्ड बी आकार है, तो एक या तीन सेकंड के बाद आस्थगित गिरावट होती है। वही काम किया जाता है; यह समय में सिर्फ एक छोटा सा अंतर है।

दूसरी ओर: यदि आप TRUNCATE TABLEअपनी संग्रहीत प्रक्रियाओं के अंत में अस्थायी तालिकाओं का उपयोग करने में अधिक सहज महसूस करते हैं, तो उसी के साथ जाएं। मैं ऐसा करने के लिए किसी विशेष नकारात्मक के बारे में पता नहीं हूँ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.