2012-04-03 4 views
2

Firebirdデータベース(FB2.1)からDDL情報を取得するための汎用コードがあります。一般的なSQLを最適化してDDL情報を取得する方法

SELECT * FROM MyTable where 'c' <> 'c' 

このコードは変更できません。実際には、問題があれば、レポートビルダー10の内部にあります。

実際、私のデータベースの一部のテーブルは大量に埋まってしまい(> 1Mレコード)、そのクエリの実行には時間がかかりすぎます。

私は、それは明らかにそのインデックスを使用し、非常に迅速に実行されます

SELECT * FROM MyTable where SomeIndexedField = SomeImpossibleValue 

実行しようとします。

これは不可能なマッチャーであり、何らかの最適化を行い、各行に対してテストするのを避けることがデータベースには難しいことではありません。

検索を最適化するためにFirebirdデータベースを作成する方法はありますか?

+0

<>で状態を削除する必要があります。レポート作成者がこの条件を挿入する理由はわかりません。 「索引を避ける」または「自然スキャンを使用する」のチェックマークがあります。これはFirebirdではなく、レポートビルダーの質問です。 –

+0

DDLのみを取得するための条件が含まれており、データはまったくありません。 1 <> 1、1 = 0、常に偽になるものなどがあります。事実、他のデータベースはそれを最適化し、FBは最適化しません。 –

+0

私は参照してください。私はこの文脈でDDL単語の使い方に間違っていました。実際、FirebirdにはPREPAREステージがあり、クエリ実行なしでフィールドとパラメータに関するすべての情報を受け取ることができます。レポートビルダーはそれについて何も知らないと思われます。答えはまだNOですが、Firebirdはこの無駄なクエリを最適化しません。 –

答えて

1

フィルタ条件が負の命題である(また、検索する列を参照するのではなく、別の値と比較する値のみ)ため、Firebirdは(インデックスを使用せずに)完全なテーブルスキャンを行う必要がありますあなたの基準を満たすレコードではないことを確認してください。

あなたは次期バージョン3.0を待つ必要が変更できない場合は、それがBoolean data typeを実施するので、多分クライアントライブラリは、送信する前にこの評価を行います(事前に「定数」の偽の比較を評価するために開始する必要がありますサーバーへのステートメント?)。

関連する問題