Какой самый эффективный способ подсчета строк в таблице в SQLite? - PullRequest
14 голосов
/ 18 декабря 2010

Я всегда просто использовал «SELECT COUNT (1) FROM X»), но, возможно, это не самый эффективный способ. Какие-нибудь мысли? Другие варианты включают SELECT COUNT (*) или, возможно, получение последнего вставленного идентификатора, если он автоматически увеличивается (и никогда не удаляется).

А если я просто хочу узнать, есть ли что-нибудь в таблице вообще? (например, считать> 0?)

Ответы [ 6 ]

12 голосов
/ 18 декабря 2010

Лучший способ - убедиться, что вы запускаете SELECT COUNT в одном столбце (SELECT COUNT(*) медленнее), но SELECT COUNT всегда будет самым быстрым способом подсчета количества вещей (база данных оптимизирует запрос) внутри).

Если вы ознакомитесь с комментариями ниже, вы увидите аргументы, почему SELECT COUNT(1), вероятно, ваш лучший вариант.

3 голосов
/ 06 января 2016

Чтобы прокомментировать ответ girasquid, в качестве точки данных у меня есть таблица sqlite с 2,3 миллионами строк.Используя select count(*) from table, для подсчета строк потребовалось более 3 секунд.Я также попытался использовать SELECT rowid FROM table (думая, что rowid является первичным индексированным ключом по умолчанию), но это было не быстрее.Затем я сделал индекс для одного из полей в базе данных (просто произвольное поле, но я выбрал целочисленное поле, потому что я знал из прошлого опыта, что индексы для коротких полей могут быть очень быстрыми, я думаю, потому что индекс хранится в копиизначения в самом индексе).SELECT my_short_field FROM table сократил время до секунды.

0 голосов
/ 01 декабря 2015

Если вы уверены (действительно уверены), что никогда не удаляли ни одной строки из этой таблицы, и ваша таблица не была определена с оптимизацией БЕЗ 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 говорит, что идентификатор строки уникален среди всех строк в одной таблице. SQLite не объявляет, что идентификаторы строк являются и всегда будут последовательными числами.

0 голосов
/ 13 октября 2014

sp_spaceused 'table_name' (исключая одинарные кавычки)

это вернет количество строк в приведенной выше таблице, это самый эффективный способ, с которым я когда-либо сталкивался.

это более эффективно, чем select Count(1) from 'table_name' (исключая одинарные кавычки)

sp_spaceused можно использовать для любой таблицы, это очень полезно, когда таблица исключительно большая (сотни миллионов строк), возвращает количество строк в правильном направлении, тогда как 'select Count(1)' может занять более 10 секунд.Более того, ему не нужно учитывать имена столбцов / ключевые поля.

0 голосов
/ 18 декабря 2010

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

В противном случае любой запрос типа

SELECT COUNT (не постоянное значение NULL) из таблицы FROM

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

Как только вы введете столбец в SELECTСЧИТАЙТЕ, что вы просите движок выполнить хотя бы сканирование индекса и, возможно, сканирование таблицы, и это будет медленнее.

0 голосов
/ 18 декабря 2010

Я не верю, что вы найдете специальный метод для этого. Тем не менее, вы можете сделать ваш выбор счетчика первичного ключа, чтобы быть немного быстрее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...