2014-02-06 49 views
2

我有一个任务来清理无用记录中的数据库。在规划中,首先我要检查哪些表格保存了最多的记录。我知道我可以手动一个一个地检查它们,但是表格列表太长了,我认为在检查是否有任何可以完成这项工作的自动查询之前手动运行它们并不是太明智。 手动,我可以利用这个查询查询每个表:通过拥有最多记录数排序查询表

select count(*) from <table_name> 

即使使用系统对象,我无法找到当前号码记录

select * from sysobjects s where type='U' and name = '<table_name>' 

任何人有一个想法?

+0

* <勇于提起“D字”> * .......你有没有想过使用动态SQL呢? – Jeroen

+0

阅读本文后:[如何获取sybase IQ中所有表的记录数](http://scn.sap.com/thread/3448070) –

+0

在SQL Server中,记录数存储在索引元数据中表。您可能会发现这有帮助http://stackoverflow.com/questions/428458/counting-rows-for-all-tables-at-once。 –

回答

2

的行的每个表中的数字的近似保持为索引统计信息的一部分,并存储在yourDB..systabstats假设你定期运行update statistics ,这里是你如何获得信息。

SELECT o.name, t.rowcnt 
    FROM sysobjects o, systabstats t 
WHERE o.id = t.id 
    AND t.rowcnt > 0   --ignore 0 row entries 
    AND o.name not like "sys%" --exclude system tables 
ORDER BY t.rowcnt DESC 
+0

谢谢Micheal,它的工作原理! – hd84335

+0

太好了。不要忘记注册并记录为已记录。 –

0

这适用于T-SQL。不知道这是否会在Sybase工作...

CREATE TABLE #RecCounts (TableName varchar(100), RecCount int) 

    SELECT object_id INTO #Processed FROM sys.tables WHERE name = '(no such table)' 

    DECLARE @TableId int, @TableName varchar(255), @TableSchema varchar(100), @CountSQL varchar(255) 

    SELECT @TableId = MIN(object_id) FROM sys.tables WHERE type = 'U' 
    AND object_id NOT IN (SELECT object_id FROM #Processed) 

    SET @TableId = ISNULL(@TableId, -1) 

    WHILE @TableId > -1 BEGIN 

     PRINT @TableId 

     SELECT @TableName = name FROM sys.tables WHERE type = 'U' AND object_id = @TableId 

     SELECT @TableSchema = s.name, @TableName = t.name 
      FROM sys.Tables t 
      INNER JOIN sys.schemas s ON s.schema_id = t.schema_id 
     WHERE t.object_id = @TableId 



     SET @CountSQL = 'DECLARE @RecCount int 
          SELECT @RecCount = COUNT(*) FROM ' + @TableSchema + '.' + @TableName + ' 
          INSERT INTO #RecCounts (TableName, RecCount) VALUES (''' + @TableName + ''', @RecCount)' 

     PRINT @CountSQL 
     EXEC(@CountSQL) 

     INSERT INTO #Processed (object_id) VALUES(@TableId) 

     SELECT @TableId = MIN(object_id) FROM sys.tables WHERE type = 'U' 
      AND object_id NOT IN (SELECT object_id FROM #Processed) 

    END 


    SELECT * FROM #RecCounts