ডাটাবেসে প্রতিটি টেবিলে রেকর্ডের সংখ্যার তালিকা দেওয়ার জন্য প্রশ্ন


196

ডাটাবেসে প্রতিটি টেবিলের সারি গণনা কীভাবে তালিকাভুক্ত করা যায়। কিছু সমতুল্য

select count(*) from table1
select count(*) from table2
...
select count(*) from tableN

আমি একটি সমাধান পোস্ট করব তবে অন্যান্য পদ্ধতির স্বাগত

উত্তর:


311

আপনি যদি এসকিউএল সার্ভার 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আউটপুটের চেয়ে এটি পরিচালনা করা সহজ ।


1
কোনও ধারণা কেন এটি "ডিটি" দিয়ে একটি নাম দিয়ে টেবিলগুলি ফিল্টার করছে? আমি পুরো স্ক্রিপ্টটি পুরো নেটটিতে দেখেছি, তবে সেই মানদণ্ডে কোনও ব্যাখ্যা নেই। আমরা কি সবাই ট্রোলড হচ্ছি?
স্কাউ

6
@ স্কাউ: আপনি যদি নিজের ডাটাবেসে "ডাটাবেস ডায়াগ্রাম" কার্যকারিতা ইনস্টল করেন তবে আপনার মতো কিছু টেবিল থাকবে dtProperties; যেহেতু সেগুলি "সিস্টেম" সারণী, তাই আমি সেগুলির বিষয়ে রিপোর্ট করতে চাই না।
marc_s

1
এই স্ক্রিপ্টে স্কিমা নামের সাথে টেবিলের নাম উপস্থাপনের সম্ভাবনা?
gh0st

কিছু কারণে এই কোয়েরিটি সমস্ত টেবিল ফিরিয়ে দিচ্ছে না। আমি একটি ডাটাবেসে 382 টেবিল আছে। তবে এই ক্যোয়ারীটি কেবল 270 টি সারি (টেবিলের তথ্য) ফিরিয়ে দিচ্ছে। যেখানে শর্তটি সরিয়ে দেওয়ার পরে আমি 302 টি সারি পাচ্ছি। এটি কি কোনও এসওয়াইএস টেবিলের মধ্যে থেকে কিছু টেবিলের তথ্য অনুপস্থিত রয়েছে যার ফলে যোগদানগুলি বাদ দিচ্ছে। ডাটাবেসে কোনও সিস্টেম সারণী থাকে না।
অঙ্কেশ কুশওয়াহ

এটি কাজ করছে। আপনি দুটি ডাটাবেস তুলনা করতে এটি পরিবর্তন করতে পারেন।
সানজিওয়া

107

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;

5
আমি এই সমাধানটি পছন্দ করি, যদিও আমি JOINবাক্য from sysobjects t inner join sysindexes i on i.id = t.id and i.indid in (0,1) where t.xtype = 'U'
গঠনটি

আমি খুব জিন স্টেটমেন্ট ব্যবহার করতে পছন্দ করি তবে কোড স্নিপেটটি যেমনটি পেয়েছিলাম তেমন পোস্ট করেছিলাম। :)
এরিক অ্যান্ডারসন

32

এসকিউএল ম্যানেজমেন্ট স্টুডিওতে সেই তথ্যটি পেতে, ডাটাবেসটিতে ডান ক্লিক করুন, তারপরে রিপোর্টগুলি -> মানক প্রতিবেদনগুলি -> ছক দ্বারা ডিস্ক ব্যবহার নির্বাচন করুন।


6
আন্ডাররেটেড পদ্ধতির, এটি দ্রুত একটি সারণযোগ্য প্রতিবেদন উত্পন্ন করে যা # সারি এবং ডেটার আকার দেখায়।
tbone

8
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;

3
এই ক্যোয়ারী প্রতিটি টেবিলের প্রতিটি সূচির জন্য একটি সারি ফলাফল প্রদান করবে। রিটার্ন ফলাফলকে হ্যাপ বা ক্লাস্টারড ইনডেক্সগুলিতে কেবলমাত্র উপযুক্ত যেখানে সীমাবদ্ধ করতে সীমাবদ্ধ করতে WHERE P.INDEX_ID IN (0,1) যুক্ত করুন।
রাসমাস রিমার বিলিড্ট

6

এখানে যেমন দেখা গেছে, এটি সঠিক গণনা ফিরিয়ে দেবে, যেখানে মেটা ডেটা টেবিল ব্যবহারের পদ্ধতিগুলি কেবল প্রাক্কলন ফিরিয়ে দেয়।

    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

সুতরাং এটি অননুমোদিত stor proc sp_msforEachTable বনাম কখনও কখনও সর্বাধিক আপ টু ডেট তথ্য না দিয়ে সিস্টেম টেবিলগুলি ব্যবহার করার সমঝোতার মতো বলে মনে হয়। +1 এবং লিঙ্কটির জন্য ধন্যবাদ
ক্রিস্টোফ

3
sp_MSForEachTable 'DECLARE @t AS VARCHAR(MAX); 
SELECT @t = CAST(COUNT(1) as VARCHAR(MAX)) 
+ CHAR(9) + CHAR(9) + ''?'' FROM ? ; PRINT @t'

আউটপুট:

এখানে চিত্র বর্ণনা লিখুন


SQL সার্ভার 2000 এর জন্য আমার কিছু দরকার ছিল This এটি কাজ করেছে। ধন্যবাদ!
অ্যালেকার

3

ভাগ্যক্রমে এসকিউএল সার্ভার পরিচালনার স্টুডিও আপনাকে কীভাবে এটি করতে হবে তার একটি ইঙ্গিত দেয়। এটা কর,

  1. এসকিউএল সার্ভারের ট্রেসটি শুরু করুন এবং আপনি যে ক্রিয়াকলাপটি করছেন তা খুলুন (আপনি লগইন আইডি দ্বারা ফিল্টার করুন যদি আপনি একা নন এবং অ্যাপ্লিকেশনটির নাম মাইক্রোসফ্ট এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিওতে সেট করুন), ট্রেসটি বিরতি দিন এবং আপনার এখনও অবধি রেকর্ড করা কোনও ফলাফল বাতিল করুন;
  2. তারপরে, একটি টেবিলের ডান ক্লিক করুন এবং পপ আপ মেনু থেকে সম্পত্তি নির্বাচন করুন;
  3. আবার ট্রেস শুরু করুন;
  4. এখন এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিওতে বামে স্টোরেজ সম্পত্তি আইটেমটি নির্বাচন করুন;

ট্রেসটি বিরতি দিন এবং মাইক্রোসফ্ট দ্বারা টিএসকিউএল কী উত্পন্ন হচ্ছে তা একবার দেখুন।

সম্ভবত সর্বশেষ ক্যোয়ারিতে আপনি একটি বিবৃতি দিয়ে শুরু দেখতে পাবেন exec sp_executesql N'SELECT

যখন আপনি চালিত কোডটি ভিজ্যুয়াল স্টুডিওতে অনুলিপি করবেন তখন আপনি খেয়াল করবেন যে এই কোডটি মাইক্রোসফ্টে ইঞ্জিনিয়াররা সম্পত্তি উইন্ডোটি তৈরি করতে ব্যবহৃত সমস্ত ডেটা তৈরি করে।

আপনি যখন এই ক্যোয়ারিতে মাঝারি সংশোধন করেন আপনি এমন কিছু পাবেন:

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

এখন কোয়েরিটি নিখুঁত নয় এবং আপনার যে অন্যান্য প্রশ্ন থাকতে পারে তা পূরণের জন্য আপনি এটি আপডেট করতে পারবেন, মূল বিষয়টি হ'ল আপনি যে ডেটাতে আগ্রহী তা ডেটা এক্সিকিউট করে ট্রেস করে আপনার বেশিরভাগ প্রশ্নের কাছে মাইক্রোসফ্টের জ্ঞান ব্যবহার করতে পারেন টিএসকিউএল প্রোফাইলার ব্যবহার করে উত্পন্ন হয়েছে।

আমি ভাবতে চাই যে এমএস ইঞ্জিনিয়াররা এসকিউএল সার্ভারটি কীভাবে কাজ করে তা জানে এবং এটি টিএসকিউএল তৈরি করবে যা আপনি যে এসএসএমএসের সংস্করণটি ব্যবহার করছেন তার সাথে কাজ করতে পারে এমন সমস্ত আইটেমের উপর কাজ করে যাতে এটি বিভিন্ন ধরণের রিলিজের পূর্বরূপ, বর্তমান এবং ভবিষ্যত।

এবং মনে রাখবেন, কেবল অনুলিপি করবেন না, পাশাপাশি এটি বোঝার চেষ্টা করুন অন্যথায় আপনি হয়ত ভুল সমাধানটি শেষ করতে পারেন।

ওয়াল্টার


2

আসল প্রশ্নটিতে দেওয়া উদাহরণ (গুলি) এর মতো গতিশীলভাবে সমস্ত টেবিল এবং তাদের গণনা সহ একটি বিবৃতি তৈরি করতে এই পদ্ধতির স্ট্রিং কনটেনটেশন ব্যবহার করা হয়:

          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);

নোট করুন যে এই সমাধানটিতে স্কিমাটির নাম অন্তর্ভুক্ত রয়েছে (যা কার্যকর হতে পারে)
gordon613


1

প্রথম যে বিষয়টি মনে আসল তা হল 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

1

গৃহীত উত্তরটি আজুর এসকিউএল-এ আমার পক্ষে কাজ করে নি, এটি একটি যা দ্রুত করেছে এবং এটি যা চেয়েছিল ঠিক তা করেছে:

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

1

এই স্কয়ার স্ক্রিপ্টটি নির্বাচিত ডাটাবেসে প্রতিটি টেবিলের স্কিমা, টেবিলের নাম এবং সারি গণনা দেয়:

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

0

আমি মনে করি যে সবচেয়ে সংক্ষিপ্ততম, দ্রুত এবং সহজতম উপায়টি হ'ল:

SELECT
    object_name(object_id) AS [Table],
    SUM(row_count) AS [Count]
FROM
    sys.dm_db_partition_stats
WHERE
    --object_schema_name(object_id) = 'dbo' AND 
    index_id < 2
GROUP BY
    object_id

0

আপনি এটি চেষ্টা করতে পারেন:

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)

0
USE DatabaseName
CREATE TABLE #counts
(
    table_name varchar(255),
    row_count int
)

EXEC sp_MSForEachTable @command1='INSERT #counts (table_name, row_count) SELECT ''?'', COUNT(*) FROM ?'
SELECT table_name, row_count FROM #counts ORDER BY table_name, row_count DESC
DROP TABLE #counts

0

এই প্রশ্ন থেকে: /dba/114958/list-all-tables-from-all-user-databases/230411#230411

আমি @ অ্যারন বারট্রান্ডের দেওয়া উত্তরে রেকর্ড গণনা যুক্ত করেছি যা সমস্ত ডাটাবেস এবং সমস্ত সারণী তালিকাভুক্ত করে।

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;

0

সমস্ত টেবিলের রেকর্ড গণনা একটি টেবিলের মধ্যে পেতে আপনি এই টুকরো কোডটি অনুলিপি, অতীত এবং সম্পাদন করতে পারেন। দ্রষ্টব্য: কোড নির্দেশের সাথে মন্তব্য করা হয়

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

আমি এই কোডটি পরীক্ষা করেছি এবং এটি এসকিউএল সার্ভার ২০১৪-তে দুর্দান্ত কাজ করে।


0

আমার জন্য কী কাজ করছে তা আমি ভাগ করে নিতে চাই

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

ডাটাবেসটি আউুরে হোস্ট করা হয়েছে এবং চূড়ান্ত ফলাফল: এখানে চিত্র বর্ণনা লিখুন

ক্রেডিট: https://www.mssqltips.com/sqlservertip/2537/sql-server-row-count-for-all-tables-in-a-database/


-1

আপনি যদি মাইএসকিউএল> ৪.x ব্যবহার করেন তবে আপনি এটি ব্যবহার করতে পারেন:

select TABLE_NAME, TABLE_ROWS from information_schema.TABLES where TABLE_SCHEMA="test";

মনে রাখবেন যে কয়েকটি স্টোরেজ ইঞ্জিনের জন্য, TABLE_ROWS একটি আনুমানিক।


6
তিনি তার পোস্টে "স্কেল-সার্ভার" উল্লেখ করেছেন (ট্যাগ হিসাবে) যা মাইক্রোসফ্ট এসকিউএল সার্ভার
marc_s

-1
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এটি একটি হিপ


4
হাই এবং স্ট্যাক ওভারফ্লোতে আপনাকে স্বাগতম। এই উত্তরটি ইতিমধ্যে এক বছরের পুরানোটির মতো ical এটি আবার পোস্ট করার দরকার ছিল না।
বেন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.