2012-09-20 11 views
10

Anche dopo aver letto molto sull'indice fulltext di SQLite e sorge una domanda che non ho visto risposta ovunque:Tabella virtuale full text SQLite normalmente utilizzabile?

Ho già una tabella che voglio cercare con l'indice di testo completo. Vorrei solo creare un tavolo virtuale extra USING FTS3 o USING FTS4 e poi i miei dati nello INSERT.

Viene quindi utilizzata la doppia memoria in totale? Posso usare una tabella virtuale simile come una normale tabella e quindi evitare di memorizzare i dati due volte?

(sto lavorando con SQLite su Android, ma questa domanda può applicarsi a utilizzo su qualsiasi piattaforma compatibile con SQLite.)

risposta

10

Nonostante il fatto ha trovato alcuni dettagli cercherò di fornire risposta dettagliata:

1. Vuol quindi utilizzare la doppia memorizzazione in totale?

Sì, sì. Inoltre potrebbe usare l'evento più spazio. Ad esempio, per noto Enron E-Mail Dataset e FTS3example, basta sentire la differenza:

enter image description here

  • La tabella FTS3 consuma circa 2006 MB su disco rispetto ad appena 1453 MB per il tavolo ordinario

  • Il tavolo FTS3 ha impiegato poco meno di 31 minuti per popolare, contro il 25 per il tavolo ordinario

Il che rende la situazione un po 'sgradevole, ma ancora di ricerca full-text vale la pena.

2. Posso utilizzare un tavolo virtuale simile a un normale tavolo?

La risposta breve no, non è possibile.Il tavolo virtuale è solo una sorta di Visualizza con diverse limitazioni. Ne hai già notato parecchi.

In generale si dice che non si dovrebbe usare alcuna funzione che sembra essere innaturale per un Visualizza. Solo un minimo indispensabile per consentire alla tua applicazione di sfruttare appieno la potenza della ricerca full-text. Quindi non ci saranno sorprese in seguito, con la versione più recente del modulo.

Non c'è alcuna magia dietro questa soluzione, è solo un compromesso tra prestazioni, spazio su disco richiesto e funzionalità.

conclusione finale

vivamente consiglio di utilizzare FTS4, perché è più veloce e l'unico inconveniente è necessario ulteriore spazio.

In ogni caso, è necessario progettare attentamente la tabella virtuale tenendo conto di una natura supplementare e altamente specializzata di tale soluzione. In altre parole, non provare a sostituire la tabella iniziale con quella virtuale. Usali entrambi con grande cura.

Aggiornamento Si consiglia di consultare il seguente articolo: iOS full-text search with Core Data and SQLite. Diversi momenti interessanti:

  • La tabella virtuale viene creato nello stesso database SQLite in wich il contenuto Core Data risiede. Per mantenere questa tabella il più leggera possibile vengono inserite solo le proprietà dell'oggetto pertinenti alla query di ricerca.
  • L'implementazione SQLite offre qualcosa che i dati principali non sono: ricerca full-text. Accanto a questo, esegue quasi il 10% più veloce e almeno il 660% in più (memoria) in modo efficiente rispetto a una query di dati di base comparabile.
4

ho appena scoperto la main differences of virtual tables e sembra dipendere dal vostro uso se un singolo tavolo è sufficiente per tu. Non

  • Si può creare un trigger su un tavolo virtuale.

  • Non è possibile creare indici aggiuntivi su una tabella virtuale. (Tavoli virtuali possono avere indici ma che deve essere integrato nella tabella virtuale attuazione. Gli indici non può essere aggiunto separatamente utilizzando CREATE INDEX dichiarazioni.)

  • Non si può eseguire ALTER TABLE ... aggiungere i comandi COLONNA contro una tabella virtuale.

Quindi, se avete bisogno di un altro indice sul tavolo, è necessario utilizzare due tabelle.

+0

@RenatGilmanov Penso perché questa è più di una risposta? –