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


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

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

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

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

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

3 4

3 ответа:

Для этого и существуют кластеризованные индексы. однако sqlite их не поддерживает.

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

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

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

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

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

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

create table wibble2 as select * from wibble;
delete from wibble;
insert into wibble select * from wibble2 order by key;
drop table wibble2;
Суть в том, что вы можете переупорядочить свои записи вручную, но я думаю, что это будет практично для вас, только если вы не собираетесь часто писать в таблицу.

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

SELECT * FROM wibble ORDER BY rowid

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

SELECT * FROM wibble ORDER BY MyPrimary, KeyColumns

Из @CL. ответ в этом посте:

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

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