2016-05-17 14 views
0

私は非常に複雑なクエリ(レガシープロジェクト)を持つプロジェクトを持っています 多くのクエリやプロジェクト内のストアドプロシージャなどがあります クエリは、 30の結合と低速のフィルタリング。 プロジェクトをすぐに変更することはできません(少なくとも1年間の作業になります)クエリを変更せずにSQLクエリのパフォーマンスを向上させる方法

パフォーマンスを向上させるハードウェアの方法はありますか?速度を上げるためにコンピューティングパワーを強化したスマートなAzureセットアップを使用できますか? 物理サーバーで探す必要があるものは何ですか?

+2

ハードウェア面では、メモリは通常、多くのことができます。適切なインデックス作成も多くの助けになります。しかし、しばしば、何もうまく形成されたクエリを打つことはありません。 – ESG

+0

@ESGそして処理能力。高速なデータアクセス。 – Edu

+1

ハードウェアの改良の他にも、インデックスはクエリを変更せずにクエリのパフォーマンスを向上させるのに役立ちます。しかし、設計が不適切な索引は、問合せにも悪影響を与える可能性があります。 –

答えて

0

ハードウェアアプローチ:マザーボードとディスクコントローラ上の

  • もっとRAMを。
  • 追加のプロセッサー(別のSQL Serverライセンスが必要な場合があります)。
  • 高速ストレージデバイス。
  • データが外部のSANデバイス上にある場合は、より高速な接続タイプ(イーサネット上のiSCSI、ATA対のファイバチャネル(AoEを)、またはHyperSCSI)で、デバイスへの切り替えを検討し
0

あなたがあなたのパフォーマンスを拡張することができますAzureを使用してStandard and Premiumサブスクリプション。だからあなたが遅いクエリを持っている場合は、必要な時にだけそうする利点がある間に、いつもより多くのハードウェアを投げることができます。データベースが自動的に拡大/縮小されるようにデータベースを設定することができます。したがって、デマンドが低い場合はコストを抑え、負荷が高い場合はワークロードに影響を与えません。

AzureはQPIを提供しています。これは、基本的に最も高価なクエリを識別し、最初に最適化できるようにします。

Azureには、index advisorのような異なるアドバイザーが用意されており、データベースの使用方法や作成または削除するためのインデックスのアドバイスがあります。これについての最良のことは、自動的に行うことができることです。

オンデマンドソリューションを考えている場合は、オペレーティングシステムのコストとハードウェアのコストと、これを設定して適切に構成する時間とコストを考慮する必要があります。ジオレプリケート設定を作成すると、別のレベルの複雑さが加わる可能性があります。ですから、新鮮なビジネスを開始する必要がある場合、クラウドサービスが許可されていれば、豊富なテレメトリーとあらゆる種類のスマートデータベース機能を提供しているので、Azureは今後の道のりです(そして、毎月来ています)。またAzureはおよそ毎月更新され、ボックスエディションは半年以上後に累積アップデートパッケージを取得することを忘れないでください。

+0

あなたの答えに感謝します!私は管理ポータルを見て、DTUの消費量は2%で、メモリ消費量も非常に低いことがわかりました。しかし、依然としてクエリは遅いです。索引アドバイザーをオンにしたので、データを収集するまで待つ必要があります。 – user194076

+0

また、統計情報を更新し、保存されたprocsを再コンパイルする必要があります。これにより、より良い計画を立てるのに役立ちます。また、QPIから大打撃を確認することができますか? – Pio

0

ハードウェアは非常に重要です、より速くより速く。 また、パフォーマンスの面でクエリを確認する必要があります。 たとえば、

  1. 実際の実行計画でインデックスが欠落していないかどうかを確認します。存在する場合は、 を追加する必要があります。
  2. 実行計画の読み方を学ぶ&統計。 cpuコスト が重要です。テーブルスキャンは致命的です:)使用しないでください。
  3. インデックスを頻繁に再構築します。
  4. ms-sqlを使用している場合は、テーブルの後に "NOLOCK"プロパティー が必要です。そうでない場合は、読み取り/選択中にテーブルをロックします。

  5. テーブルに参加するときに、参加条件を追加しようとします。ない "where句" 例えば

SELECT * FROM TABLE Aを有する内側が表BのJOIN(NOLOCK)WITH(NOLOCK) ON A.ID = B.ID WHERE B.SOMECOLUMNはNULLされていない

SELECT * FROM TABLE A WITH(NOLOCK)内部テーブルBをJOIN WITH(NOLOCK) ON A.ID = B.ID AND B.SOMECOLUMNはNULLではありません

2番目の方が優れています。

  1. 不要な場合は「ORDER BY」、「DISTINCT」を避けてください。

:)

関連する問題