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) + "");
}
3条答案
按热度按时间k3bvogb11#
这两种语法形式有点令人困惑,因为它们颠倒了数字:
相当于:
它与MySQL和PostgreSQL的语法兼容。MySQL支持这两种语法形式,其docs声称带Offset的第二种语法旨在提供与PostgreSQL的兼容性。PostgreSQL docs显示它只支持第二种语法,而SQLite的文档显示它同时支持两种语法,建议使用第二种语法以避免混淆。
顺便说一句,不先使用ORDER BY而使用LIMIT可能并不总是能得到您想要的结果。实际上,SQLite将以某种顺序返回行,这可能取决于它们在文件中的物理存储方式。但这并不一定意味着它的顺序是你想要的。获得可预测顺序的唯一方法是显式使用ORDER BY。
u7up0aaq2#
后者是另一种语法,带有一条警告:
如果使用逗号代替OFFSET关键字,则OFFSET是第一个数字,而LIMIT是第二个数字。这种表面上的冲突是有意为之的--它最大限度地提高了与传统SQL数据库系统的兼容性。
ndh0cuux3#
我做了一些测试,在性能上没有区别。
这只是为了与其他SQL语言兼容。
两个版本的运行时间相同。
我用表1制作了100000行的Sqlite db。我运行下一个测试
时间变化为0.001秒