2014-02-06 61 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