問題タブ [sql-execution-plan]
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.
sql-server - SQL Server - パラメーターに基づくインライン テーブル値関数の実行プランのバリエーションを回避するにはどうすればよいですか?
状況は次のとおりです:
datetime パラメーターを持つテーブル値関数があります。たとえば、 tdf(p_date) とは言えません。これは、列の日付が p_date より小さい列を選択して約 200 万行をフィルター処理し、他の列の集計値を計算します。
それはうまく機能しますが、p_dateがカスタムスカラー値関数(私の場合は一日の終わりを返す)である場合、実行計画が変更され、クエリの実行時間が1秒から1分になります。
概念実証テーブル - 1,000 製品、2,000,000 行:
インライン テーブル値関数:
スカラー値関数:
クエリ 1 - うまくいっている
実行計画の終了: ストリーム集約コスト 13% <--- クラスタ化インデックス スキャン コスト 86%
クエリ 2 - あまり良くない
実行計画の終了: ストリーム集約コスト 4% <--- フィルター コスト 12% <--- クラスター化インデックス スキャン コスト 86%
sql - 同じストアド プロシージャの異なる実行プラン
実稼働システムでは約 5 秒かかるクエリがありますが、ミラー システム (可能な限り実稼働と同じ) と開発システムでは 1 秒未満かかります。
クエリ プランを確認しましたが、それらが異なることがわかります。また、これらの計画から、一方が他方よりも時間がかかっている理由がわかります。データ、スキーマ、およびサーバーは類似しており、ストアド プロシージャは同一です。
結合を再配置してヒントを追加することで修正する方法はわかっていますが、現時点では、SProc (ペーパーワーク) を変更する必要がない方が簡単です。sp_recompile も試しました。
2 つのクエリ プランの違いの原因は何ですか?
システム: Win2k3 Enterprise 上の SQL 2005 SP2 Enterprise
更新: ご回答ありがとうございます。それは統計であることがわかりました。以下の概要を参照してください。
sql - ストアド プロシージャ実行計画 - データ操作
大量のデータ (この例では約 5m 行) を処理するストアド プロシージャがあります。パフォーマンスは大きく異なります。わずか 15 分でプロセスが実行され、4 時間も実行されたことがわかりました。
メンテナンスのため、およびロジックと処理が正しいことを確認するために、SP をセクションに分割しました。
TRUNCATE
後で自動テスト ツールを使用して検証できる作業テーブル (インデックス付き) にデータを入力します。複数のテーブル (これらの作業テーブルの一部を含む) を結合して、別の作業テーブルを作成します。
最終出力が生成されるまで、1 および/または 2 を繰り返します。
私の懸念は、これが単一の SP であるため、最初の実行時に実行計画を取得することです (でもWITH RECOMPILE
)。ただし、その時点では、作業テーブル (Work スキーマの永続テーブル) は空です。
索引付けスキームに関係なく、実行計画が貧弱になることを懸念しています。
作業テーブルのデータが構築された後に再評価された実行計画を利用できるように、SP を分割し、その中から個別の SP を呼び出すことを検討しています。また、EXEC を使用して動的 SQL を実行することへの言及も見ましたが、これRECOMPILE
も明らかに取得される可能性があります。
私はまだSHOWPLAN
許可を得ようとしているので、かなり盲目的に飛んでいます。
mysql - mysqlは、異なるサーバー、同じクエリ、同じdbで異なる結果を説明します
多くの作業を行った後、私はついにかなり複雑なクエリを取得して、非常にスムーズに動作し、結果を非常に迅速に返しました。
開発とテストの両方でうまく実行されていましたが、現在、テストはかなり遅くなっています。開発で0.06秒かかり、テストでもほぼ同じだったExplainクエリは、テストでは7秒になりました。
説明は少し異なりますが、なぜこれが開発者からの説明になるのかわかりません
とテストで
クエリはまったく同じですが、テーブルの順序は異なります。これが速度低下の原因になりますか?もしそうなら、私はそれをどのように修正しますか?開発者はWindowsであり、テストはcentOsです。どちらも同じバージョンのmysql5.0を実行しており、私が言ったように、テストは完全に実行されており、データベースに構造的な変更を加えていません。
mysqlcheckを実行したところ、すべてのテーブルが正常に戻ってきました。
oracle - クエリ呼び出しごとに Oracle にクエリ プランを再計算させる方法はありますか?
パラメータ化されたクエリがあります。パラメータ値によって、最適なクエリ プランは大きく異なります。問題は次のとおりです。Oracle は、最初のクエリ呼び出しからの計画を後続の呼び出しに使用するため、パフォーマンスが低下します。私は動的 SQL で処理しますが、この方法はエレガントとは言えません。問題は、クエリ プランを再計算する必要があることを Oracle に伝える方法があるかどうかです。
mysql - EXPLAINを使用してMySQLクエリのパフォーマンスを*予測*するにはどうすればよいですか?
私は、大きくて複雑なMySQLデータベースの本質的にフレンドリーな読み取り専用フロントエンドであるプログラムの維持を支援しています-プログラムは、ユーザーの入力からアドホックSELECTクエリを構築し、クエリをDBに送信し、結果を取得します。それらを後処理し、ユーザーに適切に表示します。
構築されたクエリの期待されるパフォーマンスについて、何らかの形の合理的/ヒューリスティックな予測を追加したいと思います-ユーザーが不注意にクエリを実行すると、必然的に非常に長い時間がかかることがあります(膨大な結果セットが返されるため、またはDBのインデックス作成方法の「詳細に反する」)、クエリにかかる時間に関する「ある程度信頼できる」情報/推測をユーザーに表示できるようにしたいと思います。ユーザーがそれを無視することを学ぶ「泣き虫」効果を引き起こすほどひどく頻繁に現実との衝突から抜け出さない限り、それは完璧である必要はありません;-)この情報に基づいて、ユーザーは、コーヒーを飲みに行く(見積もりが5〜10分である場合)、昼食に行く(30〜60分である場合)、
MySQLのEXPLAINステートメントにあまり精通していません-クエリやDBのスキーマ、インデックス作成などを最適化するために使用する方法については多くの情報がありますが、より限定された目的で使用する方法についてはあまり詳しくありません--DBを与えられたものとして、単に予測を行います(もちろん、予測が十分に信頼できる場合は、最終的にはそれらを使用してクエリが取ることができる代替形式から選択するように切り替える可能性がありますが、それは将来のためです:今のところ、上記の目的のために、パフォーマンスの推測値をユーザーに示すだけで十分に満足しています)。
ポインタは...?
mysql - ユニオンクエリでのmysqlの説明
クエリで EXPLAIN を実行した後:
4 つのテーブルの UNION によって構成され、次のようになります。
ユニオンの各コンポーネントを説明すると、型は「INDEX」ですが、ユニオン結果の型は「ALL」です。この動作の理由はどれですか? ありがとう
mysql - 一致する行を削除するより速い方法は?
データベースに関しては、私は比較的初心者です。私たちは MySQL を使用しており、現在、実行に時間がかかると思われる SQL ステートメントを高速化しようとしています。SO で同様の質問を探しましたが、見つかりませんでした。
目標は、テーブル B で一致する ID を持つテーブル A のすべての行を削除することです。
現在、次のことを行っています。
テーブル a には約 100K 行、テーブル b には約 22K 行があります。列「id」は、両方のテーブルの PK です。
このステートメントは、私のテスト ボックス (Pentium D、XP SP3、2GB RAM、MySQL 5.0.67) で実行するのに約 3 分かかります。これは私には遅いようです。そうではないかもしれませんが、私は物事をスピードアップしたいと思っていました。これを達成するためのより良い/より速い方法はありますか?
編集:
役に立つかもしれないいくつかの追加情報。テーブル A と B の構造は、テーブル B を作成するために次の手順を実行した場合と同じです。
テーブル a (およびテーブル b) には、それに対して行われるクエリを高速化するのに役立ついくつかのインデックスがあります。繰り返しますが、私は DB 作業の比較的初心者であり、まだ学習中です。これが物事にどの程度の影響を与えるかはわかりません。インデックスもクリーンアップする必要があるため、効果があると思いますよね?また、速度に影響を与える可能性のある他のDB設定があるかどうかも疑問に思っていました.
また、私はINNO DBを使用しています。
ここに、あなたに役立つかもしれないいくつかの追加情報があります。
テーブル A の構造は次のようになります (これを少しサニタイズしました)。
問題の一部は、このテーブルに多数のインデックスがあることにあると思われます。表 B は表 B と似ていますが、列id
としか含まれていませんh
。
また、プロファイリングの結果は次のとおりです。
解決した
すべての応答とコメントに感謝します。彼らは確かに私にその問題について考えさせました。「a.id を参照する他のテーブルはありますか?」という簡単な質問をすることで、問題を回避できるようにしてくれたdotjoeに感謝します。
問題は、テーブル A に、他の 2 つのテーブル C と D を更新するストアド プロシージャを呼び出す DELETE TRIGGER があったことです。 、それは声明を持っていました、
EXPLAINステートメントを調べて、これを次のように書き直しました。
そのため、これが何をしているのかを見ることができ、次の情報が得られました。
これは、作成するのが骨の折れる操作であり、22500回呼び出されることになるため(削除される特定のデータセットに対して)、それが問題であることがわかりました。その other_id 列に INDEX を作成し、EXPLAIN を再実行すると、次のようになりました。
はるかに良い、実際には本当に素晴らしい.
Index_1 と私の削除時間は、mattkempによって報告された時間と一致していることを追加しました。これは、土壇場でいくつかの追加機能を追加したため、私の側では本当に微妙なエラーでした. ダニエルが述べたように、提案された代替の DELETE/SELECT ステートメントのほとんどは、本質的に同じ時間を要したことが判明しました。私はする必要がありました。この別のテーブル C にインデックスを指定すると、DELETE が高速になりました。
事後分析:
この演習から 2 つの教訓が得られました。まず、SQL クエリの影響をよりよく理解するために、EXPLAIN ステートメントの機能を活用していないことは明らかです。これは初歩的なミスなので、自分を責めるつもりはありません。私はその間違いから学びます。第二に、問題のあるコードは「すぐにやり遂げる」という考え方の結果であり、不適切な設計/テストにより、この問題がすぐに現れなかった. この新しい機能のテスト入力として使用するかなり大きなテスト データ セットをいくつか生成していれば、自分の時間もあなたの時間も無駄にはならなかったでしょう。DB 側での私のテストには、アプリケーション側の深さが欠けていました。今、私はそれを改善する機会を得ました。
sql - Oracle の EXPLAIN PLAN はどの程度正確ですか?
Oracle 10g でクエリのパフォーマンスを客観的に測定する良い方法はありますか? 数日間チューニングしてきた特定のクエリが 1 つあります。(少なくとも最初のテストに基づくと)より高速に動作しているように見えるバージョンを入手しましたが、EXPLAIN のコストはほぼ同じです。
- EXPLAIN コストに何かが欠けている可能性はどれくらいありますか?
- EXPLAIN のコストがクエリの実際のパフォーマンスと著しく異なる特定の状況はありますか?
- このクエリでは first_rows ヒントを使用しました。これは影響がありますか?