問題タブ [query-planner]

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 投票する
2 に答える
2566 参照

sql - 関数パラメータの任意の要素、PostgreSQL のバグ?

この実装ではバグは見られません。

これはある種の PostgreSQL のバグですか、それとも文書化されていないanyelementデータ型の制限ですか?


興味深い: 句が分離されている場合、このCASE句は正常に機能します。

0 投票する
3 に答える
124 参照

hawq - HAWQ はどのようにクエリ プランをスライスに分割しますか?

HAWQ のクエリ プランは、独立して実行できる複数のスライスに分割できます。HAWQ はどのようにクエリ プランをスライスに分割しますか?

0 投票する
0 に答える
52 参照

postgresql - postgres 開発と本番データベースでプランナーとクエリ時間が異なる

私は奇妙な問題に直面しています。アプリケーションの新しい機能を開発している間、開発環境にそれらをロードする本番データベースのダンプを作成します。開発環境と本番環境で同じクエリを実行しようとすると、2 つの異なるプランが生成され、実際には異なるクエリ時間が返されます。

クエリは次のとおりです。

開発中に起動された次の計画を生成します。

これを計画している間、合計は常に 500 ミリ秒未満で実行されます。

本番環境での実行時間は 1.5 秒を超えています。本番データベースは定期的にバキュームされていることを考慮してください(バキュームを完全に詳細に分析しましたが、何も変更されていません)。

最初にうまくいかないのは、コストの見積もりに関するものだと思います (本番環境で 149898.67 対、開発環境で 41835.73)。本番環境でプランナーを改善するにはどうすればよいですか?

前もって感謝します!

アルベルト

UPDATE ここで、2 つの postgres.conf の違いを見つけることができます。見つかったすべての違いがコメントされていることを考慮してください。したがって、両方の pg がデフォルト値を使用していると思います (これは、コメントされているものだと思います。prod が v9.3.4 を実行している間、dev が v9.5.3 を実行していることにも注意してください)。

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

mysql - SELECT サブクエリを使用した UPDATE は、MySQL 5.7 で非常に遅く実行されます (ただし、5.5 では問題ありませんでした)。

よろしくお願いします。データベースを MySQL 5.5 から 5.7 にアップグレードする際に問題が発生し、完全に困惑しました。アップグレードは mysqldump などを使用して行われたのではなく、いくつかの非常に長い SQL スクリプトを使用して、いくつかのタブで区切られた入力ファイルからの再構築として行われました。特に (ストアド プロシージャ内の) 一見無害なクエリの 1 つが問題を引き起こし、その理由がわかりません。

これはかなり単純に見えますが、このクエリの EXPLAIN は、深刻な行スキャンが行われていることを示しています。

重要なのは行列で、UPDATE の場合は 1198100、SELECT サブクエリの場合は 1200537 のようです。これらの数値はどちらも、両方の参照テーブルの合計行数 (両方とも 1207744) にかなり近い値です。したがって、両方の行スキャンに対して完全な行を実行しているように見えますが、その理由はわかりません。MySQL 5.5 では、まったく同じクエリが正常に機能しました。この解決策が役立つことを期待していましたが、「derived_merge=off」をoptimizer_switchに渡し、サーバーを再起動しても役に立ちませんでした.

私は確かに、このクエリが超高速であるとは思っていません。そうである必要はありません。以前は正確には高速ではありませんでしたが (7200rpm の回転ディスクで数分)、MySQL 5.7 へのアップグレード以降、宇宙の熱による死の前に完了することはないように思われます。長いです。アイデアを持っている人はいますか?クエリの書き換えか、my.ini 設定か、それとも何か?

また、何らかの形でプロトコルに違反した場合、または質問を改善できる場合はお知らせください. 上にも書きましたが、初めての投稿です。

お時間をいただきありがとうございます。

編集:このソリューションは有望に見えると一瞬思いました。どうやら、文字セット/照合順序が異なるテーブルは、互いのインデックスを適切に読み取ることができません。すべてが にあると確信latin1していましたが、確認する価値があると考えました。DEFAULT CHARSET=latin1そのため、すべてのCREATE TABLEステートメントに明示的に追加しCHARACTER SET latin1、ステートメントに追加しましたLOAD DATA INFILE。悲しいことに、変化はありません。

0 投票する
0 に答える
25 参照

database - Planner Postgresql がデータベース内の新しいパーティションを認識しない

プランナーのpostgresqlに問題があります。複数のパーティションを持つテーブルがあり、その後、かなりの数の後続のパーティションを追加しました。メイン テーブルの EXPLAIN は、新しいパーティションを表示しません。メイン テーブルで実行された SELECT では、新しいパーティションに追加されたレコードは表示されません。新しいパーティションで実行された SELECT では、レコードが表示されます。

例えば:

  • テーブル (ID、部品番号、データ)
  • Tabela_part1 (CHECK 部品番号 = 1)
  • Tabela_part2 (CHECK 部品番号 = 2)

...

  • Tabela_part10 (CHECK 部品番号 = 10)

新しいパーティションを追加した後

  • テーブル (ID、部品番号、データ)
  • Tabela_part1 (CHECK 部品番号 = 1)
  • Tabela_part2 (CHECK 部品番号 = 2)

...

  • Tabela_part100 (CHECK 部品番号 = 100)

新しいパーティション Table_part11 の DDL の例:

create table Table_part11 ( CONSTRAINT table_part11_pkey PRIMARY KEY (id), CHECK ( partnumber = 11 ) ) inherits (Table)';

SELECT * FROM Tabela_part11 WHERE id = 1234- 記録を示します。

SELECT * FROM Table WHERE id = 1234- 記録を表示しない

私は試した

  • メインのタブラとパーティションをバキューム/分析する
  • メイン テーブルとパーティションのインデックスの再インデックス

助けてください

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

sql - Oracle 12c Subquery Factoring Inline View の計画が間違っていますか?

11/2更新

追加のトラブルシューティングを行った後、私のチームは、この Oracle のバグを12c、クエリが機能しなくなる前夜にデータベースで行われたパラメーターの変更に直接関連付けることができました。このデータベースに関連付けられたアプリケーションでパフォーマンスの問題が発生した後、私のチームは DBA にOPTIMIZER_FEATURES_ENABLEパラメータを から12.1.02に変更してもらいました11.2.0.4。これにより、問題のアプリケーションのパフォーマンスの問題は修正されましたが、上記のバグが発生しました。確認のために、このパラメーターを変更することで、別の環境で同じ問題を再現できました。私の DBA は、これを確認するために Oracle にチケットを提出しました。

回避策として、期待される結果を取得するためにクエリを少し変更することができました。具体的には、Subquery1withを組み合わせてSubquery2、いくつかの述語を句から the Subquery1(より適切に属する場所) に移動しました。この変更により、実行計画が編集されました (以前にリストされたものよりも効率がわずかに低下します) が、元の問題に対処するには十分でした。WHEREJOIN


元の投稿

まず、この質問が曖昧であることをお詫びしますが、機密の金融システムを扱っているため、特定の実装の詳細を非表示にする必要があります。

バックグラウンド

Oracleかなり前に本番環境に投入したクエリがありますが、最近、 から11gへのアップグレード後に予期した結果が偶然に生成されなくなりました12c。私 (および私のプロダクション サポート チーム) の知る限り、このクエリはその 1 年以上前から問題なく機能していました。

詳細

クエリは非常に複雑であまり効率的ではありませんが、これは主に、正規化されていないテーブル (歴史的にメインフレームをモデルにしたもの) と上流システムからの不十分なデータ入力を扱っているためです。複雑なビジネス状況に対処するために、複数レベルのサブクエリ ファクタリング (WITHステートメント) を活用し、最終的なステートメントで 2 つのインライン ビューを結合しました。複雑な述語をすべて除いたクエリの基本構造は次のとおりです。

私は3つのテーブルを持っていますTable1, Table2, Table3. Table1からのレコードで構成される処理テーブルTable2です。

最後のクエリは非常に基本的なものです。

問題

最後のクエリを編集して 2 番目のインライン ビューを削除し、インライン ビューの出力を評価すると、返された行A0 になります。個々のサブクエリのレコードを手動で評価したところ、これが予期された結果であることを確認できました。

同様に、最後のクエリを編集して「B」インライン ビューのみの出力を生成すると、6 つの行が返されます。繰り返しますが、手動でデータを評価しましたが、これはまさに期待どおりです。

これら 2 つのサブセット (Inline ViewAと Inline View B) を結合すると、最終的なクエリ結果は 0 行になると予想されます (完全なセットと空のセットの間の内部結合では一致が生成されないため)。ただし、上記のように内部結合を使用してクエリ全体を実行すると、1158 行が返されます。

実行計画を確認しましたが、何も思い浮かびません:

実行計画 1 実行計画 2

質問

明らかに、私は Oracle Optimizer を混乱させるために何かを行っており、更新されたクエリ プランは、送信したものとはかなり異なるクエリを引き戻しています。私の最善の推測では、これらの一時的なビューがすべて同じクエリ内に浮かんでいるため、Oracle を混乱させて、依存するセットの前にいくつかのセットを評価してしまったのです。

今日に至るまで、このWITHステートメントに関する公式の Oracle ドキュメントを見つけることができなかったので、サブクエリが評価される順序について完全に確信を持ったことはありませんでした。SO の検索で気付きました (今は見つかりません) 誰かが、因数分解されたサブクエリは別の因数分解されたクエリを参照できないと述べました。これが本当だとは今まで知らなかったのですが、上記の奇妙な出力を見ると、このクエリで運が良かったのではないかと思います。

誰かが私が見ている動作を説明できますか? このクエリ プランで明らかに間違ったことをしようとしていますか? または、11g と 12c の間で何かが変更され、このクエリの動作が変更された理由を説明できる可能性はありますか?

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

sql-server - 推定行数よりも多い実際の行数

実際の行数が推定行数よりも多いのはなぜですか?

テーブルには、次のように定義されたクラスター化された主キーがあります。

ここに画像の説明を入力

列のSTATISTICSを更新しMeasurementDateTime、インデックスも再構築しましたが。


質問:

  • 実際の行数が推定行数より多いのはなぜですか? また、パフォーマンスに影響はありますか?

  • 実際の行数と推定行数を常に取得しようとする必要がありますか? または、実際の行数と推定された行数の変動はどのくらいなのでしょうか?