問題タブ [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 - T/SQLの効率と実行順序
SQLでのステートメントの実行順序に関して、次のパフォーマンスの点で違いはありますか?
と:
違いがある場合は、これについてもっと知ることができるリンクなどがありますか?
トンありがとう、
カイル
sql-server - ストアド プロシージャを使用しない場合、SQL Server 2000 で SQL がより速く実行されるのはなぜですか?
実行計画に問題はありませんでした。さらに、私が理解しているように、SQL Server 2000 は、既存の実行プランの T-SQL ステートメントに対して新しい T-SQL ステートメントを認識することにより (すべての SQL ステートメントの実行プランを保持することにより)、ストアド プロシージャのパフォーマンス上の利点の多くをすべての SQL ステートメントに拡張しました。ストアド プロシージャの実行プランだけでなく、プロシージャ キャッシュ)
これは、合理的なテーブル結合、トランザクションが含まれていないか、クエリ内で参照されているリンク サーバーがなく、WITH (NOLOCK) テーブル ヒントが適用されている、かなり単純な SELECT ステートメントです。ストアド プロシージャは dbo によって作成され、ユーザーは必要なすべてのアクセス許可を持っています。
だから私の質問はこれです:
ストアド プロシージャを介して同じ T-SQL を実行すると、クエリの実行に数秒しかかからず、その後数分かかる理由として考えられるものは何ですか?
sql - クエリでフィルタと CONTAINSTABLE を使用する場合の実行計画が不十分
興味深い問題があり、誰かが光を当てるのを手伝ってくれることを望んでいました. 大まかな問題は次のとおりです。
次のクエリはすばやく (1 秒) 実行されます。
ただし、クエリにフィルターを追加すると、返されるまでに約 2 分かかります。
2 つのクエリの実行計画を見ると、2 番目のケースでは、実際の行数と推定行数に大きな違いがある場所が 2 つあります。これらは次のとおりです。
1) FulltextMatch テーブル値関数の場合、見積もりは約 22,000 行で、実際の行は 2,900 万行 (その後、結合前に 1,670 行にフィルター処理されます) および 2) フルテキスト インデックスのインデックス シークの場合、見積もりは 1 行で、実際は 13,000 行です
見積もりの結果、オプティマイザーはネストされたループ結合を使用することを選択しているため (少数の行を想定しているため)、計画は非効率的です。
この問題を回避するには、(a) クエリをパラメータ化して OPTION (OPTIMIZE FOR UNKNOWN) をクエリに追加するか、(b) HASH JOIN の使用を強制します。どちらの場合も、クエリは 1 秒未満で返され、見積もりは妥当に見えます。
私の質問は、「パフォーマンスの低いケースで使用されている推定値が非常に不正確である理由と、それらを改善するために何ができるか」ということです。
ここで使用されているインデックス付きビューのインデックスに関する統計は最新です。
どんな助けでも大歓迎です。
oracle - Oracle: データベース間の実行計画の違い
開発データベースと本番データベースのクエリを比較しています。
どちらも Oracle 9i ですが、ほぼすべてのクエリの実行計画は、データベースによってまったく異なります。
すべてのテーブル/インデックスは同じですが、dev データベースには各テーブルの約 1/10 の行があります。
本番環境では、ほとんどのクエリに対して選択されるクエリ実行プランが開発とは異なり、コストが 1000 倍になることもあります。本番環境でのクエリも、場合によってはクエリに正しいインデックスを使用していないようです (完全なテーブル アクセス)。
私は最近、両方のデータベースで dbms_utility.analyze スキーマを実行しましたが、CBO が何かを解明してくれることを期待しています。
これを引き起こしている可能性のある他の基本的なオラクル構成はありますか?
私は主に開発者であるため、この種の DBA 分析は最初はかなり混乱します..
sql - MySQLでSQLステートメントを記述した後、それらの速度/パフォーマンスを測定する方法は?
「実行計画」の記事から何かを見ました:
(リンク:http ://explainextended.com/2009/09/18/not-in-vs-not-exists-vs-left-join-is-null-mysql/ )
なぜ2つの期間が表示されるのですか?まだ大きなデータセットがない場合はどうなりますか。たとえば、レコードが20、50、または100しかない場合、実際の状況で2つの異なるSQLステートメントの速度を比較して実際に測定することはできません。言い換えると、これら2つの異なるSQLステートメントのパフォーマンスを正確に比較するには、少なくとも数十万のレコード、さらには数百万のレコードが必要ですか?
sql-server-2005 - ストアド プロシージャが一晩で壊れる
MS SQL 2005 を実行していますが、ここ数日、非常に特殊な問題が発生しています。
2 つの proc があり、1 つはデータの時間別レポートを作成します。そしてそれを呼び出し、その結果を一時テーブルに入れ、いくつかの集計を行い、要約を返します。
彼らは元気に働いています...翌朝まで。
翌朝、突然呼び出し元のレポートで、列名が無効であるというエラーが表示されます。
修正は、単に呼び出し元の proc を再コンパイルするだけで、すべてが再び正常に機能します。
これはどのように起こりますか?これらのプロセスを本番環境に移行してから、3 夜連続で発生しました。
編集: 呼び出し元 (要約) プロシージャに必要なのは再コンパイルではないようです。呼び出し先(毎時)のプロシージャを実行することで、問題を解決できました。次に、サマリー プロシージャを実行します。これは以前よりも意味がありません。
EDIT2: 1 時間ごとの proc はかなり大きいので、ここに全体を掲載することはしません。ただし、最後に SELECT INTO を実行し、条件付きで、作成された一時テーブルから適切な結果を返します。
次に、すべての一時テーブルを削除して終了します。
呼び出し元 (概要)
最初に一時テーブル #tmpTodaySales を作成して結果を保存します。列リストは、他のプロシージャの #tmpResults の定義と一致します。その後、1時間ごとのprocを数回呼び出すことになります
失敗するのはこれらの呼び出しだと思います。ただし、proc を再コンパイルするか、これ以外で時間単位の手順を実行してから、概要の proc を呼び出すと、問題が修正されます。
sql-server - DateTime.Now は SQL Server のクエリ プランのキャッシュにどのように影響しますか?
質問:
DateTime.Now
パラメータとして proc に渡すと、SQL Server がクエリ プランをキャッシュできなくなりますか? もしそうなら、ウェブアプリは大幅なパフォーマンスの向上を逃していますか?
考えられる解決策:
DateTime.Today.AddDays(1)
可能な解決策になると思いました。同じ終了日を sql proc に渡します (1 日あたり)。また、ユーザーは引き続き最新のデータを取得できます。こちらもご相談ください。
与えられた例:
ストアド プロシージャがあるとします。Web ページでユーザーにデータを報告します。ユーザーは日付範囲を設定できます。ユーザーが今日のデータを含む「終了日」として今日の日付を設定すると、Web アプリDateTime.Now
は sql プロシージャに渡します。
1 人のユーザーがレポートを何度も実行する5/1/2010
とnow
します。Web ページで、ユーザーには が表示5/1/2010
され5/4/2010
ます。ただし、Web アプリDateTime.Now
は終了日として sql proc に渡します。そのため、ユーザーが同様の日付範囲を照会していても、proc の終了日は常に異なります。
テーブル内のレコード数とユーザー数が多いとします。したがって、パフォーマンスの向上は重要です。したがって、質問の重要性。
proc と実行の例 (理解に役立つ場合):
DateTime.Now を使用した実行例を次に示します。
DateTime.Today.AddDays(1) を使用した実行例を次に示します。
現在の時刻が であるため、両方の proc に対して同じデータが返されます2010-05-04 15:41:27
。
oracle - Oracle EXECUTE IMMEDIATEの変更により、クエリの計画が説明されます
EXECUTEIMMEDIATEを使用して呼び出しているストアドプロシージャがあります。私が直面している問題は、プロシージャを直接呼び出す場合と、EXECUTEIMMEDIATEを使用してプロシージャを呼び出す場合とでExplain計画が異なることです。これにより、実行時間が5倍になります。プラン間の主な違いは、すぐに実行を使用すると、オプティマイザーがサブクエリのネストを解除しないことです(NOT EXISTS条件を使用しています)。ここではほとんどのクエリでルールベースのオプティマイザーを使用していますが、これにはインデックスを使用するためのヒントがあり、CBOが使用されています(ただし、テーブルの統計は収集されません)。Oracle9iEnterpriseEditionリリース9.2.0.4.0-64ビット本番環境を実行しています。
例:高速:
遅い:
クエリ:
良い説明計画:
悪い説明計画:
悪い説明プランでは、サブクエリはネストされていません。サブクエリにno_unnestヒントを追加することで、悪い計画を再現することができました。ただし、(すぐに実行を使用してプロシージャを実行する場合)最も悪いヒントを使用して適切な計画を再現することはできませんでした。他のヒントは、最悪のヒントではなく、即時実行を使用するときにオプティマイザーによって考慮されています。
この問題は、executeimmediateを使用してプロシージャを呼び出す場合にのみ発生します。クエリ自体に対して即時実行を使用する場合は、適切な計画が使用されます。
c# - クエリ実行計画 - Where 句はいつ実行されますか?
私はこのようなクエリを持っています(LINQによって作成されました):
DataFTS は、全文検索テーブル値関数です。クエリ実行プランは次のようになります。
これは、WHERE 句 ([CreatorId] = 1) がTVF (全文検索) の前に実行されるか、全文検索の後に実行されることを意味しますか? TVF は、絞り込まれたデータ セット (WHERE 句によって絞り込まれた) またはテーブル全体を見ていますか?
TVF は次のようになります。
ありがとうございました。
sql-server - 同じクエリ、異なる実行プラン
私を怒らせている問題の解決策を見つけようとしています...
QA サーバーでは非常に高速に実行されるクエリがありますが、本番環境では非常に低速です。実行計画が異なることに気付きました...再コンパイル、実行計画のキャッシュの消去、統計の更新、照合の種類の確認を試みました...しかし、何が起こっているのかまだわかりません...
クエリが実行されているデータベースはまったく同じであり、SQL Server も同じ構成です。
新しいアイデアは大歓迎です。
ありがとう、A.
QA サーバーが SP3 を実行しており、本番環境では SP2 であることに気付きました。これは、この問題に何らかの影響を与える可能性がありますか?