首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >来自虚拟表的记录顺序不正确

来自虚拟表的记录顺序不正确
EN

Stack Overflow用户
提问于 2012-09-13 10:42:02
回答 1查看 390关注 0票数 4

在测试SQLite Virtual Table机制的实现过程中,我们遇到了一个意想不到的行为。对于以下virtual table结构:

代码语言:javascript
复制
create table X(ID int, RL real)

此查询以正确的降序按RL字段返回所有记录。

查询1

代码语言:javascript
复制
select * from VTab t1 left outer join VTab t2 on t1.ID = t2.ID order by t1.RL desc;

执行计划1

代码语言:javascript
复制
explain query plan select * from VTab t1 left outer join VTab t2 on t1.ID = t2.ID order by t1.RL desc;  

0|0|0| SCAN TABLE VTab AS t1 VIRTUAL TABLE INDEX 0:D1; (~0 rows)
0|1|1| SCAN TABLE VTab AS t2 VIRTUAL TABLE INDEX 4:C0=0; (~0 rows)

这里的D1是由我们的xBestIndex方法实现生成的值,它意味着按字段#1 = RL进行降序排序。C0=0在这里意味着对字段#0 = ID的相同操作。

但是,下一个查询返回行( RL字段的别名不同),不进行任何排序。

查询2

代码语言:javascript
复制
select * from VTab t1 left outer join VTab t2 on t1.ID = t2.ID order by t2.RL desc

执行计划2

代码语言:javascript
复制
explain query plan select * from VTab t1 left outer join VTab t2 on t1.ID = t2.ID order by t2.RL desc;  

0|0|0| SCAN TABLE VTab AS t1 VIRTUAL TABLE INDEX 0: (~0 rows)
0|11| SCAN TABLE VTab AS t2 VIRTUAL TABLE INDEX 4:C0=0; (~0 rows)

正如您所看到的,没有提到的索引可以进行排序。对实表执行的查询(其结构与虚拟表的结构完全相同)如下:

查询3

代码语言:javascript
复制
select * from Table1 t1 left outer join Table1 t2 on t1.ID = t2.ID order by t2.RL desc

执行计划3

代码语言:javascript
复制
explain query plan select * from Table1 t1 left outer join Table1t2 on t1.ID = t2.ID order by t2.RL desc;  

0|0|0| SCAN TABLE Table1 AS t1 (~1000000 rows)
0|1|0| SEARCH TABLE Table1 AS t2 USING AUTOMATIC COVERING INDEX (ID=?)
0|1|0| (~7 rows)
0|0|0| USE TEMP B-TREE FOR ORDER BY

如您所见,在那里使用B-tree进行排序。

在我们这边,我们检查了在sqlite3_index_orderby结构( sqlite3_index_info结构的一部分)中接收到的内容,当它们到达xBestIndex时,它们没有包含任何有关排序的信息。此外,orderByConsumed out参数返回False (因为我们的输出没有排序,我们假设方石岩本身会订购行)。

这是SQLite Virtual Table支持中的一个bug,还是我们遗漏了什么?

EN

回答 1

Stack Overflow用户

发布于 2012-09-16 10:52:00

正如allocateIndexInfo()中的注释所述,只有在“ORDER子句仅包含当前虚拟表中的列”时,虚拟表才有机会实现排序。在您的查询中,排序列来自的虚拟表仅用于查找ID列,这样的单个值查找无法用于排序。

使用SQLite 3.7.14,我确实可以在查询2的计划中获得“使用临时B树进行排序”。xBestIndex返回的值是什么?

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12404446

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档