【发布时间】:2021-03-25 05:51:42
【问题描述】:
在 Sqlite 中,我将视图定义为两个表的联合。当我使用该视图运行查询时,如果查询足够简单,则使用索引。对于某些复杂的查询,它不会并最终运行全表扫描。有没有办法让我可以高效地使用视图?
表/视图定义:
CREATE TABLE 'Table1' (Id varchar (18) PRIMARY KEY UNIQUE ON CONFLICT ROLLBACK, Name varchar (255) )
CREATE TABLE 'Table2' (Id varchar (18) PRIMARY KEY UNIQUE ON CONFLICT ROLLBACK, Name varchar (255) )
CREATE TABLE 'Table3' (Id varchar (18) PRIMARY KEY UNIQUE ON CONFLICT ROLLBACK, Name varchar (255) )
CREATE VIEW [UnionView] AS SELECT 'T1' tid, T1.rowid, T1.* FROM [Table1] T1 UNION ALL SELECT 'T2' tid, T2.rowid, T2.* FROM [Table2] T2
简单查询(使用索引):
SELECT Id FROM [UnionView] WHERE Id = 'asdf'
解释查询计划:
- 复合查询
- 最左边的子查询
- 搜索表 Table1 AS T1 USING INDEX sqlite_autoindex_Table1_1 (Id=?)
- 联合所有
- 搜索表 Table2 AS T2 USING INDEX sqlite_autoindex_Table2_1 (Id=?)
LEFT JOIN 查询(不使用索引):
SELECT T3.Id FROM [Table3] T3 LEFT JOIN [UnionView] T ON T3.Id=T.Id WHERE T3.Id = 'asdf'
解释查询计划
- 物化 2
- 复合查询
- 最左边的子查询
- 扫描表 Table1 AS T1
- 联合所有
- 扫描表 Table2 AS T2
- 使用覆盖索引 sqlite_autoindex_Table3_1 (Id=?) 搜索 TABLE Table3 作为 T3
- 扫描子查询 2 作为 T
【问题讨论】:
标签: sqlite indexing view union