Samenvatting :in deze zelfstudie leert u hoe u de op SQLite-expressie gebaseerde index kunt gebruiken om gegevens op te vragen om de queryprestaties te verbeteren, met name voor de query's die expressie of functie gebruiken.
Inleiding tot de op SQLite-expressie gebaseerde index
Wanneer u een index maakt, gebruikt u vaak een of meer kolommen in een tabel. Naast de normale indexen, stelt SQLite u in staat om een index te vormen op basis van expressies die betrekking hebben op tabelkolommen. Dit soort index wordt een op expressies gebaseerde index genoemd.
De volgende zoekopdracht selecteert de klanten van wie de lengte van het bedrijf groter is dan 10 tekens.
SELECT customerid,
company
FROM customers
WHERE length(company) > 10
ORDER BY length(company) DESC;
Code language: SQL (Structured Query Language) (sql)
Als u het EXPLAIN QUERY PLAN
. gebruikt statement, zult u zien dat de SQLite-queryplanner de hele customers
. moest scannen tabel om de resultatenset te retourneren.
EXPLAIN QUERY PLAN
SELECT customerid,
company
FROM customers
WHERE length(company) > 10
ORDER BY length(company) DESC;
Code language: SQL (Structured Query Language) (sql)
De SQLite-queryplanner is een softwarecomponent die het beste algoritme of queryplan bepaalt om een SQL-instructie uit te voeren. Vanaf SQLite versie 3.8.0 is de component voor de queryplanner herschreven om sneller te werken en betere queryplannen te genereren. Het herschrijven staat bekend als de volgende generatie queryplanner of NGQP.
Een index maken op basis van de uitdrukking LENGTH(company)
, gebruik je de volgende verklaring.
CREATE INDEX customers_length_company
ON customers(LENGTH(company));
Code language: SQL (Structured Query Language) (sql)
Als u nu de bovenstaande query opnieuw uitvoert, gebruikt SQLite de expressie-index om te zoeken om de gegevens te selecteren, wat sneller is.
Hoe de op SQLite-expressie gebaseerde index werkt
De SQLite-queryplanner gebruikt de op expressies gebaseerde index alleen wanneer de expressie, die u hebt opgegeven in de CREATE INDEX
statement, ziet er hetzelfde uit als in de WHERE-clausule of ORDER BY-clausule.
In de voorbeelddatabase hebben we bijvoorbeeld de invoice_items
tafel.
De volgende verklaring creëert een index met behulp van de kolommen voor eenheidsprijs en hoeveelheid.
CREATE INDEX invoice_line_amount
ON invoice_items(unitprice*quantity);
Code language: SQL (Structured Query Language) (sql)
Wanneer u echter de volgende query uitvoert:
EXPLAIN QUERY PLAN
SELECT invoicelineid,
invoiceid,
unitprice*quantity
FROM invoice_items
WHERE quantity*unitprice > 10;
Code language: SQL (Structured Query Language) (sql)
De SQLite-queryplanner heeft de index niet gebruikt omdat de uitdrukking in de CREATE INDEX
( unitprice*quantity
) is niet hetzelfde als die in de WHERE
clausule (hoeveelheid*eenheidsprijs)
SQLite-expressie gebaseerde indexbeperking
Het volgende geeft een overzicht van alle beperkingen op de uitdrukking die in de CREATE INDEX
voorkomt verklaring.
- De expressie mag alleen verwijzen naar de kolommen van de tabel die wordt geïndexeerd. Het kan niet verwijzen naar de kolommen van andere tabellen.
- De uitdrukking kan alleen de deterministische functieaanroep gebruiken.
- De expressie kan geen subquery gebruiken.
In deze zelfstudie hebt u geleerd hoe u de op SQLite-expressie gebaseerde index kunt gebruiken om de queryprestaties te verbeteren.