2011年5月19日 星期四

How To:快速取得 large table 的 row count。

最近一個專案任務,有一些資料表的row筆數。少則幾十萬筆,多則千萬筆。使用程式將資料批次塞入之後,只要看資料筆數就可以知道資料是否順利寫入。但是問題來了,一個這麼多資料的資料表,要是用select count("column") from tablename 這種方式的話,鐵定完蛋。哪還有什麼方法可以取得資料筆數呢?


  1. select count(*) from tablename
    僅適合在小資料表,小弟經驗只要資料表十幾萬筆。這個方法就會讓人受不了。

  2. SELECT CONVERT(bigint, rows)
    FROM sysindexes
    WHERE id = OBJECT_ID('tablename')
    AND indid < 2 直接對系統表作查詢。但是數目不保證準確。


  3. SELECT CAST(p.rows AS float)
    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 WHERE ((tbl.name=N'tablename' AND SCHEMA_NAME(tbl.schema_id)='dbo')) 這個方法的說明小弟真的還無法頓悟,真是書到用時方恨少。大略的意思是說,這個方法直接讀取資料表的屬性來得知row的筆數。但仍只是近似值。


  4. SELECT SUM (row_count)
    FROM sys.dm_db_partition_stats
    WHERE object_id=OBJECT_ID('Transactions')
    AND (index_id=0 or index_id=1);
    同樣是存取系統表,但是速度略遜於方法二。


沒有留言:

張貼留言