2008-09-23 6 views
12

मैं Oracle में निम्नलिखित एसक्यूएल बयान को चलाने के लिए कोशिश कर रहा हूँ, और इसे चलाने के लिए उम्र लेता है:एक चयन करें क्वेरी जो SQL सर्वर पर जल्दी से चलाता है कि Oracle पर धीमी गति से चलाता है अनुकूलन

SELECT orderID FROM tasks WHERE orderID NOT IN 
(SELECT DISTINCT orderID FROM tasks WHERE 
engineer1 IS NOT NULL AND engineer2 IS NOT NULL) 

तो मैं बस चलाने उप-भाग में खंड, कि Oracle में बहुत जल्दी चलाता है कि, यानी

SELECT DISTINCT orderID FROM tasks WHERE 
engineer1 IS NOT NULL AND engineer2 IS NOT NULL 

क्यों पूरे बयान Oracle में इतने लंबे समय लेने के लिए है? SQL सर्वर में पूरा कथन जल्दी से चलता है।

वैकल्पिक रूप से एक सरल/अलग/बेहतर SQL कथन है जिसका उपयोग करना चाहिए?

समस्या के बारे में कुछ और जानकारी:

  • प्रत्येक आदेश (engineer1 होगा और सेट engineer2 एक या अपने कार्य के अधिक) कई कार्यों
  • प्रत्येक आदेश आवंटित किया जाएगा से बना है या आदेश कर सकते हैं अनियंत्रित किया जाना चाहिए (उसके सभी कार्यों में इंजीनियर फ़ील्ड के लिए शून्य मान हैं)
  • मैं उन ऑर्डर आईडी को खोजने की कोशिश कर रहा हूं जो आवंटित नहीं हैं।

बस अगर कोई फर्क पड़ता है, तो तालिका में ~ 120k पंक्तियां, और क्रमशः 3 कार्य, इसलिए ~ 40k विभिन्न ऑर्डर होते हैं। उत्तर देने के लिए

जवाब:

  • मैं एक एसक्यूएल बयान है कि दोनों एसक्यूएल सर्वर और Oracle में काम करता है पसंद करेंगे।
  • कार्यों में केवल ऑर्डर आईडी और taskID पर एक अनुक्रमणिका है।
  • मैंने कथन का EXISTS संस्करण नहीं करने की कोशिश की लेकिन इसे रद्द करने से 3 मिनट से अधिक समय तक चला। शायद बयान के जॉइन संस्करण की आवश्यकता है?
  • ऑर्डर आईडी कॉलम के साथ "ऑर्डर" तालिका भी है। लेकिन मैं मूल SQL कथन में शामिल नहीं करके प्रश्न को सरल बनाने की कोशिश कर रहा था।

मुझे लगता है कि मूल SQL कथन में SQL क्वेरी के पहले भाग में प्रत्येक पंक्ति के लिए उप-क्वेरी हर बार चलती है - भले ही यह स्थिर है और केवल एक बार चलाने की आवश्यकता होनी चाहिए?

निष्पादित

ANALYZE TABLE tasks COMPUTE STATISTICS; 

अपने मूल SQL विवरण बहुत तेजी से अमल कर दिया।

हालांकि मैं अभी भी उत्सुक हूं कि मुझे ऐसा क्यों करना है, और यदि मुझे इसे फिर से चलाने की आवश्यकता होगी?

आँकड़े Oracle की लागत आधारित optimzer जानकारी है कि यह दक्षता विभिन्न निष्पादन योजनाओं के निर्धारित करने की जरूरत दे: उदाहरण के लिए, एक मेज, पंक्तियों की औसत चौड़ाई rowsin की संख्या, उच्चतम और प्रति स्तंभ न्यूनतम मूल्य, प्रति कॉलम के अलग-अलग मान, क्लस्टरिंग इंडेक्स आदि का कारक आदि।

एक छोटे से डेटाबेस तुम सिर्फ सेटअप एक नौकरी हर रात आंकड़े एकत्र करता है और यह अकेला छोड़ने के लिए कर सकते हैं। वास्तव में, यह डिफ़ॉल्ट 10g के तहत है। बड़े कार्यान्वयन के लिए आपको आमतौर पर निष्पादन की स्थिरता का वजन होता है जिस तरह से डेटा परिवर्तन, जो एक मुश्किल संतुलन है, के खिलाफ योजनाओं का वजन करता है।

ओरेकल भी एक सुविधा "गतिशील नमूना" है कि निष्पादन समय पर प्रासंगिक आँकड़े निर्धारित करने के लिए नमूना तालिकाओं के लिए प्रयोग किया जाता है कहा जाता है। यह डेटा गोदामों के साथ अक्सर उपयोग किया जाता है जहां के ओवरहेड लंबे समय से चलने वाली क्वेरी के लिए संभावित प्रदर्शन वृद्धि से अधिक हो जाते हैं।

+1

मैं कभी नहीं समझूंगा कि क्यों प्रोग्रामर अक्सर अपने इन क्लॉज में DISTINCT डालते हैं। 7 में (1, 1, 1, 1, 2, 2, 2, 7) है? 5 है अगर मेरी सूची (1, 2, 7) है तो उत्तर नहीं बदलता है। जब मैं ओरेकल में इसे चलाता हूं तो यह अलग-अलग अनदेखा करता है ... सीबीओ को पता चलता है कि कोई मूल्य नहीं है। –

उत्तर

9

अक्सर इस प्रकार की समस्या दूर हो जाता है तो आप शामिल तालिकाओं का विश्लेषण

ANALYZE TABLE tasks COMPUTE STATISTICS; 
+0

अविश्वसनीय, मैंने इसे चलाने के बाद अपना मूल SQL कथन चलाने के लिए केवल 1 सेकंड के भीतर लिया। – RickL

+5

यह आंकड़े एकत्र करने के लिए एक अप्रचलित वाक्यविन्यास है। डीबीएमएस_STATS एक और मजबूत तरीका है। http://download.oracle.com/docs/cd/B19306_01/server.102/b14211/stats.htm#PFGRF30102 –

+3

मैं मानता हूं, यह अप्रचलित है। कृपया इसका उपयोग करने से बचने की कोशिश करें। DBMS_STATS का उपयोग करें और सुनिश्चित करें कि आप अपनी अनुक्रमणिका भी प्राप्त करते हैं, आप तालिका के आंकड़े एकत्र करते समय कैस्केड => सत्य सेट कर सकते हैं। –

3

"आईएन" - खंड ओरेकल में बहुत धीमी होने के लिए जाना जाता है। वास्तव में, ओरेकल में आंतरिक क्वेरी ऑप्टिमाइज़र "आईएन" के साथ कथन को संभाल नहीं सकता है। का उपयोग करते हुए "मौजूद है" का प्रयास करें:

SELECT orderID FROM tasks WHERE orderID NOT EXISTS 
    (SELECT DISTINCT orderID FROM tasks WHERE 
     engineer1 IS NOT NULL AND engineer2 IS NOT NULL)`print("code sample");` 

सावधानी: कृपया जांच लें कि क्वेरी एक ही डेटा परिणाम बनाता है।

एडिथ कहता है: ओउप्स, क्वेरी अच्छी तरह से बनाई गई नहीं है, लेकिन सामान्य विचार सही है। ओरेकल को दूसरी (आंतरिक) क्वेरी के लिए एक पूर्ण टेबल स्कैन पूरा करना होगा, परिणाम बनाएं और फिर उन्हें पहले (बाहरी) क्वेरी से तुलना करें, यही कारण है कि यह धीमा हो रहा है।

SELECT orderID AS oid FROM tasks WHERE NOT EXISTS 
    (SELECT DISTINCT orderID AS oid2 FROM tasks WHERE 
     engineer1 IS NOT NULL AND engineer2 IS NOT NULL and oid=oid2) 

या कुछ समान ;-)

+0

मैं एक ही प्रश्न पर आया (नीचे मेरा जवाब देखें), * सबक्वायरी के पास DISTINCT ऑर्डर आईडी का चयन करने का कोई कारण नहीं है। * जहां "ऑर्डर आईडी" और EXISTS (वाक्यविन्यास त्रुटि) के बीच ड्रॉप करें। * 'प्रिंट ("कोड नमूना") ड्रॉप करें, जाहिर है ;-) – Mac

+0

जब मैं दूसरी क्वेरी को आज़माता हूं तो यह एक त्रुटि हो जाती है? ओआरए -00 9 044: "ओआईडी 2": अवैध पहचानकर्ता – RickL

+0

डालने वाले "AS oid2" का उपयोग करें, यह पहले पूछताछ में नहीं था। – Georgi

0

आपकी क्वेरी

SELECT orderID FROM tasks 
WHERE engineer1 IS NOT NULL OR engineer2 IS NOT NULL 

के रूप में ही नहीं है का प्रयास करें?

+0

नहीं, यह नहीं है। मैंने वही गलती की :-) प्रत्येक ऑर्डर में कई कार्य हैं, और यदि उनमें से किसी एक कार्य को इंजीनियर किया गया है, तो ऑर्डर "आवंटित" –

0

कैसे के बारे में:

SELECT DISTINCT orderID FROM tasks t1 WHERE NOT EXISTS (SELECT * FROM tasks t2 WHERE t2.orderID=t1.orderID AND (engineer1 IS NOT NULL OR engineer2 IS NOT NULL)); 

हम अनुकूलन के एक गुरु नहीं हूँ, लेकिन हो सकता है आप भी अपने Oracle डाटाबेस में कुछ अनुक्रमित अनदेखी की।

+0

के रूप में गिना जाता है, मैंने कोशिश की लेकिन यह अभी भी एक मिनट बाद चल रहा था जब मैंने रद्द कर दिया यह। – RickL

0

एक अन्य विकल्प (MSSQL को छोड़कर) माइनस उपयोग करने के लिए

SELECT orderID FROM tasks 
MINUS 
SELECT DISTINCT orderID FROM tasks WHERE engineer1 IS NOT NULL 
AND engineer2 IS NOT NULL 
+0

मैंने इसके बारे में भी सोचा, लेकिन मुझे लगता है कि यह क्वेरी सबसे तेज़ नहीं है। – Georgi

+0

हां, सावधान रहें, माइनस कथन स्मृति का बहुत उपयोग करता है –

+0

आम तौर पर निहित विशिष्ट अनावश्यक ओवरहेड होगा, लेकिन इस मामले में यह संभवतः उचित होगा। हालांकि तालिका के दो स्कैन अक्षम हो सकते हैं। –

-2

उप प्रश्नों Oracle के साथ "बुरा" हो रहा है। आमतौर पर जुड़ने का उपयोग करना बेहतर होता है।

यहाँ कैसे के साथ अपने सबक्वेरी के पुनर्लेखन के लिए पर एक लेख है में शामिल होने:

SELECT orderID 
FROM tasks 
GROUP BY orderID 
HAVING COUNT(engineer1) = 0 OR COUNT(engineer2) = 0 

मुझे यकीन है कि अगर आप चाहते हैं नहीं कर रहा हूँ: http://www.dba-oracle.com/sql/t_rewrite_subqueries_performance.htm

+0

कुछ भी "बुरा" जरूरी नहीं है। विभिन्न तकनीकों के लाभों के बीच अंतर लगभग हमेशा एक विशेष डेटा सेट के मूल्य वितरण और सूचकांक और बाधाओं की उपस्थिति या अनुपस्थिति के लिए आता है। –

-1

यहाँ एक वैकल्पिक दृष्टिकोण है जो मुझे लगता है कि आप क्या चाहते हैं देता है हैविंग क्लॉज में "और" या "OR"। यह व्यवसाय तर्क के अनुसार लगता है कि इन दो क्षेत्रों में दोनों को आबादी होनी चाहिए या दोनों नल हो; यदि इसकी गारंटी है तो आप केवल इंजीनियर 1 की जांच करने के लिए स्थिति को कम कर सकते हैं।

आपकी मूल क्वेरी, मुझे लगता है, ऑर्डर आईडी के लिए कई पंक्तियां देगी, जबकि मेरा केवल एक ही देगा।मुझे लगता है कि यह ठीक है क्योंकि आप केवल ऑर्डर आईडी ला रहे हैं।

2

कुछ सवाल:

  • कितने पंक्तियों कार्यों में देखते हैं?
  • इस पर कौन से इंडेक्स परिभाषित किए गए हैं?
  • क्या तालिका का हाल ही में विश्लेषण किया गया है?

एक और तरीका है एक ही क्वेरी लिखने के लिए होगा:

select orderid from ORDERS 
minus 
select orderid from tasks 
where engineer1 IS NOT NULL AND engineer2 IS NOT NULL 

या

:

select orderid from tasks 
minus 
select orderid from tasks 
where engineer1 IS NOT NULL AND engineer2 IS NOT NULL 

हालांकि, मैं नहीं बल्कि क्वेरी एक "आदेश" तालिका को शामिल करने की उम्मीद करेंगे

select orderid from ORDERS 
where orderid not in 
(select orderid from tasks 
    where engineer1 IS NOT NULL AND engineer2 IS NOT NULL 
) 

या

select orderid from ORDERS 
where not exists 
(select null from tasks 
    where tasks.orderid = orders.orderid 
    and engineer1 IS NOT NULL OR engineer2 IS NOT NULL 
) 
+0

आपका दूसरा प्रस्ताव एक ही बात नहीं है, क्योंकि ऑर्डर आईडी के लिए कई कार्य हो सकते हैं, कुछ असाइन किए गए हैं और कुछ नहीं। वह केवल ऑर्डर आईडी चाहता है जिसके लिए कार्यों में से कोई भी असाइन नहीं किया गया है। –

+0

आपके अंतिम प्रस्ताव में एक सहसंबंधित सबक्वायरी (उदा। "और tasks.orderID = order.orderID" जोड़ें) की आवश्यकता होगी। आप सबक्वायरी को संशोधित किए बिना बस EXISTS में नहीं बदल सकते हैं। –

+0

दोनों अंक अब –

2

मैं TZQTZIO से सहमत हूं, मुझे आपकी क्वेरी नहीं मिली है।

यदि हम मानते हैं कि क्वेरी समझ में आ गई है तो आप कुछ सुझावों के रूप में EXISTS का उपयोग करने और IN से बचने का प्रयास करना चाहेंगे। में हमेशा बुरा नहीं होता है और ऐसे संभावित मामले होते हैं जो कोई दिखा सकता है कि यह वास्तव में EXISTS से बेहतर प्रदर्शन करता है।

प्रश्न शीर्षक बहुत उपयोगी नहीं है। मैं इस क्वेरी को एक ओरेकल डेटाबेस में सेट कर सकता हूं और इसे धीमा कर सकता हूं और इसे दूसरे में तेजी से चला सकता हूं। ऐसे कई कारक हैं जो निर्धारित करते हैं कि डेटाबेस क्वेरी, ऑब्जेक्ट आंकड़े, SYS स्कीमा आंकड़े, और पैरामीटर, साथ ही साथ सर्वर प्रदर्शन को हल करता है। Sqlserver बनाम ओरेकल यहाँ समस्या नहीं है।

क्वेरी ट्यूनिंग और प्रदर्शन में रूचि रखने वालों के लिए और अधिक जानने के लिए Google शब्दों में से कुछ सीखना चाहते हैं "ओक टेबल ऑरैकल" और "ऑरकल जोनाथन लेविस"।

3

मैं का उपयोग कर की कोशिश करेगा बजाय मिलती

SELECT 
    t.orderID 
FROM 
    tasks t 
    LEFT JOIN tasks t1 
     ON t.orderID = t1.orderID 
     AND t1.engineer1 IS NOT NULL 
     AND t1.engineer2 IS NOT NULL 
WHERE 
    t1.orderID IS NULL 

भी आपकी मूल क्वेरी शायद आसान होगा समझने के लिए अगर यह के रूप में निर्दिष्ट किया गया था:

SELECT orderID FROM orders WHERE orderID NOT IN 
(SELECT DISTINCT orderID FROM tasks WHERE 
engineer1 IS NOT NULL AND engineer2 IS NOT NULL) 

(यह मानते हुए कि आप सभी आदेशों के साथ आदेश तालिका है सूचीबद्ध)

जिसे बाद में शामिल किया जा सकता है:

SELECT 
    o.orderID 
FROM 
    orders o 
    LEFT JOIN tasks t 
     ON o.orderID = t.orderID 
     AND t.engineer1 IS NOT NULL 
     AND t.engineer2 IS NOT NULL 
WHERE 
    t.orderID IS NULL 
+0

को सही करते हैं यह काम नहीं करता है क्योंकि इसे केवल ऑर्डर लौटाया जाना चाहिए जहां * सभी * कार्य इंजीनियर फ़ील्ड शून्य नहीं हैं, लेकिन यह ऑर्डर वापस करेगा जहां कुछ कार्य इंजीनियर नोल हैं, और कुछ कार्य इंजीनियर नहीं हैं। क्या आप कहां से अलग होने के लिए मतलब था? चयन OrderID कार्यों से जहां OrderID नहीं (कार्यों से अलग OrderID का चयन करें जहां engineer1 शून्य नहीं है और engineer2 IS NOT NULL) जो मैं रिटर्न का मानना ​​है:: सभी – RickL

+0

यह यह है कि आप निर्दिष्ट क्वेरी के रूप में ही परिणाम देता है लगता है उन ऑर्डर जिनके पास – kristof

+0

असाइन किए गए दोनों इंजीनियरों के साथ कोई कार्य नहीं है, लेकिन शायद मुझे कुछ याद आ रहा है, अगर एक असाइन किया गया इंजीनियर पर्याप्त आदेश देने के लिए पर्याप्त नहीं है तो बाएं जुड़ने को इस प्रकार पढ़ने के लिए बदलें: बाएं जॉइन कार्य t1orderID = t1 पर जाएं। ऑर्डर आईडी और (t1.engineer1 पूर्ण नहीं है या t1.engineer2 पूर्ण नहीं है) लेकिन यह आपकी मूल क्वेरी से अलग होगा। – kristof

-1

यदि आपके पास अभियंता 1 और इंजीनियर 2 कॉलम पर कोई अनुक्रमणिका नहीं है तो आप हमेशा SQL सर्वर में एक तालिका स्कैन उत्पन्न करने जा रहे हैं और बराबर जो भी ओरेकल में हो सकता है।

यदि आपको केवल उन ऑर्डर की आवश्यकता है जिनके पास आवंटित कार्य हैं तो निम्नलिखित दोनों प्लेटफ़ॉर्म पर ठीक काम करना चाहिए, लेकिन आपको क्वेरी परफॉर्मेंस को बेहतर बनाने के लिए कार्य तालिका में इंडेक्स जोड़ने पर भी विचार करना चाहिए।

SELECT DISTINCT orderID 
FROM tasks 
WHERE (engineer1 IS NULL OR engineer2 IS NULL) 
+0

आमतौर पर, इंजीनियर फ़ील्ड विदेशी कुंजी होंगे, इसलिए इंडेक्स वहां होना चाहिए। – tzot

+0

@ ΤΖΩΤΖΙΟΥ डाउनवोट के लिए धन्यवाद, लेकिन क्या आपने सवाल पढ़ा? "कार्यों में केवल ऑर्डर आईडी और टास्कआईडी पर एक इंडेक्स है" –

0

आप एक आदेश तालिका बनाने के लिए निर्णय लेते हैं, मैं यह करने के लिए एक आवंटित झंडा जोड़ सकते हैं और एक बिटमैप सूचकांक बनाएंगे।यह दृष्टिकोण ध्वज को अद्यतन रखने के लिए आपको व्यवसाय तर्क को संशोधित करने के लिए भी मजबूर करता है, लेकिन प्रश्न तेजी से बिजली हो जाएंगे। यह इस बात पर निर्भर करता है कि आवेदन के लिए प्रश्न कितने महत्वपूर्ण हैं।

उत्तर के संबंध में, इस मामले में बेहतर बेहतर है। सबक्वायरीज़, जॉइन, विशिष्ट और ग्रुप बाय्स को भूल जाएं, उन्हें बिल्कुल जरूरी नहीं है!

1

मुझे लगता है कि कई लोगों के पास सही एसक्यूएल है, लेकिन आंतरिक और बाहरी प्रश्नों के बीच एक जुड़ाव गुम है।
इस प्रयास करें:

SELECT t1.orderID 
FROM tasks t1 
WHERE NOT EXISTS 
     (SELECT 1 
     FROM tasks t2 
     WHERE t2.orderID = t1.orderID 
     AND t2.engineer1 IS NOT NULL 
     AND t2.engineer2 IS NOT NULL) 
+0

धन्यवाद, मैंने कोशिश की और यह सही वाक्यविन्यास है, लेकिन जब भी मैंने इसे रद्द कर दिया था तब भी यह 3 मिनट से अधिक समय तक चल रहा था। – RickL

0

किस अनुपात (ताकि Oracle डेटा के वितरण का एक बेहतर विचार है) तालिका में पंक्तियां शर्त को पूरा करती हैं "इंजीनियर 1 पूर्ण नहीं है और इंजीनियर 2 पूर्ण नहीं है"?

यह आपको बताता है (मोटे तौर पर) क्या यह संबंधित ऑर्डरिड को पुनर्प्राप्त करने के लिए किसी इंडेक्स का उपयोग करने का प्रयास करने योग्य हो सकता है।

एक और तरीका है Oracle में क्वेरी कि unindexed मामलों बहुत अच्छी तरह से संभाल होगा लिखने के लिए:

select distinct orderid 
from 
(
select orderid, 
     max(case when engineer1 is null and engineer2 is null then 0 else 1) 
      over (partition by orderid) 
      as max_null_finder 
from tasks 
) 
where max_null_finder = 0 
0

ओरेकल अनुकूलक प्रसंस्करण माइनस बयान का एक अच्छा काम करता है। यदि आप MINUS का उपयोग करके अपनी क्वेरी दोबारा लिखते हैं, तो यह बहुत तेज़ी से चलने की संभावना है:

SELECT orderID FROM tasks 
MINUS 
SELECT DISTINCT orderID FROM tasks WHERE 
engineer1 IS NOT NULL AND engineer2 IS NOT NULL 
0

नया ले लो।

Iff:

  • COUNT() फ़ंक्शन शून्य मान

और

  • में नहीं गिना जाता आप सभी कार्यों की OrderID चाहते हैं, जहां कोई भी कार्यों में या तो इंजीनियर 1 या इंजीनियर 2 है

    SELECT orderID 
    FROM tasks 
    GROUP BY orderID 
    HAVING COUNT(engineer1) = 0 AND COUNT(engineer2) = 0 
    

    कृपया इसे परीक्षण: एक मूल्य

तो आप यही चाहते क्या करना चाहिए करने के लिए निर्धारित किया है।

1

"हालांकि मैं अभी भी उत्सुक हूं कि मुझे ऐसा क्यों करना है, और अगर मुझे इसे फिर से चलाने की आवश्यकता होगी?"

आंकड़े ओरेकल की लागत-आधारित ऑप्टिज़र जानकारी देते हैं जिन्हें इसे विभिन्न निष्पादन योजनाओं की दक्षता निर्धारित करने की आवश्यकता होती है: उदाहरण के लिए, पंक्तियों की पंक्तियों की पंक्ति, पंक्तियों की औसत चौड़ाई, प्रति स्तंभ उच्चतम और निम्नतम मूल्य, संख्या प्रति स्तंभ अलग-अलग मूल्य, इंडेक्स के क्लस्टरिंग कारक इत्यादि।

एक छोटे डेटाबेस में आप हर रात आंकड़े इकट्ठा करने और इसे अकेले छोड़ने के लिए नौकरी स्थापित कर सकते हैं। वास्तव में, यह 10 जी के तहत डिफ़ॉल्ट है।बड़े कार्यान्वयन के लिए आपको आम तौर पर डेटा परिवर्तनों के तरीके के खिलाफ निष्पादन योजनाओं की स्थिरता का वजन करना पड़ता है, जो एक कठिन संतुलन है।

ओरेकल में "गतिशील नमूनाकरण" नामक एक सुविधा भी है जिसका उपयोग निष्पादन समय पर प्रासंगिक आंकड़ों को निर्धारित करने के लिए नमूना तालिकाओं में किया जाता है। यह डेटा गोदामों के साथ अक्सर उपयोग किया जाता है जहां नमूनाकरण का ऊपरी भाग लंबे समय से चलने वाली क्वेरी के संभावित प्रदर्शन में वृद्धि से अधिक हो जाता है।

+0

धन्यवाद के साथ एक प्रश्न 5 मिनट से 0.3 सेकंड तक चला गया धन्यवाद, आपके उत्तर को प्रश्न में कॉपी किया गया। – RickL

+0

डेव एक गतिशील नमूना बिंग –

+0

पर मुझे गतिशील नमूना पसंद है। मुझे नहीं पता कि यह अधिक बार बात नहीं की जाती है। –

0

मैं ΤΖΩΤΖΙΟΥ से सहमत और wearejimbo आपकी क्वेरी होना चाहिए ...

SELECT DISTINCT orderID FROM Tasks 
WHERE Engineer1 IS NULL OR Engineer2 IS NULL; 

मैं एसक्यूएल सर्वर के बारे में पता नहीं है, लेकिन इस क्वेरी किसी भी इंडेक्सों का लाभ लेने के लिए सक्षम नहीं होगा क्योंकि अशक्त पंक्तियां इंडेक्स में नहीं हैं। इसका समाधान क्वेरी को फिर से लिखना होगा जिससे फ़ंक्शन आधारित इंडेक्स को बनाया जा सके जिसमें केवल शून्य मान पंक्तियां शामिल हों। यह एनवीएल 2 के साथ किया जा सकता है, लेकिन संभवतः SQL सर्वर के लिए पोर्टेबल नहीं होगा।

मुझे लगता है कि सबसे अच्छा जवाब वह नहीं है जो आपके मानदंडों को पूरा करता है और वह उस मंच के लिए सर्वोत्तम प्रत्येक प्लेटफ़ॉर्म के लिए एक अलग कथन लिखता है।

+1

एसक्यूएल सर्वर एक इंडेक्स में केवल एक नल पंक्ति की अनुमति देता है सिवाय इसके कि आप फ़िल्टर किए गए इंडेक्स को बनाते हैं। इस मामले में इसमें एनयूएलएल शामिल नहीं है। – usr

+0

जानकारी के लिए धन्यवाद। –

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