2


0

どのインデックスを作成する必要があるかを識別するための提案はありますか?

レポートに使用される約75のストアドプロシージャ(他の人が作成)のパフォーマンスを改善する必要がある状況にあります。 ソリューションの最初の部分は、レポートの大部分に使用される約6つの非正規化テーブルを作成することでした。 テーブルを作成したので、これらのストアドプロシージャのパフォーマンスを最適に向上させるために作成するインデックスを決定するというやっかいなタスクがあります。

インデックスに含めるのが理にかなっている列を見つけるための提案を誰かが持っているかどうか興味がありますか? Profiler / DTAを使用するか、人気のある列を把握するために以下のようなクエリを回避することを考えました。

SELECT name, Count(so.name) as hits, so.xtype
from syscomments as sc
INNER JOIN sysobjects so ON sc.id=so.id
WHERE   sc.text like '%ColumnNamme%'
AND xtype = 'P'
Group by name,so.xtype
ORDER BY hits desc

これらの75個のプロセスを手動で掘り下げる必要がないようにするためのアイデアがあれば教えてください。

また、挿入はこのDBで1日に1回しか実行されないため、挿入のパフォーマンスは私にとって大きな関心事ではありません。

5 Answer


4


_ どのインデックスを作成する必要があるかを識別するための提案はありますか? _

はい! SQL Serverに確認してください。

SQL Serverは、パフォーマンスを向上させるために使用できるインデックスの統計を自動的に保持します。 これはすでにバックグラウンドで行われています。 このリンクを参照してください:+ http://msdn.microsoft.com/en-us/library/ms345417.aspx

次のようなクエリを実行してみてください(msdnから直接取得)。

SELECT mig.*, statement AS table_name,
    column_id, column_name, column_usage
FROM sys.dm_db_missing_index_details AS mid
CROSS APPLY sys.dm_db_missing_index_columns (mid.index_handle)
INNER JOIN sys.dm_db_missing_index_groups AS mig ON mig.index_handle = mid.index_handle
ORDER BY mig.index_group_handle, mig.index_handle, column_id;

注意してください。 私は、人々が欠落しているインデックスビューを福音と見なし、それらを使用して、本当に必要のないインデックスの束を押し出すのを見てきました。 インデックスには、挿入時、更新時、削除時の維持、およびディスク容量とメモリ使用の観点から*コスト*があります。 この情報を実際に正確に使用するには、変更前と変更後の両方でキープロシージャの実際の実行時間をプロファイルし、インデックスの利点(単一または累積)がコストを上回らないようにします。


2


すべてのアクティビティが75のストアドプロシージャからのものであることがわかっている場合は、プロファイラを使用して、どのストアドプロシージャが最も長く、最も呼び出されているかを追跡します。 どれがそれらのprocを調べ、Where句とJOIN ONセクションで最も頻繁に使用されている列を確認したら。 ほとんどの場合、これらは非クラスター化インデックスを配置する列です。 列のセットが頻繁に一緒に使用される場合、グループに対して1つの非クラスター化インデックスを作成する可能性が高くなります。 テーブル(250)に多くの非クラスター化インデックスを設定できますが、おそらくほんの一握り以上を配置したくないでしょう。 データが検索され、同じ列で何度も結合されていることがわかると思います。 80/20の規則を覚えておいてください。 おそらく、作業の最初の20%で速度が80%向上します。 追加したインデックスの速度の向上がほとんどない、つまり停止したい場合があります。


2


私はbechbdに同意します-データベーストラフィックの適切なサンプルを使用して(実際の営業時間中に運用システムでサーバートレースを実行し、最適なスナップショットを取得します)、データベースチューニングアドバイザーにそのサンプリングを分析させます。

私はあなたに同意します-データベースチューニングアドバイザが指示するすべてに*盲目的に*依存しないでください-それは単なる推奨事項ですが、DTAはすべてを考慮することはできません。 確かに-インデックスを追加することでクエリを高速化できますが、挿入と更新を同時に遅くすることができます。

また、何か助けになるかどうかを実際に調べるには、それを実装し、再度測定し、比較する必要があります-これが本当に唯一の信頼できる方法です。 関係する変数と未知数が多すぎます。

そしてもちろん、DTAを使用して1つのクエリを微調整して非常に優れたパフォーマンスを発揮できますが、このクエリが週に1回しか呼び出されないという事実、またはこの1つのクエリを調整してインデックスを追加するという事実を無視する可能性があります。他のクエリを傷つけます。

インデックスチューニングは常にバランス、トレードオフ、および試行錯誤のようなゲームです。必要なものを厳密に決定するための公式とレシピ本を備えた正確な科学ではありません。


1


SSMSでSQL Serverプロファイラーを使用して、テーブルが何をどのように呼び出されているかを確認し、プロファイラーのデータベースチューニングツールを使用して、少なくとも正しいパスを開始できます。 ほとんどのDBAがこれを推奨することで恐ろしいことをおそらく知っていますが、私たちのような非DBAタイプの場合、少なくとも出発点を与えてくれます。


0


これが厳密にレポートデータベースであり、パフォーマンスが必要な場合は、データウェアハウスの設計への移行を検討してください。 スタースキーマまたはスノーフレークスキーマは、レポートに関しては非正規化されたリレーショナルデザインよりも優れています。