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

War es hilfreich?

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*/
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top