在asc和desc方向上创建索引


8

在过去的几周中,我一直在使用旧的Firebird数据库。由于种种原因,该数据库很糟糕,但是我注意到的一件事是,每个每个字段都有两个索引。每个都有一个段,一个按asc顺序,一个按desc顺序。

除了为每个表中的每个字段都具有索引的复杂性之外,我还想过-对于单段索引,具有两个具有相同索引段但一个进desc一出的索引是否有优势asc?有什么要收获的,还是现代的DBMS会简单地使用asc索引并从头开始,然后根据需要向后移动?

Answers:



5

尽管理论上Firebird索引是双向的,但引擎实际上并不使用双向性,因为由于页面的写入顺序,反向方向是不可信的:当索引页面被拆分时,如果页面之间的链接与反向读取可能会读取仍指向旧索引页面而不是新添加页面的链接,从而导致其跳过索引条目。《Firebird for Database Expert》(第3集-磁盘一致性)中对此进行了解释。

因此,由于不能保证索引的双向性,因此Firebird仅按其声明的方向(升序或降序)读取索引。现在,为什么您的数据库具有所有这些索引,我假设要么数据库设计人员不知道自己在做什么,要么他假设添加这些索引将使对任何列的排序更快。


4

是的,当不使用降序索引用于大型表时,在大表上会有明显的性能下降(FB 2.5):

select first 1 * 
from mytable 
where pk_id >= 200000 
order by pk_id desc

该查询用于根据主键字段“ pk_id”(整数)的值查找先前的记录。


postgres肯定存在此问题
PirateApp
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.