sqlite: самый быстрый способ получить все строки (последовательный доступ к диску)
Я хочу прочитать все строки в таблице с помощью system.данные.базы данных SQLite. Поскольку у меня очень большая таблица (>450 ГБ, с > 6 миллиардами строк), я хочу быть уверен, что sqlite будет использовать последовательный доступ к диску. Как вы, возможно, знаете, случайный доступ к жесткому диску происходит медленно. Из-за нехватки памяти я не могу загрузить все данные сразу. Таким образом, оптимальным способом было бы, если sqlite читает несколько сотен МБ (подряд), то я работаю с этими данными, а sqlite читает следующие.
Как я могу быть уверен, что sqlite сделает диск получить доступ таким образом, а не прыгать с одной позиции на жестком диске в другую?
Вещи, которые я знаю (я думаю, что эти предложения появятся):
- может быть, лучше использовать другую СУБД. Но я хочу / должен решить его с этим.
- я знаю, что головка диска будет расположена ОС на других данных, пока я работаю с этими данными. Это не имеет значения. Просто некоторые сотни МБ будут прочитаны последовательно.
- я не хочу / могу разделить файл базы данных на более мелкие кусочки
Я нашел этот пост, но он не решает мою проблему правильно:
какой самый быстрый способ получить все элементы в SQLite?
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, которые являются кластеризованный индекс.