3

次のようなデータのコレクションがあります。

id   name     c1    c2    c3    c4   ...  c50
-----------------------------------------------
1    string1  0.1   0.32  0.54 -1.2  ...  2.3
2    string2  0.12  0.12 -0.34  2.45 ...  1.3
...
(millions of records)

つまり、id列、文字列列、そして50個の浮動小数点列があります。

このデータに対して実行されるクエリのタイプは、従来のSQLSELECTステートメントでは次のようになります。

SELECT name FROM table WHERE ((a1-c1)+(a2-c2)+(a3-c3)+...+(a50-c50)) > 1;ここでa1,a2,a3,etc、はクエリが送信される前に生成される値です(データテーブルには格納されません)。

私の質問はこれです:どのタイプのデータベースがこのタイプのクエリを最も速く処理するかについて誰かが何かアドバイスがありますか? 使ったことがSQL serverあるので(おおむね遅い)、他の意見を探しています。

このタイプのクエリ用にSQLサーバーを最適化する方法はありますか?また、などの列ストアデータベースにも興味がありますMonetDB。または、などのドキュメントストアデータベースMongoDB。誰か提案はありますか?

どうもありがとう、ブレット

4

4 に答える 4

10

SQL Server を引き続き使用し、すべての値の合計とインデックスを計算する永続化された計算列を使用できます。

ALTER TABLE tablename ADD SumOfAllColumns AS (c1 + c2 + ... + c50) PERSISTED

次に、クエリを次のように再配置できます。

SELECT name FROM tablename WHERE SumOfAllColumns < a1+a2+a3+...+a50 - 1

このクエリは、計算列のインデックスを使用できるため、関連する行をすばやく見つけることができます。

于 2010-12-29T20:07:17.787 に答える
2

SQL Server を使い続けるには:

クエリに同じ計算 (同じフィールド + または - 同じ他のフィールドなど) を常に含める場合は、値が保持された計算列を作成できます。

現在、エンジンは各行に対して複雑な数学的演算を実行しているため、クエリは遅くなります。

結果を含む列を追加すると、すべての計算が 1 回で完了するため、クエリの実行が大幅に高速化されます。

于 2010-12-29T20:07:04.363 に答える
0

インメモリデータベースが最適です。http://hsqldb.org/をご覧ください

あなたが持っている何百万もの行に応じて...

于 2010-12-29T20:05:22.300 に答える
0

クエリ条件は次のように書き換えることができます。

(a1 + a2 + a3 + ... + a50) > 1 + (c1 + c2 + c3 + ... + c50)

c = 1 + c1 + ... + c50データベース側とa = a1 + ... + a50クライアント側で事前計算できます。次に、クエリはになります... WHERE @a > c。これにより、インデックスを使用する機会が開かれます。

ただし、浮動小数点数は、ほとんどのデータベース(SQL Serverを含む)では適切にインデックス付けされません。データについていくつかの仮定を立てることができれば、これを回避できる可能性があります。たとえば、例のように数値が2桁の精度でしか格納されていない場合、すべての数値に100を掛けて整数を取得できます。そうすれば、インデックス作成がうまく機能します。当然のことながら、つまり...条件を満たす行の数によって異なります。「数百万行」の半分はまだ多くの行です。

値の精度が本当に可変であるため、2桁の精度が十分でない場合でも、整数インデックスを作成して、チェックする必要のある行を減らすことが理にかなっている場合があります。クエリは、近似値(インデックスをヒットするため)と正確な値(正確な結果を取得するため)の両方をチェックできます。その場合は、正確な結果が失われないように、元の値が正しい方向に丸められていることを確認してください。

于 2010-12-29T20:45:29.497 に答える