Wie man die Anzahl (*) in Interbase/Firebird beschleunigt
Frage
Interbase ist eine Generationsdatenbank.
Das ist großartig, weil Rollbacks so weiterhin sind, aber count(*)
dauert ewig.
Das ist nicht wie zB MySQL, wo die Anzahl einen Index verwenden kann.
Ich wusste nie warum, bis ich das sah:
Selbst wenn ein Index in der Spalte oder in der in der Anzahl enthaltenen Spalten verfügbar ist, müssen alle Datensätze besucht werden, um festzustellen, ob sie unter der aktuellen Transaktionsisolierung sichtbar sind.
Auf Wikipedia: http://en.wikipedia.org/wiki/interbase
Alle Tipps zum schnellen Zählen in Interbase/Firebird
Lösung
Nach diesem Link: http://www.firebirdfaq.org/faq5/
Es gibt eine andere Lösung. Dieser stammt von Ivan Prenosil, einer langjährigen Interbase- und Firebird -Hacker. Diese Lösung gibt nur eine ungefähre Anzahl von Datensatzzahlen zurück. Wie Ann W. Harrison freundlicherweise erklärt: Jeder Rekord, bei dem der Hauptschlüssel modifiziert wurde, wird zweimal angezeigt, wenn die alte Version nicht gesammelt wurde und gelöschte Datensätze in der Anzahl fortgesetzt werden, bis sie Müll gesammelt sind.
/* 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;
Dies funktioniert nur auf Tabellen, die einen Grundschlüssel haben.
Andere Tipps
Sie können auch 2 Auslöser für den Tisch machen, den Sie zählen möchten. Diese Lösung ist für einige spezielle Tische bestimmt, an denen Sie viel "Action" haben.
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
Wenn Sie danach die Anzahl dieser speziellen Tabelle kennen müssen, wählen Sie sie einfach aus counting_table aus
SELECT LINES FROM COUNTING_TABLE
WHERE TABLE='TABLE_NAME' /* Table name here*/