DMV sysinos_exec_requests में Total_elapsed_time पूरी तरह से गलत है?


13

मैं SQL सर्वर 2012 चला रहा हूं और DMV का उपयोग करके निगरानी के लिए कुछ प्रश्नों को एक साथ रखने की कोशिश कर रहा हूं। हालाँकि, जब DMV total_elapsed_timeमें फ़ील्ड को sys.dm_exec_requestsदेखते हैं, तो संख्याएँ बंद हो जाती हैं। यहाँ एक उदाहरण है:

SELECT
  session_id, RunTime = CURRENT_TIMESTAMP,
  start_time, total_elapsed_time
FROM sys.dm_exec_requests
WHERE session_id = 284;

session_id  RunTime                 start_time              total_elapsed_time
284         2016-04-07 16:14:03.690 2016-04-07 16:08:14.587 1419976

मेरी गणना के अनुसार, बीता हुआ समय लगभग 349,103 के आसपास होना चाहिए - 1,419,976 के आसपास नहीं। यह 4 के एक कारक से अधिक है।

* अंतर है, मिलीसेकेंड में, वर्तमान समय और के बीच से start_time यानी
SELECT DATEDIFF(MILLISECOND, '2016-04-07T16:08:14.587', '2016-04-07T16:14:03.690');

यहाँ सर्वर जानकारी है:

SELECT @@VERSION;

Microsoft SQL Server 2012 - 11.0.5592.0 (X64) 
    Apr 17 2015 15:18:46 
    Copyright (c) Microsoft Corporation
    Enterprise Edition: Core-based Licensing (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)

कोई भी विचार जो इस विसंगति का कारण हो सकता है?


जवाबों:


11

एक बग है जो समांतर ऑपरेशन में समय को एकत्रित करता है। यह 2014 में तय हुआ।

Total_elapsed_time जब तक यह बैच में अगले स्टेटमेंट पर जाता है एक बैच में एक विशेष समानांतर क्वेरी के लिए सही हो जाएगा, तो total_elapsed_time डाक द्वारा विस्फोट हो जाएगा।

उदाहरण

इसे एक क्वेरी विंडो में चलाएं:

USE AdventureWorks2012
GO
SELECT *
FROM Sales.SalesOrderDetail sod
JOIN Production.Product p ON sod.ProductID = p.ProductID
ORDER BY Style 

waitfor delay '00:00:15'

इसे एक सेकंड में चलाएं:

select 
    DATEDIFF(ms, start_time, getdate()) ActualElapsedTime,
    total_elapsed_time from sys.dm_exec_requests
where session_id = <your session_id for the above batch>

जब तक SQL सर्वर WAITFORDELAYस्टेटमेंट पर नहीं जाता, तब तक दोनों मान समरूप होंगे । तब आपको कुल_लैप्सड_टाइम एक्सप्लोड देखना चाहिए (पहली क्वेरी के समानांतर योजना है जैसा कि मेरे सर्वर पर है)।

मुझे कुछ साल पहले एक ग्राहक के लिए इस पर काम करना याद है। आंतरिक डेटाबेस में बग मिला (मैं एक Microsoft प्रीमियर डेवलपर सलाहकार हूं), लेकिन कोई सार्वजनिक संदर्भ नहीं।


7

ऐसा लगता है कि यह DMV के साथ एक बग / मुद्दा भी हो सकता है। इसी तरह की अशुद्धि के यहाँ एक कनेक्ट बग रिपोर्ट है। सुझाए गए समाधान का उपयोग करना है

GETDATE() - sys.dm_exec_requests.start_time

इसके बजाय total_elapsed_time । समस्या SQL Server 2014 में हल हो गई है। "नाथन (MSFT)" द्वारा कनेक्ट आइटम पर टिप्पणी उद्धृत करने के लिए:

Sysinos_exec_requests.total_elapsed_time के साथ समस्या RESTOREसंचालन के लिए विशिष्ट नहीं है ; यह भी साथ UPDATE STATISTICSही देखा गया है । यह समस्या SQL Server 2008 R2 में हल नहीं होगी। [...] समस्या SQL Server 2014 में हल हो गई है।


2

मैंने कुछ सर्वरों की जाँच की है और पृष्ठभूमि अनुरोधों पर 2 महीने में लगभग 14s का बहाव देखा है।

हालांकि यह एक तरफ, अन्य अनुरोधों पर मैं देख सकता हूं कि केवल एक ही अंतर है, जहां स्पिड एक पर्याप्त अवस्था में चला गया है। मुझे संदेह है कि यह मूल्य उस अवस्था में वृद्धि नहीं करता है; लेकिन मैं इसका परीक्षण करने के लिए स्लीपिंग में क्वेरी को बाध्य नहीं कर पाया। (WAITFOR सोने के बजाय निलंबित हो जाता है)।

अन्य कारण भी हो सकते हैं, लेकिन मुझे अभी तक कोई पता नहीं चला है। आप यह सुनिश्चित करने के लिए अपनी क्वेरी की निगरानी करके इसे नियंत्रित कर सकते हैं कि यह स्लीपिंग स्थिति में नहीं जाता है।

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