[TrollModeOn] 問題が発生しました....SQL を使用しないソリューションで解決しようとしましたが、2 つの問題があります [/TrollModeOff]。
私には思われるように、no-sql ソリューションは、非常に多くのフィルターのものを処理するには適していません。私はSQLベースのソリューションから始めます。たとえば、ms sql サーバーがある場合、フィルターにユーザー定義のテーブル型を使用できます。
CREATE TYPE [FilterTable] AS TABLE(
[id] [int] NOT NULL --or any datatype needed
)
その後、次のように、テーブルの種類をパラメータとしてストアド プロシージャのフィルタリングに渡すことができます (または SQL クエリを使用して実行します)。
CREATE PROCEDURE [SomeFilterProcedureName]
@Filter1 FilterTable READONLY,
@Filter2 FilterTable READONLY
....
そして、あなたのクエリは次のようなものになります:
SELECT
field1,
field2,
field3
FROM MyTable t
WHERE
(@Filter1 IS NULL OR t.field1 IN (SELECT id FROM @Filter1))
AND (@Filter2 IS NULL OR t.field2 IN (SELECT id FROM @Filter2))
....
ORDER BY
whatever
したがって、基本的に、パラメーターに値が含まれているかどうかを確認し、含まれている場合は、フィルターパラメーターデータに従って列の値を除外します。
RDBMS は膨大な量のデータの格納、検索、フィルタリング、および並べ替えに優れた作業を行いますが、より高速に動作させるには適切な方法で調整する必要があります。たとえば、インデックスを正しく設定する必要があります。また、一定期間データをキャッシュすることもできますが、さまざまなパラメーターに応じてキャッシュキーを正しく作成してください。
1 秒あたり 200 件のクエリを処理するには db サーバーが十分でない場合は、クラスターを作成するか、同じデータを持つ複数の db サーバーを維持して、ある種の db バランサーを使用することをお勧めします。
更新: 大きすぎてコメントに入れることができません
It the worst case he can select "All" for every 11 filter and we have to sort 192 million records to find 20-100 with the lowest cost
オールフィルター、最低コスト?と同じではありませんか:
Select top(20) * from someTableName order by cost
.
Db Locks
. インデックスとクエリの作業を改善する
Sorting
. フィルターに適合するレコードが 1 億件あります。どのようにそれらを並べ替えるつもりですか? QSort、MergeSort、BubbleSort? それともstackoverflowSort?どのアルゴリズムを選択する必要があるか知っていますか? しかし、最初に - DBMS が知っていて、状況に応じて最適なアルゴリズムを選択します。これは、統計があるためです。次に、もちろん、データはインデックスに事前に並べ替えられて格納されます。したがって、100m レコードの並べ替え操作ごとに、no-sql ソリューションが強制終了されますが、rdbms では完全に機能します
High load
. それは私たちが話していることではありませんか?あなたの場合、実際の高負荷ではありません。毎月 1 億から 1 億 5,000 万人のアクティブ ユーザーを抱え、非常に大きなデータベースを持ち、1 秒あたり数千のクエリを実行している企業があり、rdbms を使用しています。数十台のサーバー、シャーディング、バランシング、そして完璧に機能します。