如何加速 Interbase/Firebird 中的 Count(*)

Joh*_*ica 5 firebird interbase count

Interbase 是一个分代数据库。

这很好,因为回滚几乎是瞬时的,但count(*)需要永远。
例如 MySQL不同,其中 count 可以使用索引。

我一直不知道为什么,直到我看到这个:

即使 COUNT 中包含的一个或多个列上的索引可用,也必须访问所有记录以查看它们在当前事务隔离下是否可见。

在维基百科上:http : //en.wikipedia.org/wiki/InterBase

关于如何在 Interbase/Firebird 中进行快速计数的任何提示

Hug*_*hem 4

根据此链接: http: //www.firebirdfaq.org/faq5/

还有另一种解决方案。这是 Ivan Prenosil 的作品,他是一位长期从事 Interbase 和 Firebird 黑客工作的人。此解决方案仅返回近似的记录计数。正如 Ann W. Harrison 善意地解释的那样:如果旧版本尚未被垃圾收集,则任何已修改主键的记录都将出现两次,并且删除的记录将继续计数,直到被垃圾收集为止。

/* first update the statistics */
UPDATE RDB$INDICES SET RDB$STATISTICS = -1;
COMMIT;

/* Display table names and record counts */
SELECT RDB$RELATIONS.RDB$RELATION_NAME,
CASE 
WHEN RDB$INDICES.RDB$STATISTICS = 0 THEN 0 
ELSE CAST(1 / RDB$INDICES.RDB$STATISTICS AS INTEGER) 
END 
FROM RDB$RELATIONS 
LEFT JOIN RDB$RELATION_CONSTRAINTS 
 ON RDB$RELATIONS.RDB$RELATION_NAME = RDB$RELATION_CONSTRAINTS.RDB$RELATION_NAME 
 AND RDB$CONSTRAINT_TYPE = 'PRIMARY KEY'
LEFT JOIN RDB$INDICES 
  ON RDB$RELATION_CONSTRAINTS.RDB$INDEX_NAME = RDB$INDICES.RDB$INDEX_NAME 
WHERE RDB$VIEW_BLR IS NULL AND RDB$RELATION_ID >= 128 
ORDER BY 1;
Run Code Online (Sandbox Code Playgroud)

这仅适用于具有主键的表。