sql >> Databasteknik >  >> RDS >> SQLite

SQLite uttrycksbaserat index

Sammanfattning :i den här handledningen kommer du att lära dig hur du använder det SQLite-uttrycksbaserade indexet för att fråga data för att förbättra frågeprestanda, särskilt för frågor som använder uttryck eller funktion.

Introduktion till det SQLite-uttrycksbaserade indexet

När du skapar ett index använder du ofta en eller flera kolumner i en tabell. Förutom de normala indexen låter SQLite dig skapa ett index baserat på uttryck som är involverade i tabellkolumner. Denna typ av index kallas ett uttrycksbaserat index.

Följande fråga väljer de kunder vars längd på företaget är längre än 10 tecken.

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

Om du använder EXPLAIN QUERY PLAN uttalande, kommer du att upptäcka att SQLite-frågeplaneraren var tvungen att skanna hela customers tabell för att returnera resultatuppsättningen.

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-frågeplaneraren är en mjukvarukomponent som bestämmer den bästa algoritmen eller frågeplanen för att exekvera en SQL-sats. Från och med SQLite version 3.8.0 skrevs frågeplanerarens komponent om för att köras snabbare och generera bättre frågeplaner. Omskrivningen är känd som nästa generations frågeplanerare eller NGQP.

Att skapa ett index baserat på uttrycket LENGTH(company) , använder du följande påstående.

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

Om du nu kör frågan ovan igen kommer SQLite att använda uttrycksindexet för att söka för att välja data, vilket är snabbare.

Hur det SQLite-uttrycksbaserade indexet fungerar

SQLite-frågeplaneraren använder det uttrycksbaserade indexet endast när uttrycket som du angav i CREATE INDEX sats, visas på samma sätt som i WHERE-satsen eller ORDER BY-satsen.

I exempeldatabasen har vi till exempel invoice_items bord.

Följande sats skapar ett index med hjälp av kolumnerna enhetspris och kvantitet.

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

Men när du kör följande fråga:

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

SQLite-frågeplaneraren använde inte indexet eftersom uttrycket i CREATE INDEX ( unitprice*quantity ) är inte samma som den i WHERE klausul (kvantitet*enhetspris)

SQLite-uttrycksbaserad indexbegränsning

Följande listar alla begränsningar för uttrycket som visas i CREATE INDEX uttalande.

  1. Uttrycket måste endast referera till kolumnerna i tabellen som indexeras. Den kan inte referera till kolumnerna i andra tabeller.
  2. Uttrycket kan bara använda det deterministiska funktionsanropet.
  3. Uttrycket kan inte använda en underfråga.

I den här handledningen har du lärt dig hur du använder det SQLite-uttrycksbaserade indexet för att förbättra frågeprestanda.


  1. Flera index vs index med flera kolumner

  2. Reverse engineering (oracle) schema till ERD

  3. ClassCastException:java.math.BigInteger kan inte castas till java.lang.Long på att ansluta till MySQL

  4. Salesforce SOQL från Crystal Reports