インターベース/ファイアバードでカウントをスピードアップする方法(*)

StackOverflow https://stackoverflow.com/questions/5811747

  •  25-10-2019
  •  | 
  •  

質問

Interbaseは世代間データベースです。

ロールバックは瞬時に近いので素晴らしいですが、 count(*) 永遠にかかります。
これは ようではない たとえば、countがインデックスを使用できるmysql。

私はこれを見るまで、理由を決して知りませんでした:

カウントに含まれる列または列でインデックスを使用できる場合でも、現在のトランザクション分離の下でそれらが表示されるかどうかを確認するために、すべてのレコードを訪問する必要があります。

ウィキペディアで: http://en.wikipedia.org/wiki/interbase

インターベース/ファイアバードで高速カウントを行う方法に関するヒント

役に立ちましたか?

解決

このリンクによると: http://www.firebirdfaq.org/faq5/

別の解決策があります。これは、長年のインターベースとFirebirdハッカーのIvan Prenosilによるものです。このソリューションは、おおよそのレコードカウントのみを返します。 Ann W. Harrisonが親切に説明しているように、主要なキーを変更したレコードは、古いバージョンがゴミ収集されておらず、削除されたレコードがゴミ収集されるまでカウントで継続する場合に2回表示されます。

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