मुझे लगता है कि निम्नलिखित क्वेरी आपको कम से कम काफी करीब मिल जाएगी। यह एक डीएमवी का उपयोग करता है जो 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'