जवाबों:
यदि आप SQL Server 2005 और ऊपर का उपयोग कर रहे हैं, तो आप इसका उपयोग भी कर सकते हैं:
SELECT
t.NAME AS TableName,
i.name as indexName,
p.[Rows],
sum(a.total_pages) as TotalPages,
sum(a.used_pages) as UsedPages,
sum(a.data_pages) as DataPages,
(sum(a.total_pages) * 8) / 1024 as TotalSpaceMB,
(sum(a.used_pages) * 8) / 1024 as UsedSpaceMB,
(sum(a.data_pages) * 8) / 1024 as DataSpaceMB
FROM
sys.tables t
INNER JOIN
sys.indexes i ON t.OBJECT_ID = i.object_id
INNER JOIN
sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id
INNER JOIN
sys.allocation_units a ON p.partition_id = a.container_id
WHERE
t.NAME NOT LIKE 'dt%' AND
i.OBJECT_ID > 255 AND
i.index_id <= 1
GROUP BY
t.NAME, i.object_id, i.index_id, i.name, p.[Rows]
ORDER BY
object_name(i.object_id)
मेरी राय में, sp_msforeachtable
आउटपुट की तुलना में इसे संभालना आसान है ।
dtProperties
और इतने पर होंगे; चूंकि वे "सिस्टम" टेबल हैं, मैं उन पर रिपोर्ट नहीं करना चाहता।
एक स्निपेट जो मुझे http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=21021 पर मिला है:
select t.name TableName, i.rows Records
from sysobjects t, sysindexes i
where t.xtype = 'U' and i.id = t.id and i.indid in (0,1)
order by TableName;
JOIN
from sysobjects t inner join sysindexes i on i.id = t.id and i.indid in (0,1) where t.xtype = 'U'
SELECT
T.NAME AS 'TABLE NAME',
P.[ROWS] AS 'NO OF ROWS'
FROM SYS.TABLES T
INNER JOIN SYS.PARTITIONS P ON T.OBJECT_ID=P.OBJECT_ID;
जैसा कि यहां देखा गया है, यह सही गणना लौटाएगा, जहां मेटा डेटा टेबल का उपयोग करने के तरीके केवल अनुमानों को वापस करेंगे।
CREATE PROCEDURE ListTableRowCounts
AS
BEGIN
SET NOCOUNT ON
CREATE TABLE #TableCounts
(
TableName VARCHAR(500),
CountOf INT
)
INSERT #TableCounts
EXEC sp_msForEachTable
'SELECT PARSENAME(''?'', 1),
COUNT(*) FROM ? WITH (NOLOCK)'
SELECT TableName , CountOf
FROM #TableCounts
ORDER BY TableName
DROP TABLE #TableCounts
END
GO
sp_MSForEachTable 'DECLARE @t AS VARCHAR(MAX);
SELECT @t = CAST(COUNT(1) as VARCHAR(MAX))
+ CHAR(9) + CHAR(9) + ''?'' FROM ? ; PRINT @t'
आउटपुट:
अच्छी तरह से सौभाग्य से SQL सर्वर प्रबंधन स्टूडियो आपको यह कैसे करना है पर एक संकेत देता है। यह करो,
ट्रेस रोकें और Microsoft द्वारा TSQL उत्पन्न करने पर एक नज़र डालें।
संभवतः अंतिम क्वेरी में आपको एक वक्तव्य दिखाई देगा जिसके साथ शुरू होगा exec sp_executesql N'SELECT
जब आप निष्पादित किए गए कोड को विज़ुअल स्टूडियो में कॉपी करते हैं, तो आप देखेंगे कि यह कोड संपत्ति विंडो को पॉप्युलेट करने के लिए Microsoft में उपयोग किए जाने वाले सभी डेटा उत्पन्न करता है।
जब आप उस क्वेरी के लिए मध्यम संशोधन करते हैं, तो आपको कुछ इस तरह मिलेगा:
SELECT
SCHEMA_NAME(tbl.schema_id)+'.'+tbl.name as [table], --> something I added
p.partition_number AS [PartitionNumber],
prv.value AS [RightBoundaryValue],
fg.name AS [FileGroupName],
CAST(pf.boundary_value_on_right AS int) AS [RangeType],
CAST(p.rows AS float) AS [RowCount],
p.data_compression AS [DataCompression]
FROM sys.tables AS tbl
INNER JOIN sys.indexes AS idx ON idx.object_id = tbl.object_id and idx.index_id < 2
INNER JOIN sys.partitions AS p ON p.object_id=CAST(tbl.object_id AS int) AND p.index_id=idx.index_id
LEFT OUTER JOIN sys.destination_data_spaces AS dds ON dds.partition_scheme_id = idx.data_space_id and dds.destination_id = p.partition_number
LEFT OUTER JOIN sys.partition_schemes AS ps ON ps.data_space_id = idx.data_space_id
LEFT OUTER JOIN sys.partition_range_values AS prv ON prv.boundary_id = p.partition_number and prv.function_id = ps.function_id
LEFT OUTER JOIN sys.filegroups AS fg ON fg.data_space_id = dds.data_space_id or fg.data_space_id = idx.data_space_id
LEFT OUTER JOIN sys.partition_functions AS pf ON pf.function_id = prv.function_id
अब क्वेरी सही नहीं है और आप इसे अन्य प्रश्नों को पूरा करने के लिए अपडेट कर सकते हैं, बिंदु यह है, आप अपने द्वारा ट्रेस किए गए डेटा को निष्पादित करके और ट्रेस किए गए अधिकांश प्रश्नों को प्राप्त करने के लिए Microsoft के ज्ञान का उपयोग कर सकते हैं। TSQL प्रोफाइलर का उपयोग कर उत्पन्न।
मुझे लगता है कि एमएस इंजीनियरों को पता है कि एसक्यूएल सर्वर कैसे काम करता है और यह उस तरह का टीएसक्यूएल उत्पन्न करेगा, जो आप उन सभी वस्तुओं पर काम करते हैं, जिन्हें आप एसएसएमएस पर संस्करण का उपयोग करके काम कर सकते हैं, इसलिए यह बड़े किस्म के रिलीज प्रिवियो, करंट और भविष्य।
और याद रखें, केवल कॉपी न करें, इसे समझने की कोशिश करें और साथ ही आप गलत समाधान के साथ समाप्त हो सकते हैं।
वाल्टर
यह दृष्टिकोण स्ट्रिंग तालमेल का उपयोग सभी तालिकाओं और उनके मायने के साथ गतिशील रूप से बयान करने के लिए करता है, जैसे मूल प्रश्न में दिए गए उदाहरण (उदाहरण):
SELECT COUNT(*) AS Count,'[dbo].[tbl1]' AS TableName FROM [dbo].[tbl1]
UNION ALL SELECT COUNT(*) AS Count,'[dbo].[tbl2]' AS TableName FROM [dbo].[tbl2]
UNION ALL SELECT...
अंत में इसके साथ निष्पादित किया जाता है EXEC
:
DECLARE @cmd VARCHAR(MAX)=STUFF(
(
SELECT 'UNION ALL SELECT COUNT(*) AS Count,'''
+ QUOTENAME(t.TABLE_SCHEMA) + '.' + QUOTENAME(t.TABLE_NAME)
+ ''' AS TableName FROM ' + QUOTENAME(t.TABLE_SCHEMA) + '.' + QUOTENAME(t.TABLE_NAME)
FROM INFORMATION_SCHEMA.TABLES AS t
WHERE TABLE_TYPE='BASE TABLE'
FOR XML PATH('')
),1,10,'');
EXEC(@cmd);
SQL रिफ़रेन्स में सभी तालिकाओं की पंक्ति संख्या ज्ञात करने का सबसे तेज़ तरीका ( http://www.codeproject.com/Tips/811017/Fastest-way-to-find-row-count-of-all-tables-in-SQL )
SELECT T.name AS [TABLE NAME], I.rows AS [ROWCOUNT]
FROM sys.tables AS T
INNER JOIN sys.sysindexes AS I ON T.object_id = I.id
AND I.indid < 2
ORDER BY I.rows DESC
पहली बात जो दिमाग में आई वह थी sp_msForEachTable का उपयोग करना
exec sp_msforeachtable 'select count(*) from ?'
हालांकि यह तालिका के नामों को सूचीबद्ध नहीं करता है, इसलिए इसे बढ़ाया जा सकता है
exec sp_msforeachtable 'select parsename(''?'', 1), count(*) from ?'
यहां समस्या यह है कि यदि डेटाबेस में 100 से अधिक टेबल हैं, तो आपको निम्न त्रुटि संदेश मिलेगा:
क्वेरी परिणाम ग्रिड में प्रदर्शित किए जाने वाले परिणाम सेट की अधिकतम संख्या से अधिक हो गई है। ग्रिड में केवल पहले 100 परिणाम सेट प्रदर्शित किए जाते हैं।
इसलिए मैंने परिणामों को संग्रहीत करने के लिए तालिका चर का उपयोग करके समाप्त किया
declare @stats table (n sysname, c int)
insert into @stats
exec sp_msforeachtable 'select parsename(''?'', 1), count(*) from ?'
select
*
from @stats
order by c desc
स्वीकृत जवाब मेरे लिए Azure SQL पर काम नहीं किया, यहाँ एक है जो किया है, यह सुपर फास्ट है और ठीक वही हुआ जो मैं चाहता था:
select t.name, s.row_count
from sys.tables t
join sys.dm_db_partition_stats s
ON t.object_id = s.object_id
and t.type_desc = 'USER_TABLE'
and t.name not like '%dss%'
and s.index_id = 1
order by s.row_count desc
यह sql स्क्रिप्ट चयनित डेटाबेस में प्रत्येक तालिका का स्कीमा, तालिका नाम और पंक्ति गणना देता है:
SELECT SCHEMA_NAME(schema_id) AS [SchemaName],
[Tables].name AS [TableName],
SUM([Partitions].[rows]) AS [TotalRowCount]
FROM sys.tables AS [Tables]
JOIN sys.partitions AS [Partitions]
ON [Tables].[object_id] = [Partitions].[object_id]
AND [Partitions].index_id IN ( 0, 1 )
-- WHERE [Tables].name = N'name of the table'
GROUP BY SCHEMA_NAME(schema_id), [Tables].name
order by [TotalRowCount] desc
रेफरी: https://blog.sqlauthority.com/2017/05/24/sql-server-find-row-count-every-table-database-efficiently/
इसे करने का दूसरा तरीका:
SELECT o.NAME TABLENAME,
i.rowcnt
FROM sysindexes AS i
INNER JOIN sysobjects AS o ON i.id = o.id
WHERE i.indid < 2 AND OBJECTPROPERTY(o.id, 'IsMSShipped') = 0
ORDER BY i.rowcnt desc
आप यह कोशिश कर सकते हैं:
SELECT OBJECT_SCHEMA_NAME(ps.object_Id) AS [schemaname],
OBJECT_NAME(ps.object_id) AS [tablename],
row_count AS [rows]
FROM sys.dm_db_partition_stats ps
WHERE OBJECT_SCHEMA_NAME(ps.object_Id) <> 'sys' AND ps.index_id < 2
ORDER BY
OBJECT_SCHEMA_NAME(ps.object_Id),
OBJECT_NAME(ps.object_id)
इस सवाल से: /dba/114958/list-all-tables-from-all-user-dat डेटाबेस / 230411#230411
मैंने @Aaron बर्ट्रेंड द्वारा प्रदान किए गए उत्तर में रिकॉर्ड गणना को जोड़ा जो सभी डेटाबेस और सभी तालिकाओं को सूचीबद्ध करता है।
DECLARE @src NVARCHAR(MAX), @sql NVARCHAR(MAX);
SELECT @sql = N'', @src = N' UNION ALL
SELECT ''$d'' as ''database'',
s.name COLLATE SQL_Latin1_General_CP1_CI_AI as ''schema'',
t.name COLLATE SQL_Latin1_General_CP1_CI_AI as ''table'' ,
ind.rows as record_count
FROM [$d].sys.schemas AS s
INNER JOIN [$d].sys.tables AS t ON s.[schema_id] = t.[schema_id]
INNER JOIN [$d].sys.sysindexes AS ind ON t.[object_id] = ind.[id]
where ind.indid < 2';
SELECT @sql = @sql + REPLACE(@src, '$d', name)
FROM sys.databases
WHERE database_id > 4
AND [state] = 0
AND HAS_DBACCESS(name) = 1;
SET @sql = STUFF(@sql, 1, 10, CHAR(13) + CHAR(10));
PRINT @sql;
--EXEC sys.sp_executesql @sql;
आप सभी तालिका रिकॉर्ड काउंट को तालिका में लाने के लिए कोड के इस टुकड़े को कॉपी, अतीत और निष्पादित कर सकते हैं। नोट: कोड को निर्देशों के साथ टिप्पणी की गई है
create procedure RowCountsPro
as
begin
--drop the table if exist on each exicution
IF OBJECT_ID (N'dbo.RowCounts', N'U') IS NOT NULL
DROP TABLE dbo.RowCounts;
-- creating new table
CREATE TABLE RowCounts
( [TableName] VARCHAR(150)
, [RowCount] INT
, [Reserved] NVARCHAR(50)
, [Data] NVARCHAR(50)
, [Index_Size] NVARCHAR(50)
, [UnUsed] NVARCHAR(50))
--inserting all records
INSERT INTO RowCounts([TableName], [RowCount],[Reserved],[Data],[Index_Size],[UnUsed])
-- "sp_MSforeachtable" System Procedure, 'sp_spaceused "?"' param to get records and resources used
EXEC sp_MSforeachtable 'sp_spaceused "?"'
-- selecting data and returning a table of data
SELECT [TableName], [RowCount],[Reserved],[Data],[Index_Size],[UnUsed]
FROM RowCounts
ORDER BY [TableName]
end
मैंने इस कोड का परीक्षण किया है और यह SQL सर्वर 2014 पर ठीक काम करता है।
मैं साझा करना चाहता हूं कि मेरे लिए क्या काम कर रहा है
SELECT
QUOTENAME(SCHEMA_NAME(sOBJ.schema_id)) + '.' + QUOTENAME(sOBJ.name) AS [TableName]
, SUM(sdmvPTNS.row_count) AS [RowCount]
FROM
sys.objects AS sOBJ
INNER JOIN sys.dm_db_partition_stats AS sdmvPTNS
ON sOBJ.object_id = sdmvPTNS.object_id
WHERE
sOBJ.type = 'U'
AND sOBJ.is_ms_shipped = 0x0
AND sdmvPTNS.index_id < 2
GROUP BY
sOBJ.schema_id
, sOBJ.name
ORDER BY [TableName]
GO
डेटाबेस Azure में होस्ट किया गया है और अंतिम परिणाम है:
साभार: https://www.mssqltips.com/sqlservertip/2537/sql-server-row-count-for-all-tables-in-a-database/
यदि आप MySQL> 4.x का उपयोग करते हैं, तो आप इसका उपयोग कर सकते हैं:
select TABLE_NAME, TABLE_ROWS from information_schema.TABLES where TABLE_SCHEMA="test";
ध्यान रखें कि कुछ भंडारण इंजनों के लिए, TABLE_ROWS एक सन्निकटन है।
select T.object_id, T.name, I.indid, I.rows
from Sys.tables T
left join Sys.sysindexes I
on (I.id = T.object_id and (indid =1 or indid =0 ))
where T.type='U'
यहाँ indid=1
एक स्पष्ट सूचकांक का मतलब है और indid=0
एक HEAP है