थिलो ने अंतर को ठीक किया... COUNT( column_name )
COUNT( * )
. से कम संख्या लौटा सकता है अगर column_name
NULL
हो सकता है ।
हालांकि, अगर मैं आपके प्रश्न का उत्तर देने में थोड़ा अलग कोण ले सकता हूं, क्योंकि आप प्रदर्शन पर ध्यान केंद्रित कर रहे हैं।
सबसे पहले, ध्यान दें कि SELECT COUNT(*) FROM table;
संभावित रूप से लेखकों को अवरुद्ध कर देगा, और इसे अन्य पाठकों/लेखकों द्वारा भी अवरुद्ध कर दिया जाएगा जब तक कि आपने अलगाव स्तर को नहीं बदला है (घुटने का झटका WITH (NOLOCK)
हो जाता है) लेकिन मैं देख रहा हूं कि बड़ी संख्या में लोग अंततः आरसीएसआई में विश्वास करने लगे हैं)। जिसका अर्थ है कि जब आप अपनी "सटीक" गिनती प्राप्त करने के लिए डेटा पढ़ रहे हैं, तो ये सभी डीएमएल अनुरोध जमा हो रहे हैं, और जब आपने अंततः अपने सभी ताले जारी किए हैं, तो बाढ़ के द्वार खुलते हैं, डालने/अपडेट/डिलीट का एक गुच्छा गतिविधि होती है, और आपकी "सटीक" गणना हो जाती है।
यदि आपको पूरी तरह से लेन-देन के अनुरूप और सटीक पंक्ति गणना की आवश्यकता है (भले ही यह केवल मिलीसेकंड की संख्या के लिए मान्य हो, जो आपको संख्या वापस करने में लगती है), तो SELECT COUNT( * )
आपकी एकमात्र पसंद है।
दूसरी ओर, यदि आप 99.9% सटीक बॉलपार्क प्राप्त करने का प्रयास कर रहे हैं, तो आप इस तरह की एक क्वेरी के साथ बहुत बेहतर हैं:
SELECT row_count = SUM(row_count)
FROM sys.dm_db_partition_stats
WHERE [object_id] = OBJECT_ID('dbo.Table')
AND index_id IN (0,1);
(SUM
क्या विभाजित तालिकाओं के लिए खाता है - यदि आप तालिका विभाजन का उपयोग नहीं कर रहे हैं, तो आप इसे छोड़ सकते हैं।)
यह DMV उन पंक्तियों के अपवाद के साथ तालिकाओं के लिए सटीक पंक्ति गणना रखता है जो वर्तमान में लेन-देन में भाग ले रही हैं - और वही लेन-देन वही हैं जो आपके SELECT COUNT
क्वेरी प्रतीक्षा करें (और अंततः इसे पढ़ने के लिए आपके पास समय से पहले इसे गलत बना दें)। लेकिन अन्यथा यह आपके द्वारा प्रस्तावित क्वेरी की तुलना में बहुत तेज़ उत्तर देगा, और WITH (NOLOCK)
का उपयोग करने से कम सटीक नहीं होगा। ।