如何规划没有 where 子句的查询以防止非索引读取
How to plan a query that has no where clause to prevent non-indexed reads
有一件事让我很烦恼。当我在没有任何 where
-子句或 order by
-子句的情况下执行查询时
select ID
from M_TABLE;
读取未编入索引。
我需要这个查询如此简单,因为它在视图的 select
语句中使用。
非索引读取对我来说有一种糟糕表现的难闻气味。所以我尽可能避免使用它们。
对于这种极其简单的查询,我只想使用主键来对读取进行索引。但是当我尝试添加这样的计划声明时
select ID
from M_TABLE t
plan (t index (PK_M_TABLE));
错误信息
index cannot be used in the specified plan.
index PK_M_TABLE cannot be used in the specified plan.
返回。
我如何强制对读取进行索引?我是否在计划声明中拼写错误?我查看了 the documentation 但看不到语法错误,我认为这实际上不是语法错误。
DDL:
CREATE TABLE M_TABLE (
ID INTEGER NOT NULL);
ALTER TABLE M_TABLE ADD CONSTRAINT PK_M_TABLE PRIMARY KEY (ID);
注:
我在下面 post 编辑了一个可能的解决方法。如果您认为这是唯一可能的解决方案,请随意投票。但如果除此之外还有其他解决方案,请post将它们作为附加答案。
强制对读取进行索引的一种可能性是在相关索引字段上添加一个 order by
子句:
select ID
from M_TABLE
order by ID;
因此,内部使用了计划语句plan (M_TABLE order PK_M_TABLE)
。
如果您没有指定使用索引的 where 子句(或 order by),那么 plan natural 很可能是最好的计划,特别是如果您打算阅读整个 table .
Firebird 没有聚簇索引,因此即使是索引读取,它最终也必须从 table 数据页本身读取。索引读取本身可能更快,但从数据页随机读取数据可能比按数据页顺序读取数据更昂贵。我知道的唯一例外是,如果您有大量更新和删除会产生大量垃圾和反向版本。
据我所知,您担心这是一种观点是没有根据的。在另一个查询中使用视图时,Firebird 将内联视图并针对整个查询进行优化。当在非平凡查询中使用视图时,在您的视图中应用订单实际上可能 损害 性能。
有一件事让我很烦恼。当我在没有任何 where
-子句或 order by
-子句的情况下执行查询时
select ID
from M_TABLE;
读取未编入索引。
我需要这个查询如此简单,因为它在视图的 select
语句中使用。
非索引读取对我来说有一种糟糕表现的难闻气味。所以我尽可能避免使用它们。
对于这种极其简单的查询,我只想使用主键来对读取进行索引。但是当我尝试添加这样的计划声明时
select ID
from M_TABLE t
plan (t index (PK_M_TABLE));
错误信息
index cannot be used in the specified plan.
index PK_M_TABLE cannot be used in the specified plan.
返回。
我如何强制对读取进行索引?我是否在计划声明中拼写错误?我查看了 the documentation 但看不到语法错误,我认为这实际上不是语法错误。
DDL:
CREATE TABLE M_TABLE (
ID INTEGER NOT NULL);
ALTER TABLE M_TABLE ADD CONSTRAINT PK_M_TABLE PRIMARY KEY (ID);
注: 我在下面 post 编辑了一个可能的解决方法。如果您认为这是唯一可能的解决方案,请随意投票。但如果除此之外还有其他解决方案,请post将它们作为附加答案。
强制对读取进行索引的一种可能性是在相关索引字段上添加一个 order by
子句:
select ID
from M_TABLE
order by ID;
因此,内部使用了计划语句plan (M_TABLE order PK_M_TABLE)
。
如果您没有指定使用索引的 where 子句(或 order by),那么 plan natural 很可能是最好的计划,特别是如果您打算阅读整个 table .
Firebird 没有聚簇索引,因此即使是索引读取,它最终也必须从 table 数据页本身读取。索引读取本身可能更快,但从数据页随机读取数据可能比按数据页顺序读取数据更昂贵。我知道的唯一例外是,如果您有大量更新和删除会产生大量垃圾和反向版本。
据我所知,您担心这是一种观点是没有根据的。在另一个查询中使用视图时,Firebird 将内联视图并针对整个查询进行优化。当在非平凡查询中使用视图时,在您的视图中应用订单实际上可能 损害 性能。