1

さて、私はSQL言語の知識がほとんどまたはまったくありません。ユニデータで2つのWITHと1つのWITHの速度が遅い理由は何でしょうか。

データベースには約 100 万行あります。

いえ/

SELECT somewhere WITH Column1 = "str" AND WITH Column2 = "Int"5分未満

に比べ

SELECT somewhere WITH Column1 = "str"〜1秒

どこかにインデックスが付けられています(私の知る限り)

私が間違っていることはありますか?

さらに詳しい情報が必要な場合は、質問してください。何を提供すればよいかわかりません。

また、WITH と WHERE の違いは何ですか?

4

2 に答える 2

4

これはSQLではなく、UniQueryです。

わかりやすくするために、ファイル(この場合は)にインデックスを付けることはできませんsomewhere。ファイルの列のみにインデックスを付けることができます。インデックスが作成されているのにColumn1、インデックスが作成されてColumn2いない場合があります。入力しLIST.INDEX somewhereて、インデックスが作成されている列を確認します。

あなたの質問では、Column1での選択とColumn1およびColumn2での選択を比較しただけで、2つの列で選択したために、応答が大幅に遅くなると想定しました。次のテキストは、Column2でのみ選択し、それがどれほど遅いかを確認することでした。

インデックス付け以外にも、応答の違いを説明する理由はたくさんあります。UniDataでは、列は「ディクショナリアイテム」として定義されます。ディクショナリアイテムにはさまざまなタイプがあります。最も基本的なのは、レコード内のフィールドへの直接参照であるDタイプの辞書アイテムです。もう1つのタイプは、派生フィールドであるIまたはVタイプです。派生フィールドは、定数を返すのと同じくらい単純な場合もあれば、別のファイルとJOINを実行するのと同等の方法を実行するのと同じくらい複雑な場合や、何らかの形式の複雑な計算を行う場合もあります。これは、列が異なれば処理にかかる処理量も大幅に異なる可能性があることを理解するのは簡単です。

その他の理由は、列のレコードの深さ(最初のフィールド参照はレコードの後半のフィールドよりも高速になる)、およびSELECTのタイミングに影響を与える可能性のあるクエリキャッシングです。

詳細については、RocketSoftwareのデータベースのマニュアルを確認してください

于 2011-10-17T06:21:20.993 に答える
1

インデックス付きフィールドに対する 1 つの列の SELECT では、データ ファイルのレコードを読み取る必要さえありません。内部を調べると、インデックス ファイルが通常のハッシュ ファイルであることがわかります。単一列の SELECT は、キー "str" を持つインデックス ファイル レコードが読み取られることを意味します。これにより、1 秒以内に何千ものキーが返される可能性があります。

2 番目の列を追加すると、2 番目の列がインデックス化されている場合でも、おそらくシステムは何千ものレコードをすべて読み取る必要があります。これには、かなりの時間がかかります。

一般に、一意の値の数が少ないフィールドのインデックスは、あまり役に立ちません。2 番目の列に多数の可能な値を持つデータが含まれているため、特定のインデックス値ごとのレコード数が少なくなる場合は、使用されるインデックスが 2 番目の列になるように SELECT を配置するのが最善です。確かではありませんが、これを行うには、SELECT ステートメントの列の順序を単純に逆にすることができるかもしれません。そうしないと、2 つの SELECT ステートメントを続けて実行する必要がある場合があります。

例として、ファイルに Column1 = "str" の 600,000 レコードと、Column2 = "int" の 2,000 レコードがあるとします。

>SELECT somewhere WITH Column2 = "int"
>>SELECT somewhere with Column1 = "str"

2,000 レコードを読み取り、ほぼ瞬時に返されます。

Column1 と Column2 の組み合わせが頻繁に SELECT されるものである場合は、2 つを組み合わせた新しい辞書項目を作成し、その上にインデックスを作成することをお勧めします。

そうは言っても、U2 システムが 100 万レコードのファイルを処理するのに 5 分もかからないはずです。ファイルがひどくオーバーフローしている可能性が非常に高く、パフォーマンスを向上させるためにモジュロを大きくしてサイズを変更する必要があります。

于 2011-11-10T02:08:34.090 に答える