PostgreSQL внедрява кортежите много старателно (за разлика от половинчатите реализации, открити в Oracle, DB2, SQL Server и т.н.). Можете да напишете условието си, като използвате „неравенство на кортежи“, както в:
select *
from table1
where (a, -b, c) >= (10, -20, 30)
order by a, -b, c
limit 10
Моля, обърнете внимание, че тъй като втората колона е в низходящ ред, трябва да "обърнете" нейната стойност по време на сравнението. Ето защо се изразява като -b
и също, -20
. Това може да е трудно за нечислови колони като дати, varchar, LOB и т.н.
И накрая, използването на индекс все още е възможно с -b
стойност на колона, ако създадете ad-hoc индекс, като например:
create index ix1 on table1 (a, (-b), c);
Въпреки това, никога не можете да принудите PostgreSQL да използва индекс. SQL е декларативен език, а не императивен. Можете да примамите да го направи, като поддържа актуални статистиките на таблицата, а също и като избира малък брой редове. Ако вашият LIMIT
е твърде голям, PostgreSQL може да е склонен да използва вместо това сканиране на пълна таблица.