SQLite: самый быстрый способ проверить, имеет ли таблица более x строк

каков самый быстрый способ проверить, имеет ли таблица SQLite более 100 000 строк?


таблица теста имеет 26 столбцов и 200,000,000 строк.

SELECT COUNT(*) FROM ( SELECT * FROM table LIMIT 100001 )

взял 0.27 секунд.

следующие три потребовалось 12 с половиной минут

SELECT COUNT(*) FROM table
SELECT COUNT(*) FROM table LIMIT 100001
SELECT CASE WHEN COUNT(Id) >= 100000 THEN 1 ELSE 0 END FROM table

8 ответов


select count(*) from (
 select top 100001 ID from T
) x

нам нужно сканировать индекс, чтобы ответить на запрос. Это, по крайней мере, ограничивает сканирование индекса первыми 100001 строками. Если таблица имеет 1M строк, это экономит 90% работы.

(используя синтаксис SQL Server здесь-пожалуйста, переведите себя, потому что я не могу этого сделать).

вместо ID вы можете выбрать некоторый индексированный столбец. Я не знаю, Может ли оптимизатор сделать это сам.

обратите внимание, что умные трюки, такие как просмотр значений столбцов ID или ID, не работать вообще.

для поддержки вышеуказанного запроса создайте фиктивный столбец типа bit и индексировать его. Индекс будет очень компактным и самым быстрым для сканирования.


SELECT COUNT(indexed_column) FROM TableName

теперь индексированная часть столбца является важной вещью, вы не хотите делать что-то вроде подсчета*, вы хотите быть как можно более конкретным, заставляя SQL использовать индекс, существующий для каждой строки в этой таблице.


SELECT COUNT укусит вас, когда у вас будет много строк. Это работает , но вы просите самый быстрый способ в sqlite.

использование:

SELECT max(rowid) AS rowcount

Как отметил Нолифекинг, это работает только правильно, если у вас нет никаких удалений. В противном случае он будет непоследовательным, и у вас будет более высокий rowcount, как на самом деле в таблице.

проверить http://www.sqlite.org/autoinc.html О правилах, как SQLite создает идентификатор rowid.


Если у вас нет индексированного столбца, я думаю, что самый быстрый способ будет (для N = 100000)

select 1 from test1 limit 1 offset 100000;

Это потому что вы получите только N + 1 строк. Ни счета, ни Макса.

вы можете попробовать его здесь sqlfiddle


SELECT COUNT (Column) FROM TABLE

обеспечение индексирования выбранного столбца, предпочтительно INT.


SELECT CASE WHEN COUNT(indexed_column) >= 100000 THEN 1 ELSE 0 END FROM table

Не стоит, что делать? Отчеты 1, если это более 100.000 и 0 в противном случае


select count(*) from table      
select max(id) from table  

если таблица имеет идентификатор первичного ключа, второй на


select count(*) from table

-- оптимизатор запросов автоматически выбирает индексированный столбец.