我一直只使用「SELECT COUNT(1)FROM X」,但也許這不是最有效的。有什麼想法嗎?其他選項包括SELECT COUNT(*),或者如果自動遞增(並且從不刪除),則可能獲取最後插入的ID。什麼是最有效的方式來計算SQLite中的表中的行?
如果我只想知道表中是否有任何東西,那麼該怎麼辦? (如計數> 0?)
我一直只使用「SELECT COUNT(1)FROM X」,但也許這不是最有效的。有什麼想法嗎?其他選項包括SELECT COUNT(*),或者如果自動遞增(並且從不刪除),則可能獲取最後插入的ID。什麼是最有效的方式來計算SQLite中的表中的行?
如果我只想知道表中是否有任何東西,那麼該怎麼辦? (如計數> 0?)
的最好辦法是,以確保您在一列運行SELECT COUNT
(SELECT COUNT(*)
較慢) - 但SELECT COUNT
總是會得到的東西計數(數據庫的最快方法優化內部查詢)。
如果你看看下面的評論,你可以看到爲什麼SELECT COUNT(1)
可能是你最好的選擇參數。
我不相信你會找到一個特殊的方法。但是,您可以在主鍵上進行選擇計數,以加快速度。
獲取行計數的最快方法是直接從表元數據(如果有)中獲取。不幸的是,我無法找到SQLite中提供的這種數據的參考。
做不到這一點,從表
類型
SELECT COUNT(非空恆定值)的任何查詢應該優化以避免對錶中,或甚至一個索引的需要,進行掃描。理想情況下,引擎將簡單地從內部元數據中返回表中已知的當前行數。否則,它只需要知道任何非NULL列的索引中的條目數(主鍵索引是第一個查找的位置)。
只要你介紹一個列到SELECT COUNT你所要求的發動機進行至少一次索引掃描和可能的表掃描,這會慢一些。
sp_spaceused 'table_name'
(不包括單引號)
這將返回的行數在上表中,這是最有效的方式我也碰到過呢。
它比select Count(1) from 'table_name'
更有效(不包括單引號)
sp_spaceused
可用於任何表,這是非常有用的,當該表是非常大的(幾百萬行),返回的行數正確的方式,而'select Count(1)'
可能需要超過10秒。而且,它不需要考慮任何列名/關鍵字段。
問題是關於SQLite,而不是SQL Server – dsz 2015-06-19 03:29:34
如果確定(真正確定),你從來沒有從該表中刪除任何行,你的表尚未與定義的無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是並且總是連續的數字。
在這裏你可以讀一些關於依賴rowid [link](http://www.sqlabs.com/blog/2010/12/sqlite-and-unique-rowid-something-你,真的,需要到知道/) – Teolazza 2015-12-01 10:55:35
爲了跟上girasquid的回答,作爲一個數據點,我有一個擁有230萬行的sqlite表。使用select count(*) from table
,計算行數需要3秒多。我也嘗試過使用SELECT rowid FROM table
,(認爲rowid是一個默認的主索引鍵),但那不是更快。然後我在數據庫中的一個字段上做了一個索引(只是一個任意字段,但我選擇了一個整數字段,因爲根據以往的經驗,我知道短字段的索引可能非常快,我認爲索引存儲了一個副本的價值在索引本身)。 SELECT my_short_field FROM table
把時間縮短到不到一秒鐘。
對於計數(*)vs計數(別的東西),看看(這裏)[http://stackoverflow.com/questions/4437399/is-using-count-or-select-a-good-idea/ 4439459#4439459] – Ronnis 2010-12-18 16:54:45