Я предполагаю, что проблема заключается в текстовом первичном ключе. Это требует построения большого и дорогого текстового индекса.
Первичный ключ - это длинная нуклеотидная последовательность (от 20 до 300 символов), field1 - это целое число (от 1 до 1500), а field2 - это Относительное логарифмическое отношение (примерно от -10 до +10).
Текстовые первичные ключи имеют мало преимуществ и много недостатков.
- Они требуют больших, медленных индексов. Медленно строить, медленно запрашивать, медленно вставлять.
- Заманчиво изменить текст, именно то, что вы не хотите, чтобы первичный ключ делал.
- Любая таблица, ссылающаяся на него, также требует хранения и индексация текста при добавлении в bloat.
- Соединения с этой таблицей будут выполняться медленнее из-за первичного ключа текста.
Рассмотрим, что происходит, когда вы создаете новую таблицу, которая ссылается на эту.
create table othertable(
myrefrence references mytable, -- this is text
something integer,
otherthing integer
)
othertable
теперь должен хранить копию всей последовательности, вздувая таблицу. Вместо того, чтобы быть простыми целыми числами, теперь у него есть текстовый столбец, раздутый в таблице. И он должен создать свой собственный текстовый индекс, увеличивая индекс и замедляя объединения и вставки.
Вместо этого используйте обычный, целочисленный первичный ключ с автоинкрементом и сделайте столбец последовательности уникальным (который также индексируется). Это обеспечивает все преимущества текстового первичного ключа без каких-либо недостатков.
create table sequences(
id integer primary key autoincrement,
sequence text not null unique,
field1 integer not null,
field2 real not null
);
Теперь ссылки на sequences
являются простым целым числом.
Поскольку процесс импорта SQLite не очень настраиваемый, для эффективного размещения ваших данных в этой таблице в SQLite требуется несколько шагов.
Во-первых, импортируйте ваши данные в таблицу, которая еще не существует. Убедитесь, что поля заголовка совпадают с именами нужных вам столбцов.
$ cat test.tsv
sequence field1 field2
d34db33f 1 1.1
f00bar 5 5.5
somethings 9 9.9
sqlite> .import test.tsv import_sequences
Поскольку индексирование не происходит, этот процесс должен go довольно быстро. SQLite создал таблицу под названием import_sequences
со всем типом text
.
sqlite> .schema import_sequences
CREATE TABLE import_sequences(
"sequence" TEXT,
"field1" TEXT,
"field2" TEXT
);
sqlite> select * from import_sequences;
sequence field1 field2
---------- ---------- ----------
d34db33f 1 1.1
f00bar 5 5.5
somethings 9 9.9
Теперь мы создадим окончательную рабочую таблицу.
sqlite> create table sequences(
...> id integer primary key autoincrement,
...> sequence text not null unique,
...> field1 integer not null,
...> field2 real not null
...> );
Для эффективности обычно добавляли бы уникальное ограничение после импорта, но SQLite имеет очень ограниченную возможность изменять таблицу и не может изменять существующий столбец, кроме как для изменения его имени.
Теперь передайте данные из таблицы импорта в sequences
. Первичный ключ будет заполнен автоматически.
insert into sequences (sequence, field1, field2)
select sequence, field1, field2
from import_sequences;
Поскольку индекс sequence
должен быть проиндексирован, это может не ускорить импорт, но это приведет к гораздо лучшей и более эффективной схеме в будущем. Если вы хотите повысить эффективность, рассмотрите более надежную базу данных .
После того, как вы подтвердите правильность данных, удалите таблицу импорта.