問題タブ [cost-based-optimizer]

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.

0 投票する
9 に答える
135033 参照

sql - PostgreSQL-列の最大値を持つ行をフェッチします

time_stamp、usr_id、transaction_id、lives_remainingの列を持つレコードを含むPostgresテーブル(「lives」と呼ばれる)を扱っています。各usr_idの最新のlives_remaining合計を取得するクエリが必要です

  1. 複数のユーザーがいます(個別のusr_id)
  2. time_stampは一意の識別子ではありません。同じtime_stampでユーザーイベント(テーブル内の行ごと)が発生する場合があります。
  3. trans_idは、非常に短い時間範囲でのみ一意です。時間の経過とともに繰り返されます
  4. (特定のユーザーの)remaining_livesは、時間の経過とともに増加および減少する可能性があります

例:

指定された各usr_idの最新データを使用して行の他の列にアクセスする必要があるため、次のような結果を返すクエリが必要です。

前述のように、各usr_idはライフを獲得または喪失する可能性があり、これらのタイムスタンプ付きイベントは非常に接近して発生するため、同じタイムスタンプを持つ場合があります。したがって、このクエリは機能しません。

代わりに、time_stamp(最初)とtrans_id(2番目)の両方を使用して正しい行を識別する必要があります。次に、その情報をサブクエリからメインクエリに渡して、適切な行の他の列のデータを提供する必要があります。これは、私が機能するようになったハッキン​​グされたクエリです。

さて、これは機能しますが、私はそれが好きではありません。クエリ内のクエリ、自己結合が必要です。MAXが最大のタイムスタンプとtrans_idを持っていることがわかった行を取得することで、はるかに簡単になると思います。テーブル「lives」には解析する行が数千万行あるので、このクエリをできるだけ高速かつ効率的にしたいと思います。私は特にRDBMとPostgresを初めて使用するので、適切なインデックスを効果的に使用する必要があることを知っています。最適化する方法に少し迷っています。

私はここで同様の議論を見つけました。Oracle分析関数に相当するある種のPostgresを実行できますか?

集計関数(MAXなど)で使用される関連する列情報へのアクセス、インデックスの作成、およびより適切なクエリの作成に関するアドバイスをいただければ幸いです。

PS以下を使用して、私の例のケースを作成できます。

0 投票する
2 に答える
531 参照

oracle - 実行プランのノードのコストを子よりも低くするにはどうすればよいですか?

実行プランのノードは、その子が実行された後にのみ実行できると常に考えていました。したがって、ノードの合計コストは、子ノードのコスト以上である必要があります。ただし、次の例のように、これが常に当てはまるとは限りません。

6行目と7行目のコストの違いを読み取る正しい方法は何ですか?

0 投票する
6 に答える
320 参照

algorithm - アフィン コストを使用したデカルト リクエストの最適化

文献があるかどうかわからないコスト最適化のリクエストがあります。説明するのが少し難しいので、質問が長くなってしまうことをあらかじめお詫びします。

このように機能する私がアクセスしているサーバーがあります:

  • リクエストはレコード (r1, ...rn) とフィールド (f1, ...fp) に対して行われます
  • デカルト積 (r1, ..., rp) x (f1,...fp) のみを要求できます
  • このようなリクエストに関連するコスト (時間とお金) は、リクエストのサイズに比例します。

T((r1, ..., rn)x(f1, ..., fp) = a + b * n * p

b=1一般性を失うことなく (正規化するだけで)、コストは次のようになると仮定できます。

T((r1, ...,rn)x(f1,...fp)) = a + n * p

  • ユーザーからのリクエストである、ペアのサブセットをリクエストするだけで済み(r1, f(r1)), ... (rk, f(rk))ます。私のプログラムは、ユーザーとサーバー (外部) の間の仲介者として機能します。このようなリクエストがたくさんあります (1 日に数万件)。

グラフィカルに、これを nxp スパース行列と考えることができます。そのために、非ゼロの値を四角形の部分行列でカバーしたいと考えています。

持つ:

  • コストが一定であるため妥当に保たれている部分行列の数
  • すべての「x」は部分行列内にある必要があります
  • 線形コストのため、カバーされる総面積が大きすぎてはなりません

私の問題のスパース係数を g と名付けます (可能なペアの総数に対する必要なペアの数g = k / (n * p). 私は係数を知っていaます .

明らかな観察結果がいくつかあります。

  • a が小さい場合、最善の解決策は各 (レコード、フィールド) ペアを個別に要求することであり、総コストは次のようになります。k * (a + 1) = g * n * p * (a + 1)
  • a が大きい場合、最良の解決策はデカルト積全体を要求することであり、総コストは次のとおりです。a + n * p
  • 2番目のソリューションはすぐに優れていますg > g_min = 1/ (a+1) * (1 + 1 / (n * p))
  • もちろん、デカルト積の順序は重要ではないため、行列の行と列を転置して、より簡単にカバーできるようにすることができます。次に例を示します。

次のように並べ替えることができます

そして、求める最適解がある(f1,f3) x (r1,r3) + (f2) x (r2)

  • 組み合わせ論が爆発するため、すべてのソリューションを試して低コストを探すことは選択肢ではありません。

だから私はおおよその解決策を探しています。私はすでに、マトリックスを指定してカバーを見つけるある種の貪欲なアルゴリズムを持っています(ユニタリセルで始まり、マージ内の空のセルの割合がしきい値を下回っている場合はそれらをマージします)。

いくつかの数字を覚えておくと、私の n は 1 から 1000 の間のどこかで、私の p は 1 から 200 の間のどこかです。レコードは、要求されたフィールドが類似しているクラスにあるため、実際には「ブロック状」です。残念ながら、レコードのクラスにアクセスできません...

質問 1 : アイデア、巧妙な単純化、または有用な論文の参考文献を誰かが持っていますか? 多くのリクエストがあるので、平均してうまく機能するアルゴリズムを探しています (ただし、n と p が大きい場合に行列全体をリクエストするなど、極端なケースではうまく動作しない余裕はありません)。 、そしてリクエストは実際には非常にまばらです)。

質問 2 : 実際、問題はさらに複雑です: コストは実際には次のような形式です: a + n * (p^b) + c * n' * p'、ここで、b は定数 < 1 です (レコードがフィールドを要求されると、他のフィールドを要求するのはそれほどコストがかかりません。フィールド) でn' * p' = n * p * (1 - g)あり、要求したくないセルの数です (それらは無効であり、無効なものを要求するには追加コストがかかるため)。この問題を迅速に解決できるとは夢にも思いませんが、それでも...誰かアイデアはありますか?

0 投票する
2 に答える
5048 参照

performance - 外部キー制約はOracleのクエリ変換に影響しますか?

私はこのような状況にあります:

現在b.a_idは、実際には外部キー参照を意味しますが、a.a_id正式にはそのように宣言されていません。明らかに、それは完全性の理由によるはずです。しかし、外部キー制約は、一般的または特定の場合の結合パフォーマンスも改善しますか?はいの場合、どのタイプのクエリ変換に対してですか?

このトピックに関連するドキュメントはありますか?

Oracle 11g(11.2.0.2.0)を使用しています

0 投票する
1 に答える
7850 参照

oracle - Oracle CBO が「マージ結合デカルト」操作の実行を選択するのはいつですか?

ときどき、オラクルはMERGE JOIN CARTESIAN通常の よりも操作を好むようMERGE JOINです。データを把握し、具体的な実行計画を見ると、結合されたエンティティの 1 つが手元のクエリで正確に 1 つのレコードのみを返すことができるため、通常、この操作は問題にならないことがわかります。

ただし、歴史的な理由から、DBA はデカルト積を一般的に嫌っています。

したがって、私はこれらのケースをよりよく分析し、私の議論で文書化してバックアップしたいと考えています. MERGE JOIN CARTESIANOracle が(または同様の) 操作を好むケースを理解できる、クエリ変換と CBO に関する公式の Oracle ドキュメントはありますか?

この場合、Oracle 11g (11.2.0.2.0) を使用しています。

更新

これらは同様の質問ですが、オラクルが通常よりも好む理由時期を説明していません。MJCMERGE JOIN

0 投票する
1 に答える
599 参照

sql - Oracle to_date() の計画と実行時間の違い

2つのクエリがあります

計画を説明する

2 番目のクエリ

計画を説明する

インデックス ddl

DATE_OF は日付型の列です。MVIEW は分割されていません。

クエリのコストに大きな違いがあるのはなぜですか?

0 投票する
2 に答える
210 参照

sql - 実際には、インデックス付きの (UNIQUE ではない) 列に実際に一意の値が含まれていることを Oracle SQL オプティマイザに納得させる

UNIQUE非インデックスを持つ列を使用するビューを作成しています。ただし、私の見解のコンテキスト内では、列には一意の値のみが含まれると確信しています (WHERE句で課された条件のため)。

実際の問題は、誰かがその列に基づいてビューにクエリを実行したときに発生します (例: SELECT * FROM MY_VIEW WHERE COLUMN_WITH_NON_UNIQUE_INDEX = 'foo')。オプティマイザーは、多くの行を受け取ることになると確信しています (インデックスが技術的にないためUNIQUE)。このため、オプティマイザーはビューの他の場所で他のインデックスを使用することを避け、全テーブル スキャンを優先します (クールではありません)。

インデックスのない列UNIQUEに実際に一意の値が含まれることをオプティマイザに納得させる方法はありますか? 確かに、重複した値が列に忍び込む可能性はありますが、これはバグと見なされ、正当な一意のデータが損なわれることはありません。

残念ながら、私は問題のテーブルを制御できません (ため息)。

0 投票する
1 に答える
115 参照

algorithm - 線形固定点によるスプラインのコストベースの最小化

この問題を写真なしで適切に説明できるかどうか見てみましょう.

速度に直線的に影響する 2 つの変数 a と b があるとします。a が増加すると、速度は直線的に増加し、その逆も同様です。b- が増加すると、速度は直線的に増加し、その逆も同様です。ここで、時間の経過に伴う速度が既に決定されており、v(t) と呼ばれる滑らかなスプラインであるとしましょう。また、与えられた時間 v = f(a,b) であることもわかっています。ここで、f は a と b から v を決定する基本的な線形関数です。最後に、特定の時間のコストと a および b の値を定義するコスト関数 c(a,b,t) があります。

私がやろうとしているのは、各点が特定の時間に a と b を決定するコスト最小化スプラインをプロットすることです。常に f(a,b,t) = v(t) という厳しい条件で、 c(a,b,t) を最小化しようとするソフト条件。これを 2 次元に平面化し、1 つの軸に a を、もう 1 つの軸に b を使用して、特定の時間、厳しい制約を満たすために、ab 平面に線が必要であることがわかります。ただし、その線のどこにポイントを配置する必要があるかは、コスト関数によって異なります。

コスト関数が単純な場合、これは比較的簡単に解決できる問題です。各 t で、コストを最小化するように a と b を決定するだけで済みます。ただし、維持境界でコストが突然変化する可能性があります (たとえば、t >= 5 の場合、a < 0.6 のコストは劇的に増加します)。スプラインでそれを予測して、t = に到達する前に a を増やし始める必要があります。 5、物事を滑らかにするために。

私にとって壊れているのは、私が見つけることができるすべてのスプライン式が n 空間の固定点を必要とすることです。それらはそれらのポイントを通過しないかもしれませんが、それらを必要とします。私の場合、スプラインが [a,b,t] の特定の点を通過する必要はありませんが、特定の t 値の線を通過する必要があります (残りは最小化です)。導関数などを調べて、この問題を基本的なスプラインの問題に単純化する方法はありますか?

この論文では、同様の問題を解決する方法について説明していますが、スプラインが線ではなく点を通る最適なフィットである必要があるようです。http://www.cs.berkeley.edu/~ravir/dspline.pdf

ご協力いただきありがとうございます。