Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

SQL सर्वर डेटाबेस TempDB की अप्रत्याशित वृद्धि का पता लगाने और उसे रोकने के लिए कैसे करें?

प्रत्येक SQL सर्वर इंस्टेंस में TempDB नामक सिस्टम SQL सर्वर डेटाबेस होता है। यह सभी डेटाबेस कनेक्शन के लिए विशिष्ट है, और लगभग हर क्वेरी TempDB डेटाबेस का उपयोग करती है। यह SQL सर्वर इंस्टेंस के लिए दिल की तरह है। व्यावहारिक रूप से, हम TempDB डेटाबेस के बिना काम नहीं कर सकते।

आइए हम संचालन का एक त्वरित सारांश देखें जिसमें SQL सर्वर TempDB का उपयोग करता है।

  • आदेश द्वारा और खंड द्वारा समूह
  • सूचकांक निर्माण और ऑनलाइन अनुक्रमणिका पुनर्निर्माण
  • टेम्पर टेबल और टेबल वेरिएबल स्टोरेज TempDB डेटाबेस में है।
  • स्नैपशॉट आइसोलेशन और प्रतिबद्ध स्नैपशॉट आइसोलेशन पढ़ें
  • डीबीसीसी कमांड
  • हैश स्थिर कर्सर, लंबे समय तक चलने वाले लेन-देन में शामिल होता है।
  • एक्सएमएल क्वेरी
  • SQL सर्वर डेटाबेस इंजन द्वारा बनाए गए आंतरिक ऑब्जेक्ट।
  • संस्करण भंडार
  • एकाधिक सक्रिय रिकॉर्ड सेट (MARS)

आप इस लेख में TempDB के बारे में अधिक पढ़ सकते हैं।

SQL सर्वर डेटाबेस इंजन सेवा पुनरारंभ पर इस TempDB डेटाबेस को पुन:बनाता है। यह पुनरारंभ SQL सेवा के स्वचालित या मैन्युअल पुनरारंभ के कारण हो सकता है। हम TempDB निर्माण तिथि को देखने के लिए sys.databases को क्वेरी कर सकते हैं जो डेटाबेस सेवा का स्टार्ट-अप समय भी है:

SELECT create_date AS 'SQL Service Startup Time'
FROM sys.databases
WHERE name = 'tempdb';

TempDB SQL सर्वर डेटाबेस कॉन्फ़िगरेशन और सर्वोत्तम अभ्यास

कभी-कभी, हम TempDB डेटाबेस की अप्रत्याशित वृद्धि देखते हैं। इससे बचने का पहला कदम इसे सर्वोत्तम प्रथाओं के अनुसार कॉन्फ़िगर करना है। इस खंड में, आइए देखें कि TempDB कॉन्फ़िगरेशन SQL सर्वर के विभिन्न संस्करण हैं।

TempDB को सम वृद्धि के साथ कई डेटा फ़ाइलों के लिए कॉन्फ़िगर करें

सर्वोत्तम अभ्यास के अनुसार, हमारे पास सभी फ़ाइलों की सम वृद्धि के साथ एकाधिक डेटा फ़ाइलें होनी चाहिए। फाइलों की संख्या तार्किक प्रोसेसर पर निर्भर करती है।

प्रोसेसर

TempDB डेटा फ़ाइलों की संख्या

लॉजिकल प्रोसेसर आठ से कम या उसके बराबर

आठ

आठ से अधिक लॉजिकल प्रोसेसर

आठ डेटा फ़ाइलों से शुरू करें।

डेटा फ़ाइलों को चार के गुणकों में बढ़ाएँ और TempDB विवाद के लिए प्रदर्शन काउंटरों की निगरानी करें।

2016 से पहले के SQL सर्वर संस्करणों के लिए, हमारे पास इंस्टॉलेशन प्रक्रिया के दौरान कॉन्फ़िगरेशन उपलब्ध नहीं है।

डिफ़ॉल्ट रूप से, यह निम्न कॉन्फ़िगरेशन के साथ केवल एक डेटा और लॉग फ़ाइल बनाता है:

TempDB प्राथमिक फ़ाइल

डेटा फ़ाइल को स्वचालित रूप से दस प्रतिशत तक बढ़ाएं (डिस्क भर जाने तक)

TempDB लॉग फ़ाइल

डेटा फ़ाइल को दस प्रतिशत तक स्वचालित रूप से बढ़ाएं (जब तक कि डिस्क भर न जाए या अधिकतम लॉग फ़ाइल का आकार 2 टीबी तक न पहुंच जाए)

SQL सर्वर 2014 TempDB SQL सर्वर डेटाबेस कॉन्फ़िगरेशन

SQL सर्वर 2016 सर्वोत्तम अभ्यास के अनुसार स्थापना प्रक्रिया के दौरान TempDB कॉन्फ़िगरेशन के लिए एन्हांसमेंट प्रदान करता है:

TempDB प्राथमिक और द्वितीयक फ़ाइलें

64 एमबी (डिस्क भर जाने तक) अपने आप बढ़ जाता है

TempDB लॉग फ़ाइल

64 एमबी (डिस्क भर जाने तक या लॉग फ़ाइल का अधिकतम आकार 2 टीबी तक पहुंचने तक) अपने आप बढ़ जाता है

SQL सर्वर 2016 के बाद TempDB कॉन्फ़िगरेशन

असमान ऑटो-ग्रोथ SQL सर्वर डेटाबेस TempDB

SQL सर्वर एकाधिक डेटा फ़ाइलों को भरने के लिए राउंड-रॉबिन विधि का उपयोग करता है यदि उनका आकार समान नहीं है। कभी-कभी, हम देखते हैं कि एक फ़ाइल बड़ी हो जाती है, लेकिन अन्य फ़ाइलें न्यूनतम वृद्धि बनी रहती हैं। असमान फ़ाइलों के मामले में, SQL सर्वर अधिकांश प्रश्नों के लिए बड़ी फ़ाइल का उपयोग करता है, और यह बढ़ता रहेगा:

  1. TempDB फ़ाइलों के समान ऑटो-ग्रोथ का उपयोग करें (जैसा कि पिछले बिंदु में चर्चा की गई है)।
  2. डेटाबेस में सभी डेटा फ़ाइलों को एक साथ बढ़ाने के लिए ट्रेस फ़्लैग 1117 सक्षम करें।

दूसरा बिंदु SQL सर्वर 2016 में स्वचालित रूप से तय हो गया है, हालांकि आपको इसे पुराने संस्करणों में सक्षम करना चाहिए। हमें SQL सर्वर 2016 और उच्चतर में इस ट्रेस ध्वज की आवश्यकता नहीं है।

TempDB विकास परिदृश्य

इस खंड में, हम SQL सर्वर डेटाबेस TempDB वृद्धि के लिए कुछ परिदृश्य देखेंगे। मेरे SQL उदाहरण में, मेरे पास निम्न कॉन्फ़िगरेशन वाली आठ डेटा फ़ाइलें हैं:

अब, एक अस्थायी तालिका बनाने और डेटा प्रविष्टि करने के लिए निम्न क्वेरी निष्पादित करें। अस्थायी तालिका संग्रहण स्थान TempDB डेटाबेस है। यह क्वेरी एकाधिक कॉलम वाले क्रॉस जॉइन ऑपरेटर का उपयोग करती है और ORDER BY क्लॉज का उपयोग करके परिणामों को आगे सॉर्ट करती है।

नोट: इस क्वेरी को उत्पादन प्रणाली में न चलाएं; मैं इसे केवल डेमो उद्देश्य के लिए उपयोग कर रहा हूं।

SELECT *
FROM sys.configurations
CROSS JOIN sys.configurations SCA
CROSS JOIN sys.configurations SCB
CROSS JOIN sys.configurations SCC
CROSS JOIN sys.configurations SCD
CROSS JOIN sys.configurations SCE
CROSS JOIN sys.configurations SCF
CROSS JOIN sys.configurations SCG
CROSS JOIN sys.configurations SCH
ORDER BY SCA.name,
SCA.value,
SCC.value_in_use DESC;

इस क्वेरी में लंबा समय लगेगा और इसके परिणामस्वरूप आपके सिस्टम में उच्च CPU उपयोग भी हो सकता है। जब क्वेरी चल रही हो, तो दूसरी क्वेरी विंडो खोलें और की जानकारी प्राप्त करने के लिए DMV sys.dm_db_task_space_usage का उपयोग करें कार्य द्वारा पृष्ठ आवंटन और डीलोकेशन गतिविधि। SQL सर्वर डेटाबेस TempDB के लिए आवश्यक जानकारी प्राप्त करने के लिए हम इस DMV को अन्य DMV के साथ जोड़ते हैं:

SELECT s.session_id, dbu.database_id
, dbu.internal_objects_alloc_page_count, dbu.internal_objects_dealloc_page_count
, (dbu.internal_objects_alloc_page_count - dbu.internal_objects_dealloc_page_count) * 8192 / 1024 kbytes_used_internal
, r.total_elapsed_time
FROM sys.dm_Exec_requests r
INNER JOIN sys.dm_exec_sessions s ON r.session_id = s.session_id
LEFT JOIN sys.dm_db_task_space_usage dbu ON dbu.session_id = r.session_id
AND dbu.request_id = r.request_id
WHERE internal_objects_alloc_page_count > 0
ORDER BY kbytes_used_internal DESC;
आउटपुट में, हम सत्र आईडी 55 के लिए आंतरिक ऑब्जेक्ट पृष्ठ गणना और उनके आकार (kbytes_used_internal) देखते हैं। SQL सर्वर क्वेरी ऑप्टिमाइज़र इस क्वेरी को समानांतर मॉडल में निष्पादित करता है; इसलिए, हम आउटपुट में एकाधिक सत्र आईडी 71 देख सकते हैं:

आप अनुमानित निष्पादन योजना भी देख सकते हैं, और जैसा कि नीचे दिखाया गया है, हमें दो महंगे ऑपरेटर मिलते हैं:

  • समानतावाद:47.3%
  • क्रमबद्ध करें:52.3%

सॉर्ट ऑपरेटर में, हम उच्च अनुमानित ऑपरेटर लागत 138,576.5 देख सकते हैं:

निम्न क्वेरी DMV का उपयोग करती है sys.dm_db_file_space_usage और क्वेरी निष्पादित होने के दौरान SQL सर्वर डेटाबेस TempDB में आवंटित और असंबद्ध सीमा पृष्ठ गणना की जांच करने के लिए इसे sys.master_files के साथ जोड़ता है:

select mf.physical_name, mf.size as entire_file_page_count,
dfsu.unallocated_extent_page_count,
dfsu.user_object_reserved_page_count,
dfsu.internal_object_reserved_page_count,
dfsu.mixed_extent_page_count
from sys.dm_db_file_space_usage dfsu
join sys.master_files as mf
on mf.database_id = dfsu.database_id
and mf.file_id = dfsu.file_id

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

विस्तारित घटनाओं का उपयोग करके SQL सर्वर डेटाबेस TempDB उपयोग की निगरानी करें

विस्तारित घटनाएँ TempDB डेटाबेस निगरानी के लिए उपयोगी हैं। हम क्वेरी का उपयोग करके निम्नलिखित विस्तारित ईवेंट जोड़ सकते हैं:

  • डेटाबेस_फाइल_साइज_चेंज
  • डेटाबेस_लॉग_फाइल_यूज्ड_साइज_परिवर्तित

विस्तारित ईवेंट बनाएं

CREATE EVENT SESSION [TempDB Usage] ON SERVER
ADD EVENT sqlserver.database_file_size_change(

ACTION(sqlserver.client_hostname,sqlserver.database_id,sqlserver.session_id,sqlserver.sql_text)),
ADD EVENT sqlserver.databases_log_file_used_size_changed(

ACTION(sqlserver.client_hostname,sqlserver.database_id,sqlserver.session_id,sqlserver.sql_text))
ADD TARGET package0.event_file(SET filename=N'TempDBUsage',max_rollover_files=(0))
WITH (STARTUP_STATE=OFF)
GO

विस्तारित ईवेंट सत्र प्रारंभ करें

सर्वर स्थिति पर ALTER EVENT SESSION [TempDBTest] ON SERVER STATE = START;

अब, TempDB डेटाबेस का उपयोग करने और डेटा फ़ाइलों को विकसित करने के लिए अपना कार्यभार निष्पादित करें। विस्तारित ईवेंट डेटा फ़ाइल वृद्धि और क्वेरी को कैप्चर करते हैं जिसके कारण यह वृद्धि हुई।

आप या तो विस्तारित ईवेंट सत्र फ़ाइल को SSMS GUI मोड में देख सकते हैं या TempDB वृद्धि की निगरानी के लिए निम्न क्वेरी का उपयोग कर सकते हैं।

TempDB वृद्धि की निगरानी करें

SELECT [eventdata].[event_data].[value]('(event/action[@name="session_id"]/value)[1]', 'INT') AS [SessionID],
[eventdata].[event_data].[value]('(event/action[@name="client_hostname"]/value)[1]', 'VARCHAR(100)') AS [ClientHostName],
DB_NAME([eventdata].[event_data].[value]('(event/action[@name="database_id"]/value)[1]', 'BIGINT')) AS [GrowthDB],
[eventdata].[event_data].[value]('(event/data[@name="file_name"]/value)[1]', 'VARCHAR(200)') AS [GrowthFile],
[eventdata].[event_data].[value]('(event/data[@name="file_type"]/text)[1]', 'VARCHAR(200)') AS [DBFileType],
[eventdata].[event_data].[value]('(event/@name)[1]', 'VARCHAR(MAX)') AS [EventName],
[eventdata].[event_data].[value]('(event/data[@name="size_change_kb"]/value)[1]', 'BIGINT') AS [SizeChangedKb],
[eventdata].[event_data].[value]('(event/data[@name="total_size_kb"]/value)[1]', 'BIGINT') AS [TotalSizeKb],
[eventdata].[event_data].[value]('(event/data[@name="duration"]/value)[1]', 'BIGINT') AS [DurationInMS],
[eventdata].[event_data].[value]('(event/@timestamp)[1]', 'VARCHAR(MAX)') AS [GrowthTime],
[eventdata].[event_data].[value]('(event/action[@name="sql_text"]/value)[1]', 'VARCHAR(MAX)') AS [QueryText]
FROM
(
SELECT CAST([event_data] AS XML) AS [TargetData]
FROM [sys].[fn_xe_file_target_read_file]('C:\TEMP\TempDBusage*.xel', NULL, NULL, NULL)
) AS [eventdata]([event_data])
WHERE [eventdata].[event_data].[value]('(event/@name)[1]', 'VARCHAR(100)') = 'database_file_size_change'
OR [eventdata].[event_data].[value]('(event/@name)[1]', 'VARCHAR(100)') = 'databases_log_file_used_size_changed'
AND [eventdata].[event_data].[value]('(event/@name)[1]', 'VARCHAR(MAX)') <> 'databases_log_file_used_size_changed'
ORDER BY [GrowthTime] ASC;

स्नैपशॉट अलगाव

आप अपने प्रश्नों के लिए स्नैपशॉट अलगाव का उपयोग कर सकते हैं। इस आइसोलेशन मॉडल में, SQL सर्वर प्रत्येक लेनदेन के अद्यतन पंक्ति संस्करणों को TempDB में संग्रहीत करता है। बड़े या लंबे समय तक चलने वाले लेन-देन के मामले में, आप एक विशाल TempDB डेटाबेस देख सकते हैं।

आप SET कमांड के साथ लेन-देन निष्पादित कर सकते हैं और स्नैपशॉट अलगाव निर्दिष्ट कर सकते हैं:

SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
BEGIN TRAN;
UPDATE [AdventureWorks].[Person].[Person]
SET
[Title] = 'Mr.';
COMMIT TRAN;

आप sys.databases . को भी क्वेरी कर सकते हैं सिस्टम दृश्य यह जांचने के लिए कि क्या किसी उपयोगकर्ता डेटाबेस में स्नैपशॉट अलगाव है।

AdventureWorks डेटाबेस पर स्नैपशॉट आइसोलेशन सक्षम करने के लिए क्वेरी

ALTER DATABASE AdventureWorks
SET ALLOW_SNAPSHOT_ISOLATION ON
GO

स्नैपशॉट अलगाव के साथ उपयोगकर्ता डेटाबेस की जांच करने के लिए क्वेरी

SELECT *
FROM sys.databases
WHERE(snapshot_isolation_state = 1
OR is_read_committed_snapshot_on = 1)
AND database_id > 4;

निम्नलिखित स्क्रीनशॉट में, आप देख सकते हैं कि एडवेंचरवर्क्स डेटाबेस में स्नैपशॉट अलगाव है। TempDB डेटाबेस में स्नैपशॉट अलगाव भी है, लेकिन क्वेरी में, हमने डेटाबेस_आईडी को 4 से कम छोड़ दिया है:

हम TempDB में संस्करण स्टोर की निगरानी के लिए DMV sys.dm_db_file_space_usage का उपयोग कर सकते हैं:

SELECT GETDATE() AS runtime,
SUM(user_object_reserved_page_count) * 8 AS usr_obj_kb,
SUM(internal_object_reserved_page_count) * 8 AS internal_obj_kb,
SUM(version_store_reserved_page_count) * 8 AS version_store_kb,
SUM(unallocated_extent_page_count) * 8 AS freespace_kb,
SUM(mixed_extent_page_count) * 8 AS mixedextent_kb
FROM sys.dm_db_file_space_usage;

यहां, हम देख सकते हैं कि संस्करण स्टोर का आकार 67968 KB है। एक बड़े या लंबे समय तक चलने वाले लेन-देन के लिए, आप इस संस्करण स्टोर के कारण एक विशाल SQL सर्वर डेटाबेस TempDB आकार देख सकते हैं:

एक अन्य मामला जो संस्करण स्टोर के विशाल आकार का कारण हो सकता है वह हमेशा केवल-पढ़ने के लिए द्वितीयक प्रतिकृति पर होता है। यदि आप द्वितीयक डेटाबेस पर कोई क्वेरी निष्पादित करते हैं, तो यह स्वचालित रूप से स्नैपशॉट आइसोलेशन स्तर का उपयोग करता है। जैसा कि आप जानते हैं, स्नैपशॉट अलगाव स्तर TempDB में पंक्ति संस्करण की प्रतिलिपि बनाता है।

आपको निम्नलिखित परफ़ॉर्मेंस काउंटरों की निगरानी करनी चाहिए:

  • SQLServer:लेन-देन\सबसे लंबे समय तक चलने वाला लेन-देन - यह सबसे विस्तारित सक्रिय लेनदेन को कैप्चर करता है।
  • SQLServer:Transactions\Version Store Size (KB) - यह TempDB में सभी संस्करण स्टोर के वर्तमान आकार को कैप्चर करता है।
  • SQLServer:Transactions\Version क्लीनअप दर (KB/s ) - आप इस काउंटर का उपयोग TempDB में संस्करण सफाई की दर दिखाने के लिए कर सकते हैं
  • SQLServer:Transactions\Version जनरेशन दर (KB/s) - आप इस काउंटर का उपयोग करके वर्जन स्टोर कैप्चर रेट कैप्चर कर सकते हैं।

आपको हमेशा सेकेंडरी डेटाबेस में भी वर्जनिंग के लिए TempDB ग्रोथ की निगरानी करनी चाहिए। लंबे समय तक चलने वाले सत्रों को समाप्त करें ताकि यह संस्करण को साफ़ कर सके और TempDB डेटाबेस में स्थान पुनः प्राप्त कर सके।

निष्कर्ष

इस लेख में, हमने SQL सर्वर डेटाबेस TempDB डेटाबेस के सर्वोत्तम अभ्यास और अप्रत्याशित वृद्धि को रोकने, पता लगाने के विभिन्न तरीकों के बारे में सीखा। आपको नियमित रूप से TempDB की निगरानी करनी चाहिए और सक्रिय रहने के लिए विभिन्न अलर्ट कॉन्फ़िगर करना चाहिए।

  • TempDB आकार की निगरानी
  • डिस्क स्पेस मॉनिटरिंग
  • लंबे समय से चल रहे लेन-देन


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. आप डेटाबेस में विरासत का प्रतिनिधित्व कैसे कर सकते हैं?

  2. SQL सर्वर में सिंगल कॉलम पर चेक बाधा कैसे बनाएं - SQL सर्वर / TSQL ट्यूटोरियल पार्ट 83

  3. SQL सर्वर NVarchar फ़ील्ड में जापानी वर्णों के बजाय प्रश्न चिह्न वर्ण क्यों संग्रहीत कर रहा है?

  4. एंटिटी फ्रेमवर्क कोड-फर्स्ट इनिशियलाइज़र में डेटाबेस संयोजन सेट करें

  5. बैकअप इतिहास का उपयोग करके SQL सर्वर डेटाबेस आकार वृद्धि