Domanda

Interbase è un database generazionale.

Questo è grande, perché i ripristini sono vicino istantanea, ma count(*) prende sempre.
Questo è differenza per esempio MySQL dove conteggio può utilizzare un indice.

Non ho mai saputo il motivo per cui fino a quando ho visto questo:

Anche se un indice è disponibile su colonna o le colonne incluse nel conteggio, tutti i record deve essere visitato per vedere se sono visibili sotto l'isolamento della transazione corrente.

su Wikipedia: http://en.wikipedia.org/wiki/InterBase

Eventuali suggerimenti su come fare il conteggio veloce a Interbase / Firebird

È stato utile?

Soluzione

In base a questo link: http://www.firebirdfaq.org/faq5/

C'è un'altra soluzione. Questo è da Ivan Prenosil, molto tempo InterBase e Firebird di hacker. Questa soluzione restituisce solo un conteggio approssimativo di record. Come Ann W. Harrison spiega gentilmente:. Qualsiasi record che ha avuto la sua chiave primaria modificato apparirà due volte se la vecchia versione non è stato garbage collection e la loro cancellazione record continuerà nel conteggio fino a quando sono garbage collection

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

Questo funziona solo su tabelle che hanno una chiave primaria.

Altri suggerimenti

Si potrebbe anche fare 2 trigger per la tabella che si desidera contare. Questa soluzione è destinata per alcuni tavoli speciali dove si hanno un sacco di "azione".

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

Dopo di che, quando si ha bisogno di conoscere il conteggio della tabella speciale, basta selezionarlo dal COUNTING_TABLE

SELECT LINES FROM COUNTING_TABLE
WHERE TABLE='TABLE_NAME' /* Table name here*/
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top