web-dev-qa-db-fra.com

Sqlite LIMIT / OFFSET requête

J'ai une question simple avec SQLite. Quelle est la différence entre ceci:

Select * from Animals LIMIT 100 OFFSET 50

et

Select * from Animals LIMIT 100,50
142
Pablo

Les deux formes de syntaxe sont un peu déroutantes car elles inversent les chiffres:

LIMIT <skip>, <count>

Est équivalent à:

LIMIT <count> OFFSET <skip>

Il est compatible avec la syntaxe de MySQL et PostgreSQL. MySQL supporte les deux formes de syntaxe, et ses docs affirment que la seconde syntaxe avec OFFSET était censée assurer la compatibilité avec PostgreSQL. PostgreSQL docs montre qu'il ne supporte que la deuxième syntaxe, et la documentation de SQLite montre qu'il supporte les deux, recommandant la deuxième syntaxe pour éviter toute confusion.

En passant, utiliser LIMIT sans d'abord utiliser ORDER BY peut ne pas toujours vous donner les résultats escomptés. En pratique, SQLite renverra les lignes dans un ordre, probablement déterminé par la manière dont elles sont stockées physiquement dans le fichier. Mais cela ne signifie pas nécessairement que c'est dans l'ordre que vous voulez. La seule façon d'obtenir un ordre prévisible est d'utiliser explicitement ORDER BY.

251
Bill Karwin

Ce dernier est une syntaxe alternative avec un mise en garde:

Si une virgule est utilisée à la place du mot clé OFFSET, le décalage correspond au premier nombre et la limite au second. Cette contradiction apparente est intentionnelle - elle optimise la compatibilité avec les systèmes de base de données SQL hérités.

22
Nick Dandoulakis

J'ai fait des tests et il n'y a pas de différence de performance.

Cela concerne uniquement la compatibilité avec d’autres langues SQL.

Le temps d'exécution des deux versions est identique.

J'ai fait sqlite db avec table1 avec 100000 lignes. Je lance le test suivant

long timeLimitOffset = 0;
long timeLimitComma = 0;
for (int i = 0; i < 100000; i++)
{
   //first version
   timeLimitOffset += SqlDuraction("Select * from table1  order by col1 LIMIT " + (i + 1) + " OFFSET " + (1001 - i) + "");
   // second version
   timeLimitComma += SqlDuraction("Select * from table1 order by col1 LIMIT " + (1001 - i) + " , " + (i + 1) + "");
}

Les temps varient pour 0,001 seconde

6