sqlite: самый быстрый способ получить все строки (последовательный доступ к диску) - PullRequest
4 голосов
/ 25 августа 2011

Я хочу прочитать все строки в таблице, используя system.data.sqlite. Поскольку у меня очень большая таблица (> 450 ГБ,> 6 миллиардов строк), я хочу быть уверенным, что sqlite будет использовать последовательный доступ к диску. Как вы знаете, произвольный доступ к жесткому диску происходит медленно. Из-за ограничений памяти я не могу загрузить все данные одновременно. Таким образом, оптимальным вариантом было бы, если sqlite читает несколько сотен МБ (подряд), тогда я работаю с этими данными, а sqlite читает следующие.

Как я могу быть уверен, что sqlite будет осуществлять доступ к диску таким образом, а не переходить с одной позиции на жестком диске на другую?

Вещи, которые я знаю (я думаю, что эти предложения появятся):

  • Может быть лучше использовать другую СУБД. Но я хочу / нужно решить это с этим.
  • Я знаю, что головка диска будет позиционироваться ОС на других данных, пока я работаю с этими данными. Это не важно Просто некоторые MB MB будут прочитаны последовательно.
  • Я не хочу / могу разбить файл базы данных на более мелкие части

Я нашел этот пост, но он не решает мою проблему правильно:
Какой самый быстрый способ получить все элементы в SQLite?

Ответы [ 3 ]

5 голосов
/ 14 апреля 2012

Вот для чего нужен кластерный индекс. sqlite их не поддерживает.

Скопировано следующее: http://www.sqlite.org/cvstrac/wiki?p=PerformanceTuningWindows

Четыре: кластерные индексы

SQLite не поддерживает кластеризованные индексы (просто индексы, которые вызывают данные в базе данных должны быть физически установлены в том же порядке так как индекс должен быть в нем.)

Это означает, что если ваш индекс последовательный INTEGER, записи физически выложены в базе данных в том порядке INTEGERs, 1, затем 2 тогда 3.

Вы не можете создать кластерный индекс, но вы МОЖЕТЕ отсортировать данные по порядку так что любые исторические данные упорядочены хорошо. Конечно, как база данных созревает, вы теряете это, но это помогает

Кто-то еще опубликовал это, и это хороший пример для использования, так что я буду. Если у вас есть таблица WIBBLE, чье поле KEY вы хотите получить доступ много, было бы хорошо, если бы все было в порядке. Использование командной строки инструмент, вы можете создать поддельный кластер, выполнив следующие действия:

create table wibble2 as select * from wibble;
delete from wibble;
insert into wibble select * from wibble2 order by key;
drop table wibble2;

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

1 голос
/ 02 ноября 2016

с @CL. ответить в этом посте :

В SQLite индексы, созданные с помощью CREATE INDEX, не являются кластеризованными индексы.

Начиная с версии 3.8.2, SQLite поддерживает БЕЗ таблиц ROWID, которые кластерные индексы.

1 голос
/ 27 марта 2015

В SQLite строки таблицы хранятся отсортированными по rowid , поэтому наиболее эффективный способ чтения строк в этом порядке - сортировка по этому столбцу (или псевдониму, который вы объявили с помощью INTEGER PRIMARY KEY):

SELECT * FROM wibble ORDER BY rowid

Для таблицы БЕЗ ROWID вы сортируете по столбцам первичного ключа:

SELECT * FROM wibble ORDER BY MyPrimary, KeyColumns
...