問題タブ [b-tree-index]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
postgresql - PostgreSQL の日付範囲がインデックスを正しく使用していない
日付のタイプの user_birthday フィールドを持つ単純なテーブルがあります (NULL 値にすることができます)
そのフィールドには、NOT user_birthday IS NULL のルールで定義されたインデックス (btree) があります。
別のアイデアをフォローアップしようとして、拡張機能を追加しbtree_gist
、次のインデックスを作成しました。
しかし、範囲チェックには使用されていないため、影響はありませんでした。
PostgreSQL のバージョンは 9.3.4.0 (22) Postgres.appで、問題は 9.3.3.0 (21) Postgres.app にも存在します。
次のクエリに興味をそそられました。
クエリ #1:
クエリ #2:
一見すると、どちらも同じ実行計画を持つはずですが、何らかの理由で結果は次のようになります。
クエリ #1:
クエリ #2:
ご覧のとおり、<@ daterange
は既存のインデックスを利用していませんが、利用して
BETWEEN
います。
このルールの実際の使用例は、より複雑なクエリであり、Recheck Cond および Bitmap Heap スキャンにはならないことに注意してください。アプリケーションの複雑なクエリでは、2 つの方法 (120 万レコード) の違いは非常に大きく、クエリ #1 は 415 ミリ秒、クエリ #2 は 84 ミリ秒です。
これは日付範囲のバグですか? 私は何か間違ったことをしていますか?またはdatarange <@
設計どおりに実行されていますか?
pgsql-bugs メーリング リストにも議論があります。
sql - 任意の DBMS での対数時間カウント (*) 範囲クエリ
テーブル T があり、列 C が B ツリーによってインデックス付けされ、定数 k が指定されているとします。次のクエリの結果が n になると仮定します。
MySQL(InnoDB) で、B ツリーによってインデックス付けされた列 C を使用してこのようなクエリを試してみたところ、n の値が大きいほど、クエリが遅くなることがわかりました。大きなテーブル (GB) では、数分も待たなければなりません。したがって、時間の複雑さは n に関して線形であると推測します。しかし、テーブルのサイズに関して対数時間で実行できる B ツリーの内部ノードに関する集計情報を格納するかどうかはわかっています。
対数ソリューションが実装された DBMS や、MySQL でのクエリ時間を短縮するためのトリックを誰か提案してもらえますか?
sql-server-2008 - SQL Server 2008: インデックス内のページ数
インデックスごとのページ数を調査しようとしており、次のクエリを作成しました。
このクエリを実行すると、次の結果が得られます。
このテーブルは次のように作成されました。
100,000 行のランダム データが入力されます。
一意制約用の非クラスター化インデックスと、主キー列用のクラスター化インデックスの 2 つのエントリが表示されることを期待していました。
これらの二重エントリはどういう意味ですか?
apache-spark - Apache Spark を使用して B ツリー インデックスを構築する方法は?
などの数字のセットがあり、を使用してそれらの を1,4,10,23,...
作成したいと思います。形式はレコードごとに 1 行です (「/n」で区切られます)。また、出力ファイルの形式もわかりません。推奨される形式を見つけたいだけですb-tree index
Apache Spark
b-tree
インデックスを作成する通常の方法はhttps://en.wikipedia.org/wiki/B-treeに示されていますが、分散型の並列バージョンをApache Spark
.
さらに、 の Wiki では、B-tree
既存の大規模なデータ コレクションを表す B ツリーを構築する方法が紹介されています ( https://en.wikipedia.org/wiki/B-treeを参照) 。大きなデータセットの場合、並べ替えにはかなりの時間がかかり、限られたメモリでは完了できないと思います。上記の方法はお勧めですか?
javascript - 時間範囲内で有効なオブジェクトの検索リスト
オブジェクトとそれが有効な期間を記述する次のデータ構造があります。以下の数字は UNIX タイムスタンプであると仮定します。
これらのアイテムを JavaScript にすばやく保存し、特定の時点で有効なアイテムを照会できるようにしたいと考えています。
たとえば、2100 で有効なオブジェクトを照会すると、[1234, 1235] が返されます。3999 で有効なオブジェクトを照会すると、[1234] が返され、4999 では何も返されません。
構造内に約 50 ~ 100k のアイテムのサイズがあり、検索速度を速くしたいのですが、挿入と削除は遅くなる可能性があります。
アイテムには重複する valid_from と valid_to の値があるため、重複をサポートする必要があります。項目が重複します。
構造に継続的にデータを挿入する必要があります (おそらく、初期ロードでは一括で挿入し、データの変更に応じて 1 回ずつ更新します)。また、レコードを定期的に変更するので、おそらく削除と挿入を行います。
これに対する最良のアプローチが非常に効率的な方法であるかわかりませんか?
アルゴリズムは私の得意分野ではありませんが、正しいアプローチを知っていれば、アルゴリズム自体を研究できます。
私の考え:
私は当初、重複キーと最も近いルックアップをサポートするように修正されたバイナリ サーチ ツリーを考えていましたが、これでは > valid_from または < valid_to のオブジェクトしかクエリできません。
これには、配列またはツリーを 2 等分してすべての項目 > valid_from を見つけてから、それぞれの項目を手動で valid_to をチェックする必要があります。
2 つの検索ツリー (valid_to と valid_from の 1 つ) を持つことができると思います。次に、結果から重複する ID を確認し、それらの ID を返すことができますか?
これはまだハックのように思えますか?誰かが推奨できるより良いアプローチはありますか、それともこれがどのように行われたかです。
performance - Postgresqlストアド関数の実行が非常に遅い場合がある
PostgreSQL 9.4.4 には、if ステートメントと elsif ステートメントを含むかなり大きな plpgsql 関数があります。すべての if ボディ内には、stable-sql 関数への関数呼び出しがあります。
次の方法で関数を呼び出します。
関数の最初の 4 ~ 5 回は約2.5 秒で非常に高速に実行されますが、その後突然パフォーマンスが急速に低下し、実行に約7.5 秒かかります。連続するすべての呼び出しでそのレベルにとどまります。また、plpgsql 関数を安定していると宣言しようとしましたが、役に立ちませんでした。
内部の安定した SQL 関数の 1 つを直接呼び出すと、実行には常に約 2.5 秒かかります。
これは、rawdata.metricevent テーブルのスキーマです。
eventoccurtime 列に btree インデックスがあります。btree インデックスがない場合、違いはさらに大きく、実行は数秒で終了することもあれば、100 秒以上続くこともあります。
ここで私たちの質問は次のとおりです。それはなぜですか? plpgsql 関数を 5 回目または 6 回目に実行したときに、突然時間がかかるのはなぜですか? ところで、このクエリでは CPU 負荷も非常に高くなります。また、EXPLAIN ANALYZE でクエリを分析したところ、クエリ プランナーは ALWAYS で約 0.034 ミリ秒かかりましたが、クエリの実行は 2.5 秒から 7.5 秒まで異なります。また、2.5 秒または 7.5 秒のいずれかの間にあることもありません。
これらは、可変実行時間を持つ Main-pgpsql 関数と、一定の実行時間を持つ以下の stable-sql 関数です。
よろしく、 トーマス