चुनिंदा गिनती (*) और चुनिंदा गिनती (any_non_null_column) में क्या अंतर है?


58

मुझे याद है कि (ओरेकल पर) उच्चारण select count(*) from any_tableऔर के बीच अंतर है select count(any_non_null_column) from any_table

इन दोनों कथनों के बीच क्या अंतर हैं, यदि कोई हो?

जवाबों:


72
  • COUNT (*) में NULLS शामिल होगा
  • COUNT (column_or_expression) नहीं होगा।

इसका अर्थ है कि पाठ्यक्रम COUNT(any_non_null_column)को वैसा ही दिया जाएगा COUNT(*)क्योंकि मतभेद पैदा करने के लिए कोई पूर्ण मान नहीं हैं।

आम तौर पर, COUNT(*)बेहतर होना चाहिए क्योंकि किसी भी सूचकांक का उपयोग किया जा सकता है क्योंकि COUNT(column_or_expression)अनुक्रमित या SARGable नहीं हो सकता है

से एएनएसआई-92 ( "के लिए देखो Scalar expressions 125")

मामला:

a) यदि COUNT (*) निर्दिष्ट है, तो परिणाम T की कार्डिनैलिटी है।

b) अन्यथा, TX एकल-स्तंभ तालिका है जो T की प्रत्येक पंक्ति में <मान अभिव्यक्ति> को लागू करने और अशक्त मानों को समाप्त करने का परिणाम है। यदि एक या एक से अधिक अशक्त मानों को समाप्त कर दिया जाता है, तो एक पूरा होने की स्थिति उठाई जाती है: चेतावनी- शून्य मान सेट फ़ंक्शन में समाप्त हो जाता है।

SQL सर्वर और Sybase पर भी कम से कम वही नियम लागू होते हैं

नोट: COUNT (1) COUNT (*) के समान है क्योंकि 1 एक गैर-अशक्त अभिव्यक्ति है।


4
बस पूर्णता के लिए: यदि count(*)उपयोग किया जाता है तो ओरेकल एक अनुक्रमित नहीं-शून्य कॉलम पर एक इंडेक्स-स्कैन का उपयोग करेगा।
a_horse_with_no_name

मुझे लगा कि तीन संभावित विकल्प थे COUNT(*), COUNT(<constant>)और COUNT(<column name>)यह कि तीनों के साथ उपसर्ग किया जा सकता है ALLया DISTINCT( ALLयदि छोड़ा गया है तो डिफ़ॉल्ट रूप से )। मैं सोच रहा हूँ कि आप कहाँ कहते हैं कि किस अभिव्यक्ति का उपयोग किया जा सकता है _or_expression?
onedaywhen

2
@onedaywhen COUNT(1)एक बेकार उदाहरण के रूप में, यह उसी के समान है COUNT(*)COUNT(CASE WHEN a>b THEN 1 END)एक उदाहरण के रूप में जहां पंक्तियों की गिनती होती है जहां a> b।
ypercube y

16

ओरेकल के किसी भी हाल के (यानी 8.x + ) संस्करण में वे एक ही काम करते हैं । दूसरे शब्दों में केवल अंतर शब्दार्थ है:

select count(*) from any_table

आसानी से पठनीय और स्पष्ट है कि आप क्या करने की कोशिश कर रहे हैं, और

select count(any_non_null_column) from any_table

क्योंकि पढ़ना मुश्किल है

  1. यह लंबा है
  2. यह कम पहचाने जाने योग्य है
  3. आपको इस बारे में सोचना होगा कि क्या any_non_null_columnवास्तव में इसे लागू किया गया हैnot null

संक्षेप में, का उपयोग करेंcount(*)


9

हाल के संस्करण में वास्तव में गिनती (*) और गिनती ( कोई शून्य स्तंभ नहीं ) के बीच कोई अंतर नहीं है, अशक्त न होने पर जोर देने के साथ :-) क्या संयोगवश उस विषय को एक ब्लॉग पोस्ट के साथ कवर किया गया है: क्या गिनती (कॉल) गिनती से बेहतर है (*)?


1

पुस्तक में Oracle8i सर्टिफिकेट प्रोफेशनल डीबीए प्रमाणन परीक्षा गाइड (आई +००७२१३०६०१) , पृष्ठ 78 COUNT (1) तेजी से है कि वास्तव में चला जाएगा कहते हैं COUNT (*) क्योंकि कुछ तंत्र प्रत्येक स्तंभ के nullability के लिए डेटा शब्दकोश की जाँच के लिए खेलने में कहा जाता है (या COUNT (*) का उपयोग करते समय कम से कम पहला स्तंभ गैर-अशक्तता के साथ ) । COUNT (1) उन तंत्रों को बायपास करता है।

MySQL tblname पर 'SELECT COUNT (1) के लिए धोखा देता है?' तालिका गणना के लिए तालिका शीर्षलेख पढ़कर MyISAM तालिकाओं पर। InnoDB हर बार मायने रखता है।

यह जांचने के लिए कि क्या COUNT (1) डेटाबेस अज्ञेय तरीके से COUNT (*) से अधिक तेज़ी से चलेगा, बस निम्नलिखित चलाएं और अपने लिए चलने का समय निर्धारित करें:

SELECT COUNT(1) FROM tblname WHERE 1 = 1;
SELECT COUNT(*) FROM tblname WHERE 1 = 1;
SELECT COUNT(column-name) FROM tblname WHERE 1 = 1;

यह COUNT फ़ंक्शन को स्टोरेज इंजन या RDBMS की परवाह किए बिना समान स्तर के खेल के मैदान पर संचालित करता है।


8
परीक्षा गाइड गलत है। ओरेकल काउंट (*) = काउंट (1) (कम से कम संस्करण 7 के बाद) में। देखें asktom.oracle.com/pls/asktom/... (पहले से ही @JackPDouglas द्वारा संदर्भित)
लेह Riffel

3
दिलचस्प। COUNT (*) ANSI युक्ति के अनुसार सभी कॉलमों की जाँच नहीं करनी चाहिए। एसओ से SQL सर्वर के लिए कुछ समय पहले भी पूछा गया था
ढेर

@gb, @Leigh Riffel, @bernd_k में चिमने के लिए धन्यवाद और मुझे पढ़ने और अधिक जानने के लिए याद दिला रहा है, खासकर जब से मैं थोड़ी देर के लिए ओरेकल के साथ काम नहीं कर रहा हूं।
रोलैंडम्यूसीडीडीबीए
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.