बहुत करीब अनुमानित (किसी भी इन-फ्लाइट लेनदेन को अनदेखा करना) होगा:
SELECT SUM(p.rows) FROM sys.partitions AS p
INNER JOIN sys.tables AS t
ON p.[object_id] = t.[object_id]
INNER JOIN sys.schemas AS s
ON s.[schema_id] = t.[schema_id]
WHERE t.name = N'myTable'
AND s.name = N'dbo'
AND p.index_id IN (0,1);
यह COUNT(*)
. की तुलना में बहुत तेज़, बहुत तेज़ी से वापस आएगा , और यदि आपकी तालिका पर्याप्त तेज़ी से बदल रही है, तो यह वास्तव में कोई कम सटीक नहीं है - यदि आपकी तालिका आपके COUNT (और ताले लिए गए) शुरू करने के बीच बदल गई है और जब इसे वापस कर दिया गया था (जब ताले जारी किए गए थे और सभी प्रतीक्षा लेखन लेनदेन अब टेबल पर लिखने की अनुमति दी गई थी), क्या यह इतना अधिक मूल्यवान है? मुझे ऐसा नहीं लगता।
यदि आपके पास उस तालिका का कुछ सबसेट है जिसे आप गिनना चाहते हैं (कहते हैं, WHERE some_column IS NULL
), आप उस कॉलम पर एक फ़िल्टर्ड इंडेक्स बना सकते हैं, और जहां क्लॉज एक तरह से या दूसरे की संरचना कर सकते हैं, इस पर निर्भर करता है कि यह अपवाद था या नियम (इसलिए छोटे सेट पर फ़िल्टर्ड इंडेक्स बनाएं)। तो इन दो इंडेक्स में से एक:
CREATE INDEX IAmTheException ON dbo.table(some_column)
WHERE some_column IS NULL;
CREATE INDEX IAmTheRule ON dbo.table(some_column)
WHERE some_column IS NOT NULL;
तब आप इसी तरह से गिनती प्राप्त कर सकते हैं:
SELECT SUM(p.rows) FROM sys.partitions AS p
INNER JOIN sys.tables AS t
ON p.[object_id] = t.[object_id]
INNER JOIN sys.schemas AS s
ON s.[schema_id] = t.[schema_id]
INNER JOIN sys.indexes AS i
ON p.index_id = i.index_id
WHERE t.name = N'myTable'
AND s.name = N'dbo'
AND i.name = N'IAmTheException' -- or N'IAmTheRule'
AND p.index_id IN (0,1);
और यदि आप इसके विपरीत जानना चाहते हैं, तो आप ऊपर दी गई पहली क्वेरी से घटा दें।