2011-12-23 10 views
1

の情報私はFirebirdのに新しいですし、私はそれにいじりいますテーブル構造に関するいくつかの情報を取得するためにメタデータだとなど表のカーディナリティFirebirdの

私の問題は、私はいくつかの情報を見つけるように見えることができないということです推定されるテーブルの基数についてFirebirdからこの情報を入手する方法はありますか?

編集:カーディナリティことで

iは、テーブルの行数を意味:)と私の使用のためにselect count(*)はオプションではありません。

答えて

0

なぜクエリは使用しない:

select count(distinct field_name)/(count(field_name) + 0.0000) from table_name 

指定された列の1高いカーディナリティに近い結果を。

+0

ビットを表現を混合するための@Sorry - カーディナリティによって、私は、テーブル内の行数を意味:) – aweis

+0

- >とSELECT COUNT(*)は私の目的のために減速すると考えられている:) – aweis

+0

はあなたの何@aweis目的? – Harriv

1

あなたはすなわち

SELECT count(*) FROM table; 
+0

残念ながら選択カウントが遅くなります – aweis

+1

FBはありませんいくつかのsysテーブルまたはいくつかの同様のテーブルでカウントを保持する...あなたは他のテーブルで "実行カウント"を維持するためにトリガを使用することができますが、relaiableではないので、レコードの正確な数ではなく、おおよそのカウントが必要な場合にのみ使用してください。 – ain

2

あなたはこのような主キーの選択を使用して、aproximative方法を使用することができ、他のSQL DBのようにCOUNT()関数を使用するテーブルの行数を取得するには:

SELECT 
    R.RDB$RELATION_NAME TABLENAME, 
    (
    CASE 
     WHEN I.RDB$STATISTICS = 0 THEN 0 
     ELSE 1/I.RDB$STATISTICS 
    END) AS COUNTRECORDS8 
FROM RDB$RELATIONS R 
    JOIN RDB$RELATION_CONSTRAINTS C ON (R.RDB$RELATION_NAME = C.RDB$RELATION_NAME AND C.RDB$CONSTRAINT_TYPE = 'PRIMARY KEY') 
    JOIN RDB$INDICES I ON (I.RDB$RELATION_NAME = C.RDB$RELATION_NAME AND I.RDB$INDEX_NAME = C.RDB$INDEX_NAME) 
+0

これは、すべてのテーブルがプライマリキーを持っている必要がありますか?、私はすべてのテーブルがプライマリキーまたはインデックスを全く持っていると仮定することはできません! – aweis

+0

はい。これには、主キーまたは一意索引が必要です。 – tico

+0

選択Cont(*)が遅いです。速度が必要な場合は、 "TableName"と "RecordCount"の2つのフィールドを持つテーブルを作成し、すべてのテーブルのトリガーでレコード数を維持できます。 – tico

関連する問題