Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

पेशेवरों और विपक्षों के साथ SQL सर्वर तालिका में पंक्तियों की गणना करने के 4 तरीके

हाल ही में, मैं एक डेटाबेस प्रदर्शन सुधार परियोजना पर काम कर रहा था। वहां एक संग्रहीत प्रक्रिया समस्याएं पैदा कर रही थी। अपने कोड में, एक क्वेरी ने पंक्तियों की गणना को पॉप्युलेट किया और मान को स्थानीय चर में संग्रहीत किया। वह क्वेरी एक बड़ी टेबल को स्कैन कर रही थी। उसके कारण, संसाधन उपयोग काफी अधिक हो गया। समस्या को ठीक करने के लिए, हमने दोषपूर्ण कोड को हटा दिया और तालिका की पंक्तियों की संख्या उत्पन्न करने के लिए SQL सर्वर कैटलॉग दृश्यों का उपयोग किया।

SQL सर्वर तालिका में पंक्तियों की संख्या गिनने के कई तरीके हैं। यह लेख आपके लिए हमेशा इसे करने का सही तरीका चुनने के लिए उनका वर्णन करेगा।

हम निम्न में से किसी भी तरीके से तालिका की पंक्तियों की संख्या प्राप्त कर सकते हैं:

  1. COUNT() फ़ंक्शन का उपयोग करें।
  2. SQL सर्वर कैटलॉग दृश्यों का संयोजन।
  3. sp_spaceused का उपयोग करना संग्रहीत प्रक्रिया।
  4. SQL सर्वर प्रबंधन स्टूडियो का उपयोग करना।

आइए हम गहराई में जाएं।

COUNT(*) या Count(1) का उपयोग करके पंक्ति गणना प्राप्त करें

हम COUNT(*) या COUNT(1) फ़ंक्शन का उपयोग कर सकते हैं - इन दो कार्यों द्वारा उत्पन्न परिणाम समान हैं।

पंक्ति गणना प्राप्त करने के लिए, आइए पहले COUNT(*) का उपयोग करके क्वेरी चलाएं। प्रदर्शन उद्देश्यों के लिए, मैंने सांख्यिकी IO का मान ON के रूप में निर्धारित किया है।

USE wideworldimporters 
go 

SELECT Count(*) 
FROM   tblcustomer 
go  

आउटपुट:

आईओ आंकड़े:

Table 'tblCustomer'. Scan count 1, logical reads 691, physical reads 315, page server reads 0, read-ahead reads 276, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.

जैसा कि आप देख सकते हैं, SQL सर्वर को परिणाम को संतुष्ट करने के लिए 691 लॉजिकल रीड करना होता है।

अब, COUNT(1):

. का उपयोग करके क्वेरी चलाते हैं
USE wideworldimporters 
go 

SELECT Count(1) 
FROM   tblcustomer 
go  

आउटपुट:

आईओ आंकड़े:

Table 'tblCustomer'. Scan count 1, logical reads 691, physical reads 687, page server reads 0, read-ahead reads 687, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.

फिर से, SQL सर्वर को परिणाम को संतुष्ट करने के लिए 691 तार्किक पढ़ना चाहिए।

हमें यह उल्लेख करना चाहिए कि एक राय है कि काउंट (1) काउंट (*) फंक्शन से तेज है। हालाँकि, जैसा कि आप उपरोक्त उदाहरणों में देख सकते हैं, परिणाम सेट और IO आँकड़े समान हैं। इसलिए, आप तालिकाओं की पंक्ति गणना उत्पन्न करने के लिए किसी भी विधि का उपयोग कर सकते हैं।

पेशेवर:

COUNT फ़ंक्शन तालिका से पंक्तियों की सटीक संख्या भरता है।

विपक्ष:

जब आप COUNT फ़ंक्शन निष्पादित करते हैं, तो यह टेबल पर लॉक रखता है। तालिका तक पहुँचने वाले अन्य प्रश्नों को परिणाम उत्पन्न होने तक प्रतीक्षा करनी होगी। यदि आप लाखों पंक्तियों वाली तालिका के साथ व्यस्त सिस्टम पर काम कर रहे हैं, तो बेहतर होगा कि आप व्यावसायिक घंटों के दौरान COUNT फ़ंक्शन चलाने से बचें, जब तक कि आपको तालिका की सटीक पंक्ति गणना को पॉप्युलेट न करना पड़े।

SQL सर्वर कैटलॉग दृश्यों का संयोजन

हम निम्नलिखित गतिशील प्रबंधन दृश्यों के साथ SQL सर्वर कैटलॉग दृश्यों का उपयोग कर सकते हैं:

  1. sys.tables - टेबल की सूची को पॉप्युलेट करता है।
  2. sys.indexes - टेबल के इंडेक्स की सूची को पॉप्युलेट करता है।
  3. sys.partitions - प्रत्येक विभाजन की पंक्तियों को भरता है।

पंक्तियों की संख्या प्राप्त करने के लिए, निम्न स्क्रिप्ट चलाएँ:

SELECT a.NAME, 
       c.NAME, 
       Sum(b.rows) 
FROM   sys.tables a 
       INNER JOIN sys.partitions b 
               ON a.object_id = b.object_id 
       INNER JOIN sys.indexes c 
               ON b.index_id = c.index_id 
                  AND b.object_id = c.object_id 
WHERE  a.object_id = Object_id('tblCustomer') 
       AND c.index_id < 2 

आउटपुट:

क्वेरी तालिका नाम . को पॉप्युलेट करती है , इंडेक्स नाम, और कुल पंक्तियां सभी विभाजनों में।

अब, आइए आईओ सांख्यिकी की समीक्षा करें:

Table 'syssingleobjrefs'. Scan count 3, logical reads 6, physical reads 0, page server reads 0, read-ahead reads 0, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.
Table 'sysidxstats'. Scan count 1, logical reads 6, physical reads 0, page server reads 0, read-ahead reads 0, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.
Table 'sysschobjs'. Scan count 0, logical reads 4, physical reads 0, page server reads 0, read-ahead reads 0, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, page server reads 0, read-ahead reads 0, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, page server reads 0, read-ahead reads 0, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.
Table 'sysrowsets'. Scan count 2, logical reads 14, physical reads 0, page server reads 0, read-ahead reads 0, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.

जैसा कि आप देख सकते हैं, क्वेरी केवल 30 तार्किक रीड करती है।

पेशेवर:

यह दृष्टिकोण COUNT फ़ंक्शन से तेज़ है। यह उपयोगकर्ता तालिका पर ताला नहीं लगाता है, इसलिए आप इसे व्यस्त सिस्टम में उपयोग कर सकते हैं।

विपक्ष:

विधि पंक्तियों की अनुमानित संख्या को पॉप्युलेट करती है। sys.partitions के Microsoft दस्तावेज़ में, आप देख सकते हैं कि पंक्तियाँ कॉलम विभाजन के लिए पंक्तियों की अनुमानित संख्या लाता है।

इस प्रकार, यदि आप किसी ऐसी क्वेरी की तलाश में हैं जो COUNT फ़ंक्शन की तुलना में तेज़ी से परिणाम लाती है, तो आप इसका उपयोग कर सकते हैं। हालांकि, परिणाम गलत हो सकता है।

sp_spaceused का उपयोग करें

sp_spaceused पंक्तियों की गिनती के साथ प्रक्रिया निम्नलिखित विवरण प्रदान करती है:

  1. नाम - टेबल का नाम
  2. पंक्तियां - तालिका में पंक्तियों की संख्या।
  3. आरक्षित - एक टेबल के लिए कुल आरक्षित स्थान।
  4. डेटा - तालिका द्वारा उपयोग की जाने वाली कुल जगह।
  5. इंडेक्स_साइज़ - सूचकांक द्वारा उपयोग किया जाने वाला कुल स्थान।
  6. अप्रयुक्त - किसी तालिका के लिए कुल आरक्षित स्थान जिसका उपयोग नहीं किया जाता है।

वाक्य रचना है:

EXEC Sp_spaceused 'database_name.schema_name.table_name' 

क्वेरी:

EXEC Sp_spaceused 'WideWorldImportors.dbo.tblCustomer' 

आउटपुट:

SQL सर्वर प्रबंधन स्टूडियो का उपयोग करें

तालिका की पंक्तियों की संख्या प्राप्त करने के लिए, हम SQL सर्वर प्रबंधन स्टूडियो का उपयोग कर सकते हैं।

खोलें SQL सर्वर प्रबंधन स्टूडियो> डेटाबेस इंस्टेंस से कनेक्ट करें> तालिका का विस्तार करें> tblCustomer पर राइट-क्लिक करें> गुण

तालिका . में गुण विंडो में, संग्रहण पर क्लिक करें . आप देखेंगे पंक्ति गणना दाईं ओर मान:

तालिका में पंक्तियों की संख्या प्राप्त करने का एक अन्य विकल्प SQL पूर्ण SSMS ऐड-इन के साथ आता है। इस एन्हांसमेंट के साथ, जब आप ऑब्जेक्ट एक्सप्लोरर विंडो में तालिका के नाम पर माउस घुमाते हैं, तो आप एक संकेत में पंक्तियों की अनुमानित संख्या देख सकते हैं। इस तरह, आप बिना किसी अतिरिक्त प्रयास के विज़ुअल मोड में आवश्यक डेटा प्राप्त कर सकते हैं।

निष्कर्ष

इस आलेख में विशेष रूप से तालिका की पंक्तियों की कुल संख्या की गणना करने के लिए विभिन्न तरीकों की व्याख्या की गई है:

  1. COUNT फ़ंक्शन का उपयोग करना।
  2. विभिन्न कैटलॉग दृश्यों का संयोजन।
  3. sp_spaceused का उपयोग करना संग्रहीत प्रक्रिया।
  4. SQL सर्वर प्रबंधन स्टूडियो का उपयोग करना।

केवल एक विधि से चिपके रहने की आवश्यकता नहीं है। प्रत्येक प्रकार की अपनी विशिष्टताएं होती हैं, और आप अपनी स्थिति में सबसे उपयुक्त विकल्प लागू कर सकते हैं।


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL सर्वर में सभी अक्षम बाधाओं को वापस करें (T-SQL उदाहरण)

  2. मुझे एक टेबल नाम को संग्रहीत प्रो में कैसे पास करना चाहिए?

  3. SQL सर्वर लेनदेन लॉग, भाग 2:लॉग आर्किटेक्चर

  4. SQL सर्वर में सेलेक्ट क्वेरी को जल्दी से कैसे लिखें - SQL सर्वर / TSQL ट्यूटोरियल पार्ट 108

  5. संग्रहीत कार्यविधि से एकाधिक तालिकाएँ लौटाना