2010-12-17 159 views
11

我一直只使用「SELECT COUNT(1)FROM X」,但也許這不是最有效的。有什麼想法嗎?其他選項包括SELECT COUNT(*),或者如果自動遞增(並且從不刪除),則可能獲取最後插入的ID。什麼是最有效的方式來計算SQLite中的表中的行?

如果我只想知道表中是否有任何東西,那麼該怎麼辦? (如計數> 0?)

+0

對於計數(*)vs計數(別的東西),看看(這裏)[http://stackoverflow.com/questions/4437399/is-using-count-or-select-a-good-idea/ 4439459#4439459] – Ronnis 2010-12-18 16:54:45

回答

11

的最好辦法是,以確保您在一列運行SELECT COUNTSELECT COUNT(*)較慢) - 但SELECT COUNT總是會得到的東西計數(數據庫的最快方法優化內部查詢)。

如果你看看下面的評論,你可以看到爲什麼SELECT COUNT(1)可能是你最好的選擇參數。

+0

如果在表上索引的列上選擇count(columnName),則會更好。 – DwB 2010-12-17 21:28:07

+0

那麼不是SELECT COUNT(1)而是SELECT COUNT(id)? – tofutim 2010-12-17 21:28:07

+0

是的 - 就像dwb說的那樣,最好在索引列上做。 – girasquid 2010-12-17 21:29:20

0

我不相信你會找到一個特殊的方法。但是,您可以在主鍵上進行選擇計數,以加快速度。

0

獲取行計數的最快方法是直接從表元數據(如果有)中獲取。不幸的是,我無法找到SQLite中提供的這種數據的參考。

做不到這一點,從表

類型

SELECT COUNT(非空恆定值)的任何查詢應該優化以避免對錶中,或甚至一個索引的需要,進行掃描。理想情況下,引擎將簡單地從內部元數據中返回表中已知的當前行數。否則,它只需要知道任何非NULL列的索引中的條目數(主鍵索引是第一個查找的位置)。

只要你介紹一個列到SELECT COUNT你所要求的發動機進行至少一次索引掃描和可能的表掃描,這會慢一些。

-1

sp_spaceused 'table_name'(不包括單引號)

這將返回的行數在上表中,這是最有效的方式我也碰到過呢。

它比select Count(1) from 'table_name'更有效(不包括單引號)

sp_spaceused可用於任何表,這是非常有用的,當該表是非常大的(幾百萬行),返回的行數正確的方式,而'select Count(1)'可能需要超過10秒。而且,它不需要考慮任何列名/關鍵字段。

+0

問題是關於SQLite,而不是SQL Server – dsz 2015-06-19 03:29:34

1

如果確定(真正確定),你從來沒有從該表中刪除任何行,你的表尚未與定義的無ROWID優化,你可以有行數致電:

select max(RowId) from table; 

或者,如果你的表,你可以使用類似

select MaxRowId - MinRowId + 1 from 
    (select max(RowId) as MaxRowId from table) JOIN 
    (select min(RowId) as MinRowId from table); 

圓形隊列這是真的快(毫秒),但由於sqlite的說,行ID是在同所有行中是獨一無二的,你一定要注意表。 SQLite不會聲明行id是並且總是連續的數字。

+0

在這裏你可以讀一些關於依賴rowid [link](http://www.sqlabs.com/blog/2010/12/sqlite-and-unique-rowid-something-你,真的,需要到知道/) – Teolazza 2015-12-01 10:55:35

0

爲了跟上girasquid的回答,作爲一個數據點,我有一個擁有230萬行的sqlite表。使用select count(*) from table,計算行數需要3秒多。我也嘗試過使用SELECT rowid FROM table,(認爲rowid是一個默認的主索引鍵),但那不是更快。然後我在數據庫中的一個字段上做了一個索引(只是一個任意字段,但我選擇了一個整數字段,因爲根據以往的經驗,我知道短字段的索引可能非常快,我認爲索引存儲了一個副本的價值在索引本身)。 SELECT my_short_field FROM table把時間縮短到不到一秒鐘。

相關問題