InterBase是一个世代数据库。

太好了,因为回滚几乎是瞬时的,但是 count(*) 永远需要。
这是 与众不同 例如,计数可以使用索引。

直到我看到这一点,我才知道为什么:

即使在计数中包含的列或列上有索引,也必须访问所有记录,以查看在当前交易隔离下是否可见。

在Wikipedia上: http://en.wikipedia.org/wiki/interbase

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

有帮助吗?

解决方案

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

还有另一个解决方案。这是由伊万·普雷诺西尔(Ivan Prenosil)撰写的,这是一个长期的Interbase和Firebird Hacker。该解决方案仅返回近似记录计数。正如安·W·哈里森(Ann W.

/* 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;

这只能在具有主键的表上工作。

其他提示

您也可以为要计算的桌子制作2个触发器。该解决方案旨在适用于您有很多“动作”的一些特殊表。

CREATE TRIGGER TABLE_BI0 ACTIVE BEFORE INSERT
BEGIN
   UPDATE COUNTING_TABLE
   SET LINES=LINES + 1
   WHERE TABLE='TABLE_NAME'; /* Table name here*/
END


CREATE TRIGGER TABLE_BD0 ACTIVE BEFORE DELETE
BEGIN
   UPDATE COUNTING_TABLE
   SET LINES=LINES - 1
   WHERE TABLE='TABLE_NAME'; /* Table name here*/
END

之后,当您需要知道该特殊表的计数时,您只需从Counting_table中选择它

SELECT LINES FROM COUNTING_TABLE
WHERE TABLE='TABLE_NAME' /* Table name here*/
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top