web-dev-qa-db-ja.com

SQLite LIMIT / OFFSETクエリ

Sqliteについて簡単な質問があります。これの違いは何ですか:

Select * from Animals LIMIT 100 OFFSET 50

そして

Select * from Animals LIMIT 100,50
142
Pablo

2つの構文形式は、数字を逆にするため、少し混乱します。

LIMIT <skip>, <count>

以下と同等です:

LIMIT <count> OFFSET <skip>

MySQLおよびPostgreSQLの構文と互換性があります。 MySQLは両方の構文形式をサポートし、その docs は、OFFSETの2番目の構文がPostgreSQLとの互換性を提供することを意図していたと主張しています。 PostgreSQL docs 2番目の構文のみをサポートすることを示し、 SQLiteのdocs は両方をサポートすることを示し、混乱を避けるために2番目の構文を推奨します。

ところで、最初にORDER BYを使用せずにLIMITを使用すると、必ずしも意図した結果が得られるとは限りません。実際には、SQLiteは行を何らかの順序で返します。おそらく、ファイルに物理的に格納されている方法によって決まります。しかし、これは必ずしもそれがあなたが望む順番にあるという意味ではありません。予測可能な順序を取得する唯一の方法は、ORDER BYを明示的に使用することです。

251
Bill Karwin

後者は、1つの警告を持つ代替構文です。

OFFSETキーワードの代わりにコンマが使用される場合、オフセットは最初の数値であり、制限は2番目の数値です。このように見える矛盾は意図的なものです。レガシーSQLデータベースシステムとの互換性を最大化します。

22

私はいくつかのテストを行いましたが、パフォーマンスに違いはありません。

これは、他のSQL言語との互換性のためだけです。

両方のバージョンの実行時間は同じです。

100000行のtable1でsqlite dbを作成しました。次のテストを実行します

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) + "");
}

時間は0.001秒間変化します