タグ付けされた質問 「execution-plan」

クエリを処理するためにクエリオプティマイザーによって選択された戦略。

4
クエリが昨日よりも突然遅くなるのはなぜですか?
[挨拶] (チェックしてください) [ ] Well trained professional, [ ] Casual reader, [ ] Hapless wanderer, 私は持っています(該当するものすべてをチェックしてください) [ ] query [ ] stored procedure [ ] database thing maybe 正常に実行されていた(該当する場合) [ ] yesterday [ ] in recent memory [ ] at some point しかし、今は突然遅くなっています。 既にブロックされていないこと、および長期にわたるメンテナンスタスク、レポート、またはその他の帯域外プロセスの犠牲になっていないことを確認しました。 問題は何ですか、どうすればよいですか、また、ヘルプを得るためにどのような情報を提供できますか? [*Insert appropriate closing remarks*]

4
インデックスシークとインデックススキャン
実行速度の遅いクエリの実行プランを見ると、ノードの一部がインデックスシークであり、一部がインデックススキャンであることがわかりました。 インデックスシークとインデックススキャンの違いは何ですか? どちらがパフォーマンスが良いですか? SQLはどのように一方を選択しますか? これは3つの質問ですが、最初の質問に答えると他の質問も説明できると思います。

3
過度のソートメモリ許可
なぜこの単純なクエリはそれほど多くのメモリを許可されるのですか? -- Demo table CREATE TABLE dbo.Test ( TID integer IDENTITY NOT NULL, FilterMe integer NOT NULL, SortMe integer NOT NULL, Unused nvarchar(max) NULL, CONSTRAINT PK_dbo_Test_TID PRIMARY KEY CLUSTERED (TID) ); GO -- 100,000 example rows INSERT dbo.Test WITH (TABLOCKX) (FilterMe, SortMe) SELECT TOP (100 * 1000) CHECKSUM(NEWID()) % 1000, …

3
パラメータースニッフィングvs変数vs再コンパイルvs未知の最適化
そのため、今朝(30秒+実行時間)に問題を引き起こす長時間実行中のprocがありました。パラメータスニッフィングが原因かどうかを確認することにしました。そのため、パラメータスニッフィングを無効にするために、procを書き直し、受信パラメータを変数に設定しました。試された/真のアプローチ。バム、クエリ時間が改善されました(1秒未満)。クエリプランを見ると、元のインデックスでは使用されていなかった改善が見つかりました。 誤検知が発生しなかったことを確認するために、元のprocでdbcc freeproccacheを実行し、改善された結果が同じかどうかを確認するために再実行しました。しかし、驚いたことに、元のprocはまだ低速で実行されていました。まだ遅いWITH RECOMPILEを使用して再試行しました(プロシージャの呼び出しと、プロシージャ自体の内部で再コンパイルを試行しました)。サーバーも再起動しました(明らかに開発ボックス)。 だから、私の質問はこれです...空のプランキャッシュで同じスロークエリを取得したときにパラメータスニッフィングがどのように責任を負うことができるか...スニフするパラメータはありませんか? 代わりに、プランキャッシュに関係のないテーブル統計の影響を受けますか。もしそうなら、なぜ受信パラメータを変数に設定すると役立つのでしょうか?? さらなるテストでは、proc DIDの内部にOPTION(OPTIMIZE FOR UNKNOWN)を挿入すると、予想される改善された計画が得られることもわかりました。 それで、私より賢い皆さんの中には、この種の結果を生み出すために舞台裏で何が起こっているのかについての手がかりを与えることができますか? 別の注意事項として、遅いプランもGoodEnoughPlanFound理由により早期に中止されますが、速いプランには実際の計画には早期中止の理由がありません。 要約すれば 受信パラメータから変数を作成する(1秒) 再コンパイル(30秒以上) dbcc freeproccache(30秒以上) オプション(イギリス向けに最適化)(1秒) 更新: こちらのスロー実行プランをご覧ください:https : //www.dropbox.com/s/cmx2lrsea8q8mr6/plan_slow.xml こちらの高速実行プランをご覧ください:https : //www.dropbox.com/s/b28x6a01w7dxsed/plan_fast.xml 注:テーブル、スキーマ、オブジェクト名はセキュリティ上の理由で変更されました。

3
実行計画の基本—ハッシュマッチの混乱
私は実行計画を学び始めており、ハッシュマッチが正確にどのように機能するのか、そして単純な結合でそれが使用される理由について混乱しています: select Posts.Title, Users.DisplayName From Posts JOIN Users on Posts.OwnerUserId = Users.Id OPTION (MAXDOP 1) 私が理解しているように、トップインデックススキャンの結果はハッシュ可能になり、ボトムインデックスクラスタースキャンの各行が検索されます。ハッシュテーブルが少なくともある程度機能することは理解していますが、このような例ではどの値が正確にハッシュされるかについて混乱しています。 私が理にかなっているのは、それらの間の共通フィールドであるidがハッシュされていることですが、もしそうなら、なぜ数値をハッシュするのでしょうか?

2
TOPは実行計画にどのように(そしてなぜ)影響しますか?
最適化しようとしている中程度に複雑なクエリのTOP n場合、句を削除すると実行プランが変更されることに気付きました。クエリにTOP nデータベースエンジンが含まれている場合、TOP句を無視してクエリを実行し、最後にその結果セットを要求されたn行まで縮小するだけだと思いました。グラフィカルな実行計画は、これが事実であることを示しているようです- TOP「最後の」ステップです。しかし、さらに進んでいるようです。 私の質問は、TOP n句がクエリの実行計画にどのように(そしてなぜ)影響するかです。 これは私の場合に起こっていることの単純化されたバージョンです: クエリは、AとBの2つのテーブルの行を照合しています。 TOP句がない場合、オプティマイザは、テーブルAから19k行、テーブルBから46k行があると推定します。返される実際の行数は、Aで16k、Bで13kです。合計69行(ソートが適用されます)。このクエリは非常に高速に発生します。 TOP 1001オプティマイザーを追加するとき、ハッシュ一致を使用しません。代わりに、最初にテーブルAからの結果をソートし(同じ推定値/実際の19k / 16k)、テーブルBに対してネストされたループを実行します。テーブルBの推定行数は1になり、奇妙なことはTOP n、 Bに対する推定実行数(インデックスシーク)-常に2n + 1、または私の場合は2003であるように見えますTOP n。もちろん、これはネストされた結合であるため、実際の実行回数は16k(テーブルAの行数)であり、これによりクエリの速度が低下します。 実際のシナリオはもう少し複雑ですが、これは基本的なアイデア/動作をキャプチャします。両方のテーブルは、インデックスシークを使用して検索されます。これはSQL Server 2008 R2 Enterpriseエディションです。

2
XMLリーダーを使用した計画の最適化
ここからクエリを実行して、デフォルトの拡張イベントセッションからデッドロックイベントを引き出します。 SELECT CAST ( REPLACE ( REPLACE ( XEventData.XEvent.value ('(data/value)[1]', 'varchar(max)'), '<victim-list>', '<deadlock><victim-list>'), '<process-list>', '</victim-list><process-list>') AS XML) AS DeadlockGraph FROM (SELECT CAST (target_data AS XML) AS TargetData FROM sys.dm_xe_session_targets st JOIN sys.dm_xe_sessions s ON s.address = st.event_session_address WHERE [name] = 'system_health') AS Data CROSS APPLY TargetData.nodes ('//RingBufferTarget/event') AS XEventData (XEvent) …

2
再帰共通テーブル式でEXCEPTを使用する
次のクエリが無限行を返すのはなぜですか?EXCEPT句が再帰を終了すると予想していました。 with cte as ( select * from ( values(1),(2),(3),(4),(5) ) v (a) ) ,r as ( select a from cte where a in (1,2,3) union all select a from ( select a from cte except select a from r ) x ) select a from r Stack Overflow に関する質問に答えようとしているときに、私はこれに出会いました。


3
変数をインライン化するときにSQL Serverがより良い実行計画を使用するのはなぜですか?
最適化しようとしているSQLクエリがあります。 DECLARE @Id UNIQUEIDENTIFIER = 'cec094e5-b312-4b13-997a-c91a8c662962' SELECT Id, MIN(SomeTimestamp), MAX(SomeInt) FROM dbo.MyTable WHERE Id = @Id AND SomeBit = 1 GROUP BY Id MyTable 次の2つのインデックスがあります。 CREATE NONCLUSTERED INDEX IX_MyTable_SomeTimestamp_Includes ON dbo.MyTable (SomeTimestamp ASC) INCLUDE(Id, SomeInt) CREATE NONCLUSTERED INDEX IX_MyTable_Id_SomeBit_Includes ON dbo.MyTable (Id, SomeBit) INCLUDE (TotallyUnrelatedTimestamp) 上記のとおりにクエリを実行すると、SQL Serverは最初のインデックスをスキャンします。その結果、189,703の論理読み取りと2〜3秒の時間がかかります。 @Id変数をインライン化してクエリを再度実行すると、SQL Serverは2番目のインデックスを検索します。その結果、論理読み取りは104回だけで、期間は0.001秒(基本的に瞬時)になります。 変数が必要ですが、SQLで適切なプランを使用する必要があります。一時的な解決策として、クエリにインデックスヒントを付けましたが、クエリは基本的に瞬時です。ただし、可能な場合はインデックスヒントから離れるようにします。私は通常、クエリオプティマイザーがその仕事をすることができない場合、何をすべきかを明示的に伝えることなくそれを支援するためにできること(またはやめること)があると思います。 …

1
SQL Server 2014:一貫性のない自己結合カーディナリティの推定値についての説明はありますか?
SQL Server 2014の次のクエリプランを検討してください。 クエリプランでは、自己結合ar.fId = ar.fIdにより1行の推定値が得られます。しかし、これは論理的に矛盾する推定値は、次のとおりar有する20,608行とのちょうど1つの異なる値fId(正確に統計に反映します)。したがって、この結合は行(~424MM行)の完全な外積を生成し、クエリを数時間実行します。 SQL Serverが統計と矛盾していることが非常に簡単に証明できる見積もりを思い付く理由を理解するのに苦労しています。何か案は? 初期調査と追加の詳細 ここでのPaulの回答に基づくと、結合のカーディナリティを推定するためのSQL 2012とSQL 2014の両方のヒューリスティックは、2つの同一のヒストグラムを比較する必要がある状況を簡単に処理できるようです。 トレースフラグ2363からの出力から始めましたが、それを簡単に理解できませんでした。以下は、SQL Serverがためにヒストグラムを比較していることを意味スニペットないfIdとbIdだけその用途に参加の選択を推定するためにfId?もしそうなら、それは明らかに正しくないでしょう。または、トレースフラグの出力を読み間違えていますか? Plan for computation: CSelCalcExpressionComparedToExpression( QCOL: [ar].fId x_cmpEq QCOL: [ar].fId ) Loaded histogram for column QCOL: [ar].bId from stats with id 3 Loaded histogram for column QCOL: [ar].fId from stats with id 1 Selectivity: 0 完全な再現スクリプトに含まれ、このクエリをミリ秒にまで下げるいくつかの回避策を思いついたことに注意してください。この質問は、動作の理解、今後のクエリでの動作の回避方法、およびMicrosoftに提出する必要があるバグかどうかの判断に焦点を当てています。 ここで完全なREPROスクリプトは、ここにあるトレースフラグ2363年からフル出力は、ここであなたがすぐにいっぱいスクリプトを開くことなく、それらを見たい場合はクエリとテーブル定義は次のとおりです。 …

3
永続的な計算列のインデックスには、計算式の列を取得するためのキー検索が必要です
この質問は、データベース管理者のStack Exchangeで回答できるため、Stack Overflowから移行されました。 6年前に移行 。 私は単純に連結された列で構成されているテーブルに永続的な計算列を持っています、例えば CREATE TABLE dbo.T ( ID INT IDENTITY(1, 1) NOT NULL CONSTRAINT PK_T_ID PRIMARY KEY, A VARCHAR(20) NOT NULL, B VARCHAR(20) NOT NULL, C VARCHAR(20) NOT NULL, D DATE NULL, E VARCHAR(20) NULL, Comp AS A + '-' + B + '-' + C PERSISTED …

1
ユーザーにSQL Server SHOWPLAN権限を付与することにリスクはありますか?
この質問は、データベース管理者のStack Exchangeで回答できるため、Stack Overflowから移行されました。 7年前に移行され ました。 私は大規模なSQL Server 2008データベースでパフォーマンスチューニングを行っていますが、ITグループはSHOWPLAN権限を与えたくありません。これまで、「実行計画の表示」は、個々のクエリとプロシージャのパフォーマンスを理解する最も効果的な方法でした。 この許可を与えることにはどのようなリスクが伴いますか?データベースの開発コピーに対するこの制限の正当な正当性はありますか? 注:このSQL ITグループには、単一のSQL Serverインスタンスの下に200以上のデータベースがあります。ありがとう。 回答:以下に示すものを除き、重大なセキュリティリスクがないことを意味するように、応答がないと考えています。基本的に、開発データベースでこれを制限すると逆効果になります。 誰かがより良い答えを思いついた場合、私はこれを更新します。コメントしてくれてありがとう!


1
この定数スキャンと左外部結合は、単純なSELECTクエリプランのどこから来たのですか?
私はこの表を持っています: CREATE TABLE [dbo].[Accounts] ( [AccountId] UNIQUEIDENTIFIER UNIQUE NOT NULL DEFAULT NEWID(), -- WHATEVER other columns ); GO CREATE UNIQUE CLUSTERED INDEX [AccountsIndex] ON [dbo].[Accounts]([AccountId] ASC); GO このクエリ: DECLARE @result UNIQUEIDENTIFIER SELECT @result = AccountId FROM Accounts WHERE AccountId='guid-here' 単一のインデックスシークで構成されるクエリプランで実行します-予想どおり: SELECT <---- Clustered Index Seek このクエリは同じことを行います。 DECLARE @result UNIQUEIDENTIFIER SET …

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.