Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当满足LIMIT子句时,SQLite是否优化(终止)排序?_Sql_Sqlite_Sorting_Query Optimization_Android Room - Fatal编程技术网

当满足LIMIT子句时,SQLite是否优化(终止)排序?

当满足LIMIT子句时,SQLite是否优化(终止)排序?,sql,sqlite,sorting,query-optimization,android-room,Sql,Sqlite,Sorting,Query Optimization,Android Room,我正在使用room在android中编写一些sqlite调用,我的过程中最耗时的部分是select*from表格order by x limit 20;其中x是一个double,表的顺序可以是上万行。我的目标是优化这个过程。对我来说,在x上放一个索引是毫无意义的,因为每几秒钟都会不断地重新插入数以万计的记录,而在x上放一个索引会减慢插入过程的速度,我认为这比排序过程所需的时间还要慢 现在我知道,如果您只对前20个条目感兴趣,那么使用堆排序实际上不必经历整个排序过程。我知道堆排序收敛到ln n,所

我正在使用room在android中编写一些sqlite调用,我的过程中最耗时的部分是select*from表格order by x limit 20;其中x是一个double,表的顺序可以是上万行。我的目标是优化这个过程。对我来说,在x上放一个索引是毫无意义的,因为每几秒钟都会不断地重新插入数以万计的记录,而在x上放一个索引会减慢插入过程的速度,我认为这比排序过程所需的时间还要慢

现在我知道,如果您只对前20个条目感兴趣,那么使用堆排序实际上不必经历整个排序过程。我知道堆排序收敛到ln n,所以我猜在列表的前20个元素处停止将在ln 20或O20 ln n上不确定,太不合格,无法进行计算


我的问题是sqlite是否意识到这一点,并在遇到限制时优化排序。如果没有,我能做些什么来实现它。调用MAX 20次可能更快吗?

我怀疑SQLite是否有这样的优化;它以其代码占用空间小而自豪。这样的优化即使在更复杂的数据库中也不常见。如果没有索引,这样的查询可以被任何数据库优化吗?似乎在不保证全部订购的情况下。。这是索引可以提供的额外信息。同样,如果没有索引,我希望MAX也会被迫读取所有记录。所以有点含糊其辞:在lgn+n空间上排序还是在20 x空间上排序?我会遵从真实世界/数据基准,并且在使用索引时也会运行测试。或者,由于这是一个单一的进程任务,可能会使用优先级队列或诸如此类的方法处理内存中的数据,并仅将SQLite用作直写持久层。这将避免如此相关吗?对问题中提出的指数和排序问题进行基准测试,是否存在潜在的不必要因素?复杂性的基准增加。我的目标是优化此过程…-如果是这样的话,我建议你换一个更好的数据库。SQLite非常棒,重量也很轻,但它是一个简单的数据库。@TheImpler这似乎有点不必要的福音。1它忽略了上下文和域的问题,2我首选的“企业级”数据库在这种情况下在理论上不会更好,而且肯定不是一个可行的替代品,请参见1,即使它这样做了。-或者有没有一个具体可行的建议遵循….?我怀疑SQLite有这样的优化;它以其代码占用空间小而自豪。这样的优化即使在更复杂的数据库中也不常见。如果没有索引,这样的查询可以被任何数据库优化吗?似乎在不保证全部订购的情况下。。这是索引可以提供的额外信息。同样,如果没有索引,我希望MAX也会被迫读取所有记录。所以有点含糊其辞:在lgn+n空间上排序还是在20 x空间上排序?我会遵从真实世界/数据基准,并且在使用索引时也会运行测试。或者,由于这是一个单一的进程任务,可能会使用优先级队列或诸如此类的方法处理内存中的数据,并仅将SQLite用作直写持久层。这将避免如此相关吗?对问题中提出的指数和排序问题进行基准测试,是否存在潜在的不必要因素?复杂性的基准增加。我的目标是优化此过程…-如果是这样的话,我建议你换一个更好的数据库。SQLite非常棒,重量也很轻,但它是一个简单的数据库。@TheImpler这似乎有点不必要的福音。1它忽略了上下文和域的问题,2我首选的“企业级”数据库在这种情况下在理论上不会更好,而且肯定不是一个可行的替代品,请参见1,即使它这样做了。-还是有一个具体可行的建议。。?