1

where次のような潜在的に数千の条件の長い選択クエリを生成する必要があります(table1.a = ? OR table1.a = ? OR ...) AND (table2.b = ? OR table2.b = ? ...) AND....

私は当初、これをより耐えられるようにするためにクラスの構築を開始しましたが、それ以来、これがうまく機能するかどうか疑問に思っています。このクエリは、数千行のテーブルがさらに 2 つ結合された、潜在的に数千万行のテーブルを叩きます。

このことから、多くの懸念が生じています。

1.) これらのステートメントを使用して一時ビューを生成し、既存のコード ベースを簡単に転送できるようにしたかったのです。ここでのポイントは、GUI で選択したパラメーターに基づいて分析のためにダウンしたデータをフィルター処理したいということです。このシナリオでビューは機能しますか?

2.) sqlite は何千ものバインドを持つクエリを解析できますか?

3.) 文字列連結以外に、このクエリを簡単に生成できるフレームワークはありませんか?

4.) すべての WHERE 変数をメモリ内のハッシュ セットにダンプし、クエリが発生するまで取得する DB クエリ オブジェクトのラッパーを作成することで、next()すべての条件が満たされるより良い解決策はありますか? ここでの私の懸念は、アプリケーションがスクロール時に手続き的にグラフを生成するため、x 100,000 を呼び出している間に描画を待機するquery.next()と、迷惑な遅延が発生する可能性があることです。理想的には、すべてを満たす次の行を一度に 30 ミリ秒以上待つ必要はありません。

編集:

新しい問題です。コンパイル時に sqlite3 が 999 個のバインド値 (ホスト パラメーター) に制限されていることに気付きました。

つまり、私が最初に意図したことを達成する唯一の方法は、

1.) 文字列連結を介してクエリ全体を生成します (私の最大の懸念は、sqlite3 内のすべてのデータの解析がどれほど遅くなるかわかりません)。

また

2.) ブランケット クエリ メソッド( select * from * where index > ? limit ?) を実行し、コンパイルされたコードで有効なデータにヒットするまで next() を呼び出します (インデックス変数の更新と繰り返しの再クエリを含む)。

テーブルを「歩く」ことができるように、インデックス>変数と制限を使用してテーブルを歩くQSqlQueryオブジェクトのラッパーを書くことになりました。

4

1 に答える 1

0

フィルターなし (非正規化) の結合結果をフラット ファイルにダンプし、ビットマップ インデックス エンジンである Fastbitを使用してインデックスを作成することを検討してください。

于 2012-08-02T23:09:16.467 に答える