हमारे पास प्राथमिक कुंजी (ऑटोइनक बिगिंट) के साथ 35 कॉलम और 3 गैर-क्लस्टर, गैर-अद्वितीय इंडेक्स (प्रत्येक पर एक int कॉलम)।मुझे "डेटाबेस के लिए लॉग फ़ाइल" tempdb 'पूर्ण क्यों है "
PAYMENT_DATE
datetime NOT NULL
EDIT_DATE
datetime 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
सर्वर की एक जोड़ी की जरूरत है इसे करने के लिए सेकंड। लेकिन अगर हम क्वेरी 2 चलाएँ:
select top 1 *
from payments
where edit_date is not null
order by payment_date desc
निष्पादन डेटाबेस 'tempdb' के लिए लॉग फ़ाइल साथ समाप्त होता है भरा हुआ है। कुछ लॉग स्पेस को खाली करने के लिए डेटाबेस के लिए लेनदेन लॉग का बैकअप लें।
हम कुछ निश्चित स्तंभ के साथ बदलते हैं *, क्वेरी 3
select top 1 payment_date
from payments
where edit_date is not null
order by payment_date desc
यह भी सेकंड के एक जोड़े में खत्म देखते हैं।
जादू कहां है?
संपादित करें मैंने क्वेरी 1 बदल दिया है ताकि यह दूसरी क्वेरी के समान पंक्तियों पर समान रूप से संचालित हो। और फिर भी यह एक सेकंड में लौटता है, जबकि क्वेरी 2 tempdb भरता है।
उत्तर मैं एक सूचकांक से जोड़ने के लिए सलाह का पालन, दोनों तिथि खाने के लिए ऐसा किया - सब कुछ, जल्दी काम करना शुरू किया अपेक्षा के अनुरूप। हालांकि, सवाल यह था - क्यों इस सटीक स्थिति में SQL सर्वर समान प्रश्नों पर अलग-अलग व्यवहार करता है (क्वेरी 1 बनाम क्वेरी 2); मैं सर्वर अनुकूलन के तर्क को समझना चाहता था। मैं सहमत हूं कि दोनों प्रश्नों ने समान रूप से tempdb का उपयोग किया था, लेकिन उन्होंने नहीं किया ....
अंत में मैं पहले जवाब के रूप में चिह्नित हूं, जहां मैंने अपनी समस्या के लक्षणों को देखा और पहला , साथ ही, इस से बचने के विचारों पर विचार (यानीindeces)
आपको त्रुटि संदेश की सलाह निम्नलिखित विचार किया है? कुछ प्रश्नों को tempdb के उपयोग की आवश्यकता होगी, और अगर लॉग फ़ाइल भर जाती है, तो कोई अन्य लेनदेन नहीं किया जा सकता है। –
@AndrewBarber मैंने नहीं किया..लेकिन जो मैं खोजना चाहता हूं वह है कि लगभग इसी तरह के प्रश्न पूरी तरह से अलग तरीके से निष्पादित किए जाते हैं ... और इस तरह के बीहायर से बचने के लिए मुझे प्रश्न बनाने की उम्मीद कैसे है .. – horgh
उपयोग न करें स्टार्टर्स के लिए सभी कॉलम का चयन करने के लिए '*'। और उस लेनदेन लॉग का बैक अप लें। –