sql >> Database teknologi >  >> RDS >> SQLite

SQLite udtryksbaseret indeks

Oversigt :i denne øvelse lærer du, hvordan du bruger det SQLite-udtryksbaserede indeks til at forespørge data for at forbedre forespørgselsydeevnen, især for de forespørgsler, der bruger udtryk eller funktion.

Introduktion til det SQLite-udtryksbaserede indeks

Når du opretter et indeks, bruger du ofte en eller flere kolonner i en tabel. Udover de normale indekser giver SQLite dig mulighed for at danne et indeks baseret på udtryk involverede tabelkolonner. Denne type indeks kaldes et udtryksbaseret indeks.

Følgende forespørgsel vælger de kunder, hvis længde af virksomheden er på mere end 10 tegn.

SELECT customerid,
       company
  FROM customers
 WHERE length(company) > 10
 ORDER BY length(company) DESC;Code language: SQL (Structured Query Language) (sql)

Hvis du bruger EXPLAIN QUERY PLAN sætning, vil du opdage, at SQLite-forespørgselsplanlæggeren skulle scanne hele customers tabel for at returnere resultatsættet.

EXPLAIN QUERY PLAN
SELECT customerid,
       company
  FROM customers
 WHERE length(company) > 10
 ORDER BY length(company) DESC;Code language: SQL (Structured Query Language) (sql)

SQLite-forespørgselsplanlæggeren er en softwarekomponent, der bestemmer den bedste algoritme eller forespørgselsplan til at udføre en SQL-sætning. Fra og med SQLite version 3.8.0 blev forespørgselsplanlægningskomponenten omskrevet til at køre hurtigere og generere bedre forespørgselsplaner. Omskrivningen er kendt som næste generations forespørgselsplanlægger eller NGQP.

At oprette et indeks baseret på udtrykket LENGTH(company) , bruger du følgende udsagn.

CREATE INDEX customers_length_company 
ON customers(LENGTH(company));Code language: SQL (Structured Query Language) (sql)

Hvis du nu udfører forespørgslen ovenfor igen, vil SQLite bruge udtryksindekset til at søge for at vælge dataene, hvilket er hurtigere.

Sådan fungerer det SQLite-udtryksbaserede indeks

SQLite-forespørgselsplanlæggeren bruger kun det udtryksbaserede indeks, når udtrykket, som du har angivet i CREATE INDEX sætning, vises som i WHERE-sætningen eller ORDER BY-sætningen.

I eksempeldatabasen har vi f.eks. invoice_items tabel.

Følgende erklæring opretter et indeks ved hjælp af enhedspris- og mængdekolonner.

CREATE INDEX invoice_line_amount 
ON invoice_items(unitprice*quantity);Code language: SQL (Structured Query Language) (sql)

Men når du kører følgende forespørgsel:

EXPLAIN QUERY PLAN 
SELECT invoicelineid,
       invoiceid, 
       unitprice*quantity
FROM invoice_items
WHERE quantity*unitprice > 10;Code language: SQL (Structured Query Language) (sql)

SQLite-forespørgselsplanlæggeren brugte ikke indekset, fordi udtrykket i CREATE INDEX ( unitprice*quantity ) er ikke den samme som den i WHERE klausul (mængde*enhedspris)

SQLite-udtryksbaseret indeksbegrænsning

Det følgende viser alle begrænsningerne for det udtryk, der vises i CREATE INDEX erklæring.

  1. Udtrykket skal kun referere til kolonnerne i tabellen, der indekseres. Det kan ikke henvise til kolonnerne i andre tabeller.
  2. Udtrykket kan kun bruge det deterministiske funktionskald.
  3. Udtrykket kan ikke bruge en underforespørgsel.

I dette selvstudie har du lært, hvordan du bruger det SQLite-udtryksbaserede indeks til at forbedre forespørgselsydeevnen.


  1. Hvor mange poster kan jeg gemme i 5 MB PostgreSQL på Heroku?

  2. Hvordan får man adgang til array internt indeks med postgreSQL?

  3. Bestil ved at bruge en parameter for kolonnenavnet

  4. LPAD() Funktion i PostgreSQL