Создать виртуальную таблицу только с rowid другой таблицы - PullRequest
0 голосов
/ 23 сентября 2019

Предположим, у меня есть таблица в sqlite следующим образом:

`name`     `age`
"bob"      20      (rowid=1)
"tom"      30      (rowid=2)      
"alice"    19      (rowid=3)

И я хочу сохранить результат следующей таблицы, используя минимальный объем памяти:

SELECT * FROM mytable WHERE name < 'm' ORDER BY age

Как я могусохранить виртуальную таблицу из этого набора результатов, которая просто даст мне упорядоченный набор результатов.Другими словами, хранение rowid упорядоченным образом (в приведенном выше примере это будет 3,1) без сохранения всех данных в отдельной таблице.

Например, если бы я хранил эту информацию только с rowidв отсортированном порядке:

CREATE TABLE vtable AS 
SELECT rowid from mytable WHERE name < 'm' ORDER BY age;

Тогда я считаю, что каждый раз, когда мне нужно будет запросить vtable, мне придется присоединять его к исходной таблице, используя rowid.Есть ли способ сделать это так, чтобы vtable «знал» контент, который у него был основан на внешней таблице (я полагаю, что это называется external-content при создании индекса fts - https://sqlite.org/fts5.html#external_content_tables).

1 Ответ

2 голосов
/ 24 сентября 2019

Я считаю, что это называется внешним контентом при создании fts.

Нет виртуальной таблицы, созданной с использованием CREATE VIRTUAL TABLE ...... USING module_name (module_parameters)

Виртуальные таблицы являются таблицамикоторый может вызывать модуль, поэтому ИСПОЛЬЗОВАНИЕ module_name (module_parameters) является обязательным.

Для FTS (полнотекстового поиска) вам придется прочитать документацию , но это может быть что-то вроде

CREATE VIRTUAL TABLE IF NOT EXISTS bible_fts USING FTS3(book, chapter INTEGER, verse INTEGER, content TEXT)

Скорее всего, вам не нужна / не нужна виртуальная таблица.


CREATE TABLE vtable AS SELECT rowid from mytable WHERE name < 'm' ORDER BY age;

создаст обычную таблицу, если она еще не существуетэто будет сохраняться.И если вы хотите использовать его, то он, вероятно, будет полезен только путем объединения его с mytable.По сути, это позволило бы снимок, но по цене не менее 4 тыс. Для каждого снимка.

Я бы предложил одну таблицу для всех снимков, которая имеет два столбца: идентификатор снимка и идентификатор строки снимка.Это, вероятно, будет занимать гораздо меньше места.

Базовый пример

Рассмотрим: -

CREATE TABLE IF NOT EXISTS mytable (
    id INTEGER PRIMARY KEY, /* NOTE not using an alias of the rowid may present issues as the id's can change */
    name TEXT,
    age INTEGER
);
CREATE TABLE IF NOT EXISTS snapshot (id TEXT DEFAULT CURRENT_TIMESTAMP, mytable_map);

INSERT INTO mytable (name,age) VALUES('Mary',21),('George',22);

INSERT INTO snapshot (mytable_map) SELECT id FROM mytable;

SELECT snapshot.id,name,age FROM snapshot JOIN mytable ON mytable.id = snapshot.mytable_map;

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

Тогда вы получите 3 снимка (каждый с количеством строк, но одинаковым значением в столбце идентификатора для каждого снимка), первый с 2 ​​строками,2-е с 4 и последним с 6 (так как каждый цикл добавляет 2 строки в mytable): -

enter image description here

...