sqlite: самый быстрый способ получить все строки (последовательный доступ к диску)

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

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

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

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

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


person Chris    schedule 25.08.2011    source источник


Ответы (3)


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

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

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

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

Это означает, что если ваш индекс представляет собой последовательный INTEGER, записи физически размещаются в базе данных в порядке INTEGER: 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;

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

person Community    schedule 13.04.2012

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

SELECT * FROM wibble ORDER BY rowid

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

SELECT * FROM wibble ORDER BY MyPrimary, KeyColumns
person CL.    schedule 27.03.2015

От @CL. ответьте в этом сообщении:

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

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

person mOna    schedule 02.11.2016