使用:Firebird 2.5.3
这是我无法从(当前)Firebird文档中了解有关表索引的内容。
表结构如下:
CREATE TABLE CHILDTABLE
(
ROW_ID INTEGER NOT NULL,
PARENT_ID INTEGER NOT NULL,
CONSTRAINT PK_CHILDTABLE PRIMARY KEY (ROW_ID)
);
将从此表中选择一行或多行的查询如下所示:
SELECT ROW_ID FROM CHILDTABLE WHERE PARENT_ID = ?
问题:
鉴于每次将此查询发送到数据库时,它都会要求PARENT_ID值(参数)接近表中值集的最大值(以及最近添加的值)为了从数据库中更快/更快地检索结果,降序索引是否优先于升序索引?
鉴于这种情况,使用降序索引而不是升序索引会对性能产生负面影响吗? (例如,如果服务器是一个降序索引而不是升序索引,那么服务器是否需要进行更多处理,以及当索引的大小增加时,索引如何影响表的插入性能?)
答案 0 :(得分:2)
问题:
鉴于每次将此查询发送到数据库时,它都会要求PARENT_ID值(参数)接近最大值 表中的值集(以及最近添加的值) ()),降序索引优先于升序索引 从数据库中更快/更快地检索结果的目的是什么?
没有。索引由两个数据结构组成:有序列表(在Firebird中实现为单链表)和搜索树(实现为B树)。
似乎您的索引访问的心智模型是它使用有序列表通过从一端开始的列表后面来查找匹配的行。但是,实际上它使用了B-Tree遍历,它可以在索引中找到具有相同操作数的任何点。
鉴于这种情况,使用降序索引而不是升序索引会对性能产生负面影响吗? (例如,如果服务器是一个降序索引而不是升序索引,那么服务器是否需要进行更多处理,以及当索引的大小增加时,索引如何影响表的插入性能?)
我认为没有明显的区别。 DESC
索引的原因是支持ORDER BY ... DESC
。这是考虑索引排序的唯一原因。
参考文献:
ORDER BY
注意Firebird是其中描述的规则的例外:在Firebird中,索引顺序必须始终与ORDER BY
子句完全匹配。