問題タブ [partial-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.
mysql - 部分インデックスまたはフィルター処理されたインデックスのmysqlでの回避策?
私はmysqldbを使用しています。postgresqlとSQLサーバーが部分インデックスをサポートしていることは知っています。私の場合、次のようなことをしたいと思います。
一意の制約を作成したいのですが、特定のテキストの場合は重複を許可する必要があります。
mysqlでこれを行う直接的な方法を見つけることができませんでした。しかし、それを達成するための回避策はありますか?
postgresql - 時間範囲の「1 対多」関係の整合性の問題
次のようなテーブルがあるとします。
このテーブルの目的は、テーブル bar と baz の間に擬似的な「1 対多」の関係を提供することですが、この関係は時間の経過とともに変化する可能性があります。
テーブルの特定の行について、bar
テーブル内の対応する行を見つけたいと考えていますbaz
が、対応する行は期間によって異なる可能性があるため、現在は別の行を返し、先月は別の行を返す必要があります。
私の質問は次のとおりです。このテーブルのデータの整合性を検証する最良の方法は何ですか? 具体的には、特定のタイムスタンプについて、 のテーブルfoo
に1 行しかないことを確認する必要がありますfoo.barid
。私はトリガーを書くことができることを知っています(今ではこれが私の唯一のオプションのようです)が、誰かがもっと簡単なアイデアを持っているのでしょうか? 何らかの部分インデックスを使おうと思っていたのですが、条件の書き方がわかりません...
postgresql - null の非選択的部分インデックス
データベースで興味深い部分インデックスを見つけました。
ご覧のとおり、それは完全に非選択的であり、私見ではまったく役に立ちません。または、何か不足していますか?
mongodb - 部分インデックスの制限は何ですか?
MongoDB の最新バージョン (v3.2) では、部分的な (フィルター処理された) インデックスのサポートが追加されています。インデックスを作成するときにフィルターを指定すると、そのフィルターによって、インデックスで参照されるドキュメントと参照されないドキュメントが決まります。
有効なフィルターである限り、任意のフィルター式を使用できますか? または、使用しているフィルターに制限はありますか? もしそうなら、それらの制限は何ですか?
database - 行のグループごとに列を一意にする制約を追加します
Postgres テーブルには、とstatus
の 2 つの値しかとれない列があります。Active
Inactive
列の 1 つの名前はuserid
です。テーブルには同じ行を複数持つことができますuserid
が、最大でもそのうちの 1 つに を含めることができますstatus = 'Active'
。に従って、1つだけ必要な場合と不要な場合がstatus
ありActive
ますuserid
。この条件で制約を作成するにはどうすればよいですか? Postgres のドキュメントからヘルプが見つかりませんでした。
postgresql - where句に日付を含むpostgreインデックス
Postgresql 9.1 に数百万行の大きなテーブルがあります。列の 1 つはタイム ゾーン付きのタイムスタンプです。
頻繁に使用されるクエリは、where 句'column > (now()::date - 11)'
を使用して過去 10 日間のデータを検索します。
スキャンを制限するために、先月のデータに対してのみ機能するインデックスを作成したいと考えています。部分索引。
これまでのところ、先月の実際の使用方法がわからなかったので、インデックスの開始日として「2015-12-01」をハードコーディングすることから始めました。
これはうまくいき、インデックスが作成されました。残念ながら、::timestamp
クエリは::date
. そのため、インデックスは使用されず、振り出しに戻りました。
次に、列を日付と比較するようにインデックスを変更して、一致するようにしました。しかし、ここで不変の壁にぶち当たります。
to_date
またはcast as date
変更可能な関数であるため、それらはローカルのタイムゾーンに依存しているため、インデックスの作成は失敗します。
次のようなテストテーブルがある場合:
次に、インデックスを作成しようとします
その後、失敗します
これは理解できます。しかし今、特定のタイムゾーンで試してみると
それでも失敗する
これはもうわかりません。タイムゾーンが定義されています。他に何が不変ですか?
私も自分で不変関数を作成しようとしました:
しかし、インデックスでこの関数を使用します:
同じエラーで失敗します:
私はここで途方に暮れています。タイムゾーンだけでなく、ロケールと関係があるのでしょうか?または、他の何かがそれを変更可能にしますか?
また、インデックスを先月または 2 か月のデータに制限する別のより簡単な方法があるでしょうか? Postgres でテーブルを分割するには、データベース全体を再構築する必要がありますが、これまでのところ他に何も見つかりませんでした。
postgresql - PostgreSQL: 部分インデックスの統計?
PostgreSQL バージョン: 9.3.13
次のテーブル、インデックス、およびデータを検討してください。
データ
注文:
(ID、0、1337) * 1000000 行
(ID、10、1337) * 1000 行
(ID、10、777) * 1000 行
orders_appendix:
- 注文ごとに 1 行
私の問題は次のとおりです。
クエリ プランナーは行数を 1000000 と見積もっていましたが、実際の行数は 1000 です。
より複雑な次のクエリでは:
内部結合 (少数の行に適しています) を使用する代わりに、ビットマップ結合 + orders_appendix での完全なテーブル スキャンを選択しますが、これは非常に低速です。
条件が「owner=777」の場合、代わりに望ましい内部結合が選択されます。
AFAIK postgresは各列の統計を個別に収集して考慮することしかできないため、統計のせいだと思います。
しかし、もし私が...
さて、少し変更されたクエリ...
私が望んでいた内部結合になります。
より良い解決策はありますか?おそらく「部分インデックスの統計」ですか?