एक निरंतर स्कैन में 0 सेकंड या 2-3 मिनट लगते हैं


9

नीचे दी गई एक क्वेरी जैसे कि किसी भी पंक्तियों को वापस नहीं करने की गारंटी है, हमारे सर्वर में से किसी एक पर 0 से 160 सेकंड तक ले जाती है:

select col1, col2, col3
from tab1
where 0 = 1

दो हफ्ते पहले, यह 48 घंटे के अंतराल में छह बार हुआ। पिछले हफ्ते एक ही क्वेरी ~ 0 सेकंड लिया। मेरे पास हमारे एप्लिकेशन की SQL के लॉग हैं, लेकिन अभी तक कोई भी संदिग्ध नहीं मिला है। इसके अलावा, मुझे लगा कि एक शीर्ष 0 / जहाँ 0 = 1 प्रकार की क्वेरी ने कभी भी डेटा पृष्ठों को हिट नहीं किया है, इसलिए यह पंक्ति / पृष्ठ / टेबल-स्तरीय डेटा लॉक के लिए प्रतिरोधी होना चाहिए? स्कीमा किसी भी (ज्ञात) SQL द्वारा छुआ नहीं है।

चूंकि समस्या सुसंगत नहीं है, और सर्वर बहुत भारी लोड के अधीन है, मैं एसक्यूएल प्रोफाइलर को संलग्न करने से पहले क्या हो रहा है इसके पीछे के सिद्धांत को समझना चाहता हूं। अन्य प्रश्न इन देरी के दौरान समस्याओं के बिना चलते हैं। आवेदन में एक ज्ञात समस्या गतिशील रूप से निर्मित एसक्यूएल प्रश्नों की एक उच्च संख्या है - 48k की अवधि में 850k कुल (लॉग) प्रश्नों के लगभग 200k अद्वितीय प्रश्न, क्या यह इस तरह की समस्याएं पैदा कर सकता है?

सर्वर SQL Server 2005 मानक संस्करण, 96 GB RAM, SAN और 4 CPU / 16 कोर पर चल रहा है। डेटाबेस फ़ाइलें और फ़ाइल समूह अच्छी तरह से अनुकूलित हैं और एक समस्या नहीं होनी चाहिए (लेकिन हम इसे अलग से देख रहे हैं)।

किसी भी संकेत जहां देखने के लिए बहुत सराहना की है।

संपादित करें: बिल्कुल सही! निष्पादन योजना को जोड़ने के लिए क्वेरी को फिर से जोड़ा, और इसमें 1min 35sec लिया। यहां निष्पादन योजना और स्क्रीनशॉट क्वेरी अवधि दिखा रहा है: क्वेरी योजना

संपादित 2: एक दूसरे रन के लिए सांख्यिकी समय विवरण। अभी लगातार धीमी गति से लगता है, इसलिए हम प्रोफाइलर और परफॉमन को जोड़ेंगे:

SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 97402 ms.
SQL Server parse and compile time: 
   CPU time = 0 ms, elapsed time = 0 ms.

क्या आप निष्पादन योजना को शामिल कर सकते हैं? निष्पादन से पहले क्वेरी विंडो में CTRL + M।
क्रेग एफ्रेइन

2
क्या यह लॉकिंग समस्या हो सकती है? अन्य सत्रों के डीएमएल स्टेटमेंट्स टेबल पर चयन को अवरुद्ध करते हैं (जो कि SQL सर्वर 2005 में डिफ़ॉल्ट व्यवहार है)
a_horse_with_no_name

कोई भी ज्ञात-डीएमएल स्टेटमेंट नहीं है, जो एकमात्र ऐसा कारण है जिसके बारे में मैं सोच सकता हूं, लेकिन हम अभी भी इसकी जांच कर रहे हैं। निष्पादन योजना को प्रश्न में जोड़ा जाता है।
EventHorizon

मैंने जो पढ़ा है, यह उन तुच्छ निष्पादन योजनाओं में से एक है जो MSSQL का उपयोग
हेप्स

1
एक मामला देखा जो इस तरह से देखा गया था। यह अद्यतन आँकड़ों को ट्रिगर करने वाला निकला (ऑटो अपडेट आँकड़े चालू हो गए और रखरखाव योजना टूट गई)।
जोशुआ

जवाबों:


18

ऐसा प्रतीत होता है जैसे एक ... WHERE 0 = 1खंड के साथ भी है कि ISमेज पर अभी भी एक साझा साझा ( ) लॉक की आवश्यकता होगी । आइए इसे साबित करते हैं:

मैं एक परीक्षण तालिका बनाकर शुरू करूंगा:

use TestDb1;
go

create table dbo.MyTestTable1
(
    Id int identity(1, 1) not null,
    SomeInt int not null
);
go

insert into dbo.MyTestTable1 (SomeInt)
values (10), (20), (30), (40), (50);
go

अब जब मेरा टेस्ट टेबल है, तो एक सत्र (क्वेरी विंडो) में मैं एक विशेष ( X) लॉक लगाने के लिए निम्नलिखित को निष्पादित करने जा रहा हूं dbo.MyTestTable1:

use TestDb1;
go

begin tran;
    select
        Id, SomeInt
    from dbo.MyTestTable1 with (tablockx);
--commit tran;

मैं sys.dm_tran_locksDMV को देखकर अनन्य लॉक को सत्यापित कर सकता हूं । फिर दूसरे सत्र में (नई क्वेरी विंडो) मैं वही करता हूं जो आपकी क्वेरी करती है:

use TestDb1;
go

select
    Id, SomeInt
from dbo.MyTestTable1
where 0 = 1;

पहली नज़र में मैं देख रहा हूँ कि यह पूरा नहीं हो रहा है। देख sys.dm_exec_requestsरहा हूं, मैं वास्तव में देखता हूं कि यह मामला क्यों है:

select
    r.session_id,
    r.status,
    r.wait_type,
    r.wait_time,
    r.wait_resource,
    r.blocking_session_id
from sys.dm_exec_requests r
cross apply sys.dm_exec_sql_text(r.sql_handle) st
where st.text like '%where 0 = 1%'
and r.session_id <> @@spid;

यहां छवि विवरण दर्ज करें

मैं यहां देख सकता हूं कि मेरी ... WHERE 0 = 1क्वेरी ISइस ऑब्जेक्ट के लिए लॉक पर प्रतीक्षा कर रही है (वह ऑब्जेक्ट_आईडी अनुवाद करता है dbo.MyTestTable1)।

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

हम सब कर सकते हैं अनुमान है, इसलिए जब आपको "लंबे समय लेने" की आवश्यकता होती है, तो यह देखने के लिए कि अनुरोध क्या वास्तव में इतना लंबा समय ले रहा है। यदि यह किसी चीज़ पर प्रतीक्षा कर रहा है, तो देखें कि यह किस पर प्रतीक्षा कर रहा है।


1

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

यह देखने के लिए कि क्या कोई समस्या हो सकती है sysinos_os_schedulers और sysinos_os_waiting_tasks को देखें।


एक अच्छा सुझाव है, लेकिन समस्या आखिरकार एक मूर्खतापूर्ण ताला बन गई।
EventHorizon

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