-1

MS SQL Server 2014を2016年に実行される別のサーバーに移行することにしました。このデータベースを使用するPHPアプリケーションのパフォーマンスが大幅に低下しました(クエリは1 2秒〜20秒)ですが、スキーマ、構造、データに関してDBは同じです。新しいサーバーのCPU、ディスク、およびメモリのパラメータが高くなっており、作業負荷は通常のものなので、このパフォーマンスの低下は最初は意味がありませんでした。 次に、Profilerでいくつかのクエリを分析したところ、Management Studio(高速、1〜3秒)またはアプリケーションフロントエンド(遅い、15〜25秒)のいずれかでクエリプランが異なることに驚きました。 。 私はこれを見つけましたlinkthisでも、多くを読んでいて別のものを試してみたら、問題を解決できません。誰もこれを前に扱っていますか?深く潜る前に確認すべき素早いものについてのヒント?MSSQLの高速クエリですが、PHPの方が遅い

ありがとうございます!

============

EDIT 1

クエリは、フィルタの値に応じて、わずか数レコードを返しますが、より何か10および1000(決してよりそれは1000を上回っているからです)。 照会されているメインテーブルには100万レコードが含まれていますが、DB全体の重量は約4 GBです。 インデックスが正常に移行された後、再構築および統計が更新されました。私が試したもののうち

EDIT 2

は、すべてのDBのインデックスを再構築し、すべてのDBテーブルの統計情報を更新しています。私はRECOMPILEも数回強制しました(Management Studioのみ)。インデックスヒントを使用して一部のインデックスを強制的に使用しました(Management Studioのみ)。 これらのどれも問題を解決できませんでした。 クエリプランについては、クエリが約20のテーブルに加わり、いくつかのサブクエリがあるため、分析が非常に難しいです。

EDIT 3

だけ明確にする、さまざまな実行計画を生成し、クエリでもパラメータと同一です。つまり、プロファイラトレースがアクティブな間にフロントエンドからクエリを実行し、クエリがキャプチャされます(約20秒かかります)、テキストをコピーして管理スタジオに貼り付け、同じクエリを実行して結果を取得しますちょうど2秒と、別の実行計画です。この種の問題は、依然としてパラメータスニッフィングと関連していますか?

+0

uh、データはどのように見えますか(何百から何千億? ?もしあなたがたくさんのデータを取得してPHPで処理したら、それは遅いです。 –

+0

多くの行を照会する場合は、数秒で行数十億を返す** In-Memory OLTP **を試してください。 https://channel9.msdn.com/Shows/Data-Exposed/SQL-Server-2016-In-memory-OLTP –

+0

試したさまざまなことは何ですか? – GuidoG

答えて

0

データベースのArithAbortプロパティがオフである可能性があります。あなたが盗聴パラメータをチェックする必要があり、高速と低速のものを、それらを比較します。また、http://www.sommarskog.se/query-plan-mysteries.html

は、あなたがそれをチェックして、

declare @value sql_variant 
select @value = SESSIONPROPERTY('ARITHABORT') 
if @value <> 1 
begin 
    USE master 
    ALTER DATABASE [your_database] SET ARITHABORT ON WITH NO_WAIT 
    use your_database 
end 
+0

私はこれをパフォーマンス上の変更なしで試しました:( – Hauri

+0

OK。私は同じ問題を一度も抱えていましたが、これで解決しました。あなた – GuidoG

+0

実際にANSI_NULLSや他のsimilarsのような他の設定パラメータを試してみて、同じCPU時間を得ました:Sありがとうございました – Hauri

0

あなたは、両方の実行計画を抽出する必要があり、この小さなスクリプトでそれを修正することができます参照してください。これらの計画が建設された。 異なるパラメータを持つ同じクエリに対して異なる計画が見つかった場合は、Sommarskogの記事で説明されているように、オプション(再コンパイル)を使用するか、コードの書き換えを検討することができます。 atirhabortまたは他のセッション・オプションを変更しないでください。この場合、異なるプランの原因は、問合せが最適化された異なるパラメータです。異なるセッションオプションを使用すると、新しいプランがビルドされたため、サーバーが異なるパラメータを検出する原因となります。

+0

H私はあなたの答えをありがとう。私はManagement Studioで強制的に再コンパイルする方法を知っていますが、PHPからこれをやるべきかどうかはわかりません。これはあなたが意味することですか? – Hauri

+0

PHPコードにオプション(再コンパイル)を追加できないのはなぜですか? – sepupic

+0

私はパラダイムスニッフィングが根本的な原因であることを拒否するかもしれない何かを明確にするために私の質問を編集しました。あなたはどう思いますか? – Hauri

関連する問題