2012-08-09 10 views
5

हमारे पास प्राथमिक कुंजी (ऑटोइनक बिगिंट) के साथ 35 कॉलम और 3 गैर-क्लस्टर, गैर-अद्वितीय इंडेक्स (प्रत्येक पर एक int कॉलम)।मुझे "डेटाबेस के लिए लॉग फ़ाइल" tempdb 'पूर्ण क्यों है "

  1. PAYMENT_DATEdatetime NOT NULL

  2. EDIT_DATEdatetime NULL

तालिका के बारे में 1 200 000 पंक्तियां हैं:

तालिका के स्तंभों के अलावा हम दो datetime क्षेत्रों की है। केवल ~ 1000 पंक्तियों में edit_date कॉलम = शून्य है। पंक्तियों की 9000 EDIT_DATE नहीं बातिल और नहीं दूसरों PAYMENT_DATE के बराबर होता है EDIT_DATE = PAYMENT_DATE

हम निम्नलिखित क्वेरी 1 चलाते हैं:

select top 1 * 
from payments 
where edit_date is not null and (payment_date=edit_date or payment_date<>edit_date) 
order by payment_date desc 

enter image description here

सर्वर की एक जोड़ी की जरूरत है इसे करने के लिए सेकंड। लेकिन अगर हम क्वेरी 2 चलाएँ:

select top 1 * 
from payments 
where edit_date is not null 
order by payment_date desc 

enter image description here

निष्पादन डेटाबेस 'tempdb' के लिए लॉग फ़ाइल साथ समाप्त होता है भरा हुआ है। कुछ लॉग स्पेस को खाली करने के लिए डेटाबेस के लिए लेनदेन लॉग का बैकअप लें।

हम कुछ निश्चित स्तंभ के साथ बदलते हैं *, क्वेरी 3

select top 1 payment_date 
from payments 
where edit_date is not null 
order by payment_date desc 

enter image description here

यह भी सेकंड के एक जोड़े में खत्म देखते हैं।

जादू कहां है?

संपादित करें मैंने क्वेरी 1 बदल दिया है ताकि यह दूसरी क्वेरी के समान पंक्तियों पर समान रूप से संचालित हो। और फिर भी यह एक सेकंड में लौटता है, जबकि क्वेरी 2 tempdb भरता है।

उत्तर मैं एक सूचकांक से जोड़ने के लिए सलाह का पालन, दोनों तिथि खाने के लिए ऐसा किया - सब कुछ, जल्दी काम करना शुरू किया अपेक्षा के अनुरूप। हालांकि, सवाल यह था - क्यों इस सटीक स्थिति में SQL सर्वर समान प्रश्नों पर अलग-अलग व्यवहार करता है (क्वेरी 1 बनाम क्वेरी 2); मैं सर्वर अनुकूलन के तर्क को समझना चाहता था। मैं सहमत हूं कि दोनों प्रश्नों ने समान रूप से tempdb का उपयोग किया था, लेकिन उन्होंने नहीं किया ....

अंत में मैं पहले जवाब के रूप में चिह्नित हूं, जहां मैंने अपनी समस्या के लक्षणों को देखा और पहला , साथ ही, इस से बचने के विचारों पर विचार (यानीindeces)

+1

आपको त्रुटि संदेश की सलाह निम्नलिखित विचार किया है? कुछ प्रश्नों को tempdb के उपयोग की आवश्यकता होगी, और अगर लॉग फ़ाइल भर जाती है, तो कोई अन्य लेनदेन नहीं किया जा सकता है। –

+1

@AndrewBarber मैंने नहीं किया..लेकिन जो मैं खोजना चाहता हूं वह है कि लगभग इसी तरह के प्रश्न पूरी तरह से अलग तरीके से निष्पादित किए जाते हैं ... और इस तरह के बीहायर से बचने के लिए मुझे प्रश्न बनाने की उम्मीद कैसे है .. – horgh

+2

उपयोग न करें स्टार्टर्स के लिए सभी कॉलम का चयन करने के लिए '*'। और उस लेनदेन लॉग का बैक अप लें। –

उत्तर

5

ऐसा इसलिए हो रहा है क्योंकि एक निष्पादन योजना में कुछ कदम tempdb को विशेष रूप से sorts और joins में बहुत सारे डेटा शामिल कर सकते हैं।

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

इन नियमों का पालन: केवल वांछित डेटा

  • आकार tempdb उचित रूप से की जरूरत है, अगर आप पागल क्वेरी का gazzilion पंक्तियां क्रमित करने की जरूरत का चयन करने के

    1. प्रयास करें, तो आप बेहतर एक उचित रूप से tempdb आकार है
  • +0

    लेकिन जब मैं पहले (निष्पादन देखें) क्वेरी निष्पादित करने का प्रयास करता हूं तो यह वही "पागल" ऑपरेशन क्यों नहीं करता है ... यदि हम पहले और दूसरे प्रश्नों के परिणामस्वरूप पंक्तियों की संख्या गिनते हैं, तो उनके लगभग बराबर (लगभग दस लाख) ... लेकिन पहले व्यक्ति में 'टॉप 1' लेना अच्छा काम करता है, लेकिन दूसरे में - यह विफल रहता है ...... दूसरी क्वेरी में लॉग उपयोग का कारण बनता है? – horgh

    +0

    @horgh * सभी लेनदेन * लॉग उपयोग का कारण बनता है। आपको जो प्रश्न पूछना चाहिए वह है "tempdb उपयोग का कारण क्या है"। –

    +0

    क्षमा करें, मेरा मतलब बिल्कुल है ... – horgh

    4

    आमतौर पर, जब आप डिस्क स्थान पर कम होते हैं, या जब आपने डेटाबेस वृद्धि के लिए अनुचित रूप से कम अधिकतम आकार सेट किया है तो tempdb भर जाता है। कई लोग सोचते हैं कि tempdb केवल #temp टेबल के लिए उपयोग किया जाता है। वास्तव में, जब आप कभी भी एक अस्थायी तालिका बनाये बिना tempdb भर सकते हैं। कुछ अन्य परिस्थितियों में आपको tempdb पैदा कर सकता है को भरने के लिए:

    • किसी भी छंटाई कि अधिक स्मृति सर्वर tempdb में अपने काम करने के लिए मजबूर किया जाएगा की तुलना में एसक्यूएल के लिए आवंटित किया गया है की आवश्यकता है;
    • यदि सॉर्टिंग को tempdb, पर आवंटित किए गए स्थान की तुलना में अधिक स्थान की आवश्यकता है, तो उपर्युक्त त्रुटियों में से एक होगा;
    • डीबीसीसी चेकडीबी ('कोई डेटाबेस') tempdb में अपना काम करेगा - बड़े डेटाबेस पर, यह काफी जगह का उपभोग कर सकता है;
    • डीबीसीसी डीबीआरआईएनएक्सएक्स या इसी तरह के डीबीसीसी कमांड 'सॉर्ट इन टेम्पपड' विकल्प सेट के साथ संभावित रूप से tempdb भर जाएगा;
    • यूनियनों को शामिल करने वाले बड़े परिणाम, कार्टेसियन में शामिल होते हैं, बाहरी जुड़ते हैं, कर्सर, अस्थायी तालिकाओं, तालिका चर, और हैशिंग को अक्सर tempdb से सहायता की आवश्यकता होती है;
    • किसी भी लेनदेन को छोड़ दिया गया है और वापस लुढ़का नहीं वस्तुओं को tempdb में अनाथ हो सकता है;
    • विकल्प के साथ एक ओडीबीसी डीएसएन का उपयोग 'अस्थायी संग्रहीत प्रक्रियाओं' सेट के साथ कनेक्शन के जीवन के लिए वस्तुओं को छोड़ सकता है।

      उपयोग tempdb GO

      SELECT name 
           FROM tempdb..sysobjects 
      
          SELECT OBJECT_NAME(id), rowcnt 
           FROM tempdb..sysindexes 
           WHERE OBJECT_NAME(id) LIKE '#%' 
           ORDER BY rowcnt DESC 
      

    उच्च rowcount, मूल्यों की संभावना सबसे बड़ी अस्थायी तालिकाओं कि अंतरिक्ष उपभोग कर रहे हैं इंगित करेगा।

    अल्पकालिक ठीक

    DBCC OPENTRAN -- or DBCC OPENTRAN('tempdb') 
    DBCC INPUTBUFFER(<number>) 
    KILL <number> 
    

    लंबे समय तक रोकथाम

    -- SQL Server 7.0, should show 'trunc. log on chkpt.' 
    -- or 'recovery=SIMPLE' as part of status column: 
    
    EXEC sp_helpdb 'tempdb' 
    
    -- SQL Server 2000, should yield 'SIMPLE': 
    
    SELECT DATABASEPROPERTYEX('tempdb', 'recovery') 
    ALTER DATABASE tempdb SET RECOVERY SIMPLE 
    

    संदर्भ: http://sqlserver2000.databases.aspfaq.com/why-is-tempdb-full-and-how-can-i-prevent-this-from-happening.html
    अन्य संदर्भ: http://social.msdn.microsoft.com/Forums/is/transactsql/thread/af493428-2062-4445-88e4-07ac65fedb76

    +0

    क्या आपने यह कोशिश की ???? भुगतान भुगतान से शीर्ष 1 payment_date चुनें जहां edit_date शून्य नहीं है और pay_date = edit_date pay_date desc –

    +0

    द्वारा आदेश मैंने प्रश्न में दिए गए सभी प्रश्नों का परीक्षण किया। या आप क्या पूछ रहे हो – horgh

    +0

    मैं जानना चाहता था कि –

    संबंधित मुद्दे

     संबंधित मुद्दे