[sqlite] Sqlite LIMIT / OFFSET 쿼리

Sqlite에 대한 간단한 질문이 있습니다. 이것의 차이점은 무엇입니까?

Select * from Animals LIMIT 100 OFFSET 50

Select * from Animals LIMIT 100,50



답변

두 구문 형식은 숫자를 뒤집기 때문에 약간 혼동됩니다.

LIMIT <skip>, <count>

다음과 같습니다.

LIMIT <count> OFFSET <skip>

MySQL 및 PostgreSQL의 구문과 호환됩니다. MySQL은 두 구문 형식을 모두 지원하며 해당 문서 는 OFFSET을 사용한 두 번째 구문이 PostgreSQL과의 호환성을 제공하기위한 것이라고 주장합니다. PostgreSQL 문서 는 두 번째 구문 만 지원하고 SQLite의 문서 는 두 가지 구문을 모두 지원하므로 혼동을 피하기 위해 두 번째 구문을 권장합니다.

그런데 ORDER BY를 먼저 사용하지 않고 LIMIT를 사용하면 항상 원하는 결과를 얻을 수있는 것은 아닙니다. 실제로 SQLite는 파일에 실제로 저장되는 방법에 따라 행을 순서대로 반환합니다. 그러나 이것이 반드시 원하는 순서대로되어있는 것은 아닙니다. 예측 가능한 순서를 얻는 유일한 방법은 명시 적으로 ORDER BY를 사용하는 것입니다.


답변

후자는 하나의 경고 가있는 대체 구문입니다 .

OFFSET 키워드 대신 쉼표를 사용하는 경우 오프셋은 첫 번째 숫자이고 한계는 두 번째 숫자입니다. 이러한 모순은 의도적 인 것입니다. 레거시 SQL 데이터베이스 시스템과의 호환성을 최대화합니다.


답변

몇 가지 테스트를 수행했으며 성능에는 차이가 없습니다.

그것은 다른 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 초 동안 변화


답변