SQL सर्वर: क्रिएट इंडेक्स कमांड की प्रगति को कैसे ट्रैक करें?


36

एसक्यूएल सर्वर 2014, एसटीडी एड

मैंने पढ़ा है कि dm_exec_requests में प्रतिशत_सफलता क्रिएट इंडेक्स के लिए काम नहीं करता है, और प्रैक्टिस में, प्रतिशत_कम से कम 0. पर चिपक जाता है, इसलिए यह मदद नहीं करता है।

मैं वर्तमान में नीचे दी गई विधि का उपयोग करता हूं, जो कम से कम मुझे आंदोलन दिखाती है (कि सूचकांक निर्माण अवरुद्ध नहीं है)। लेकिन मेरे पास शून्य विचार है अगर मैं प्रक्रिया के माध्यम से 10% या 99% हूं।

मैंने यहां बताई गई विधि की कोशिश की: /dba//a/102545/6229 लेकिन यह स्पष्ट रूप से गलत समय पूरा करने का समय दिखाता है (यह मूल रूप से 60 मिनट की प्रक्रिया के लिए 'अब' दिखाता है कि मैं 10 मिनट में हूं )

मुझे कोई सुराग कैसे मिल सकता है?

SELECT percent_complete, estimated_completion_time, reads, writes, logical_reads, text_size, *
FROM
sys.dm_exec_requests AS r
WHERE
r.session_id <> @@SPID
AND r.session_id = 58

जवाबों:


56

मुझे लगता है कि निम्नलिखित क्वेरी आपको कम से कम काफी करीब मिल जाएगी। यह एक डीएमवी का उपयोग करता है जो SQL सर्वर 2014 में पेश किया गया था: sysinos_exec_query_profiles (और मार्टिन स्मिथ को इस संबंधित DBA.StackExchange उत्तर के माध्यम से इसे शुरू करने के लिए धन्यवाद: SELO INTO कथन की प्रगति :-)

कृपया ध्यान दें:

  • !! आप जोड़ने की आवश्यकता होगी SET STATISTICS PROFILE ON;या SET STATISTICS XML ON;क्वेरी बैच में है कि क्या कर रहा है CREATE INDEX(और रखा से पहलेCREATE INDEX , बयान करता है, तो स्पष्ट नहीं किया गया था) और कोई नहीं पंक्तियों उस SPID इस DMV में दिखाई देगा, / session_id !!

  • INऑपरेटर बाहर फिल्टर करने के लिए प्रयोग किया जाता है Index Insertपंक्ति है कि, अगर शामिल है, में वृद्धि होगी TotalRowsके बाद से उस पंक्ति संसाधित किसी भी पंक्तियों कभी नहीं चलता मूल्यों, जो गणना परिवर्तित कर देगा।

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

  • फ़िल्टर्ड इंडेक्स बनाते समय यह क्वेरी काम नहीं करती है। किसी कारण से, फ़िल्टर्ड इंडेक्स ए) में "सॉर्ट" चरण नहीं है, और बी) row_countफ़ील्ड 0 से कभी नहीं बढ़ता है।
    यह निश्चित नहीं है कि मैं पहले क्या परीक्षण कर रहा था, लेकिन मेरे परीक्षण अब संकेत देते हैं कि फ़िल्टर्ड इंडेक्स इस क्वेरी द्वारा कैप्चर किए गए हैं । मिठाई। हालाँकि बस इस बात से सावधान रहें कि पंक्ति गणना बंद हो सकती है (मैं देखूंगा कि क्या मैं किसी दिन इसे ठीक कर सकता हूं)।

  • जब एक हीप पर क्लस्टर्ड इंडेक्स बनाते हैं, जिस पर पहले से ही नॉन-क्लस्टर्ड इंडेक्स होता है, तो नॉनस्टस्टर्ड इंडेक्स को फिर से बनाया जाना चाहिए (क्लस्टर्ड इंडेक्स की (s) के लिए RID - RowID को स्वैप करने के लिए, और प्रत्येक NonClustered Index को फिर से बनाना होगा) एक अलग ऑपरेशन हो सकता है और इसलिए क्लस्टर इंडेक्स के निर्माण के दौरान इस क्वेरी द्वारा लौटाए गए आंकड़ों में परिलक्षित नहीं होता है।

  • इस प्रश्न के खिलाफ परीक्षण किया गया है:

    • बनाना:
      • एक ढेर पर गैर-संकुलित सूचकांक
      • एक संकुल सूचकांक (कोई गैर-सूचीबद्ध सूचकांक मौजूद नहीं है)
      • गुच्छेदार सूचकांक / तालिका पर गैर-संकुलित सूचकांक
      • जब कोई गैर-अनुक्रमित अनुक्रमणिका पहले से मौजूद है, तो एक क्लस्टर अनुक्रमणिका
      • यूनिक नॉन क्लस्टरड इंडेक्स क्लस्टर्ड इंडेक्स / टेबल पर
    • पुनर्निर्माण (क्लस्टर क्लस्टर सूचकांक और एक गैर-अनुक्रमित सूचकांक के साथ तालिका। SQL सर्वर 2014, 2016, 2017 और 2018 पर परीक्षण किया गया)
      • ALTER TABLE [schema_name].[table_name] REBUILD;( केवल क्लस्टर इंडेक्स इस विधि का उपयोग करते समय दिखाता है )
      • ALTER INDEX ALL ON [schema_name].[table_name] REBUILD;
      • ALTER INDEX [index_name] ON [schema_name].[table_name] REBUILD;
DECLARE @SPID INT = 51;

;WITH agg AS
(
     SELECT SUM(qp.[row_count]) AS [RowsProcessed],
            SUM(qp.[estimate_row_count]) AS [TotalRows],
            MAX(qp.last_active_time) - MIN(qp.first_active_time) AS [ElapsedMS],
            MAX(IIF(qp.[close_time] = 0 AND qp.[first_row_time] > 0,
                    [physical_operator_name],
                    N'<Transition>')) AS [CurrentStep]
     FROM sys.dm_exec_query_profiles qp
     WHERE qp.[physical_operator_name] IN (N'Table Scan', N'Clustered Index Scan',
                                           N'Index Scan',  N'Sort')
     AND   qp.[session_id] = @SPID
), comp AS
(
     SELECT *,
            ([TotalRows] - [RowsProcessed]) AS [RowsLeft],
            ([ElapsedMS] / 1000.0) AS [ElapsedSeconds]
     FROM   agg
)
SELECT [CurrentStep],
       [TotalRows],
       [RowsProcessed],
       [RowsLeft],
       CONVERT(DECIMAL(5, 2),
               (([RowsProcessed] * 1.0) / [TotalRows]) * 100) AS [PercentComplete],
       [ElapsedSeconds],
       (([ElapsedSeconds] / [RowsProcessed]) * [RowsLeft]) AS [EstimatedSecondsLeft],
       DATEADD(SECOND,
               (([ElapsedSeconds] / [RowsProcessed]) * [RowsLeft]),
               GETDATE()) AS [EstimatedCompletionTime]
FROM   comp;

नमूना उत्पादन:

                        Rows                 Percent   Elapsed  Estimated    Estimated
CurrentStep  TotalRows  Processed  RowsLeft  Complete  Seconds  SecondsLeft  CompletionTime
-----------  ---------  ---------  --------  --------  -------  -----------  --------------
Clustered    11248640   4786937    6461703   42.56     4.89400  6.606223     2016-05-23
Index Scan                                                                   14:32:40.547

यदि आप एक ढेर पर एक गैर-क्लस्टर इंडेक्स बनाते हैं और नए इंडेक्स में एक मौजूदा इंडेक्स की तरह ही कुंजी होती है, तो क्वेरी ऑपरेटर के बजाय physical_operator_nameसेट के साथ या उसके N'Index Scan'बजाय एक ऑपरेटर का उपयोग करेगी । इसके अलावा, यह बहुत धीमा होगा, क्योंकि यह आरआईडी लुकअप का एक गुच्छा करेगा। N'Table Scan'N'Clustered Index Scan'
ब्रायन

अब अगर केवल वही काम करेगा जो सभी पर काम करेगा dbo.table REBUILD ..... <g>
जोन्सोमे मोनिका

1
BTW, यह पृष्ठ संपीड़न को लागू करने की प्रगति की निगरानी के लिए भी अच्छा काम करता है। sysinos_exec_query_profiles बहुत अच्छा है।
टोड क्लेनहंस 16

2
@JonesomeReinstateMonica मैंने केवल क्वेरी को थोड़ा अद्यतन किया है। ऐसा लगता है कि यह वास्तव में पुनर्निर्माण कार्यों को कैप्चर करता है, दोनों ALTER INDEX ALL(और आंशिक रूप से) ALTER TABLE .. REBUILD। समीक्षा करें :-)।
सोलोमन रटज़की

1
हाय @RoniVered मैंने उत्तर में क्वेरी को थोड़ा अद्यतन किया ताकि यह गैर-संकुलित सूचकांक को पुनः प्राप्त कर ले। मैंने दोनों प्रकार के आदेशों का परीक्षण किया (हालांकि डीबीसीसी नहीं है, मैंने अभी सोचा था), और एसक्यूएल सर्वर 2019, 2017, 2016 और 2014 पर। यह उन सभी में समान काम करने लगता है :-)
सोलोमन रटज़्वी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.