質問: filterValue1 ``` 225639行で125ミリ秒かかります。 なぜそんなに遅いのですか? 2つの異なるボックスをテストしました。 もちろん、彼らは何かを変える必要があります、明らかに?
回答: あなたが正確に何をしたいのか、なぜ多くの行をフィルタリングすることが重要なのかを説明しません。データベースで集計を事前に計算できる場合、100万行をどれだけ速くフィルタリングして集計を取得できるかが重要なのはなぜですか。いずれにしても、あなたはその仕事に間違ったツールを使用しているようです。 *一方* 、100万行は、ほとんどのデータベースで少数の行です。適切なインデックスがあれば、クエリは大きな問題にはなりません。クエリ列にインデックスがないか、非インデックス列でアドホッククエリを実行したいのではないでしょうか。 さらに、データスキーマがジョブに対して間違っている場合は、どのデータベースを使用してもかまいません。分析アプリケーションは通常、スタースキーマを使用して、ユーザーが説明するよりもはるかに多くのデータに対してはるかに高速なクエリを実行できます。 分析目的で使用されるすべてのデータベースは、データを好みの形式に変換する必要がある特別なデータ構造を使用します。一般的なリレーショナルデータベースの場合は、キューブと組み合わせてスタースキーマを作成し、集計を事前に計算する必要があります。列データベースは、通常、高速な分析クエリを実現するために圧縮と組み合わせて、列形式でデータを格納しますが、それらを独自の言語でクエリする方法を学ぶ必要があります。これは、ほとんどの人が慣れているSQL言語とはかなり異なる場合があります。 *一方* 、クエリの方法(LINQまたはDataTable.Selectなど)は、パフォーマンスへの影響が最小限です。適切なデータ構造を選択することは、はるかに重要です。 たとえば、Dictionary <>を使用すると、先ほど述べたテクニックを使用するよりもはるかに高速です。辞書は基本的にメモリ内の単一の値をチェックします。インデックスなしでDataTable.Selectを実行し、LINQ to DatasetsまたはObjectsを使用することは、配列またはList <>のすべてのエントリをスキャンして特定の値を探すことと基本的に同じです。 さまざまなLINQプロバイダーはデータベースの役割を果たしません。クエリは最適化されません。彼らはあなたが彼らに実行するように言ったものを実行するだけです。並べ替えられたリストでバイナリ検索を行う場合でも、一般的なLINQプロバイダーを使用するよりも高速です。 何をする必要があるかによって、さまざまなことができます。 * データのスライスとダイスをすばやく行う方法を探している場合は、Excel 2010のPowerPivot機能などの既存の製品を使用してください。PowerPivotは、メモリ内の列形式で何百万もの行を読み込んで圧縮し、データをそのままクエリできます。ピボットテーブルを使用して、メモリ内の他のソースとの結合を定義することもできます。 * より反復可能なプロセスが必要な場合は、リレーショナルデータベースに適切なスタースキーマを作成するか、列データベースを使用できます。どちらの場合でも、適切な構造でデータをロードするためのスクリプトを作成する必要があります。 * 独自のアプリケーションを作成している場合は、他の同様のツールがメモリ内で使用するさまざまなアルゴリズムと構造を実際に調査する必要があります。