sql >> Databasteknik >  >> RDS >> PostgreSQL

Indexskanning för jämförelse med flera kolumner - olikformig indexkolumnordning

PostgreSQL implementerar tupler mycket noggrant (till skillnad från halva implementeringar som finns i Oracle, DB2, SQL Server, etc.). Du kan skriva ditt tillstånd med "tuples inequality", som i:

select * 
from table1
where (a, -b, c) >= (10, -20, 30)
order by a, -b, c
limit 10

Observera att eftersom den andra kolumnen är i fallande ordning måste du "invertera" dess värde under jämförelsen. Det är därför det uttrycks som -b och även -20 . Detta kan vara knepigt för icke-numeriska kolumner som datum, varchar, LOB, etc.

Slutligen är det fortfarande möjligt att använda ett index med -b kolumnvärde om du skapar ett ad-hoc-index, till exempel:

create index ix1 on table1 (a, (-b), c);

Du kan dock aldrig tvinga PostgreSQL att använda ett index. SQL är ett deklarativt språk, inte ett imperativt. Du kan locka det för att göra det genom att hålla tabellstatistiken uppdaterad, och även genom att välja ett litet antal rader. Om din LIMIT är för stor kan PostgreSQL vara benägen att använda en fullständig tabellsökning istället.



  1. Reproducera com.mysql.jdbc.exceptions.jdbc4.CommunicationsException med en inställning av Spring, hibernate och C3P0

  2. Hjälp mig förstå skillnaden mellan CLOBs och BLOBs i Oracle

  3. ORA-29481:Implicita resultat kan inte returneras till klienten när man anropar Oracle 12c-proceduren från JDBC

  4. En datamodell för en app för bokning av läkarbesök