2015-11-24 9 views
6

私は完全にインデックス作成を始めており、お客様のシステムのスピードを上げたいと考えています。私の組織では間違いを犯し、SQL Server 2000からSQL Server 2008にアップグレードしてから、社内で完全にテストしました。結果として(新しい)サーバーはこれまで以上に遅く実行されています。あなたが想像できるように、これは顧客を困惑させています。各顧客には約1GBのサイズのSQL Serverユーザーデータベースが2つあり、各顧客にはそれぞれ約30名のユーザーがいます。基本的な新しいSQL Serverインデックスを追加すると、さらに問題が発生する可能性がありますか?

私の組織では、現時点で新しいシステムをスピードアップするために何をすべきかを開発者またはDBAに勧めるための現在のリソースはありません。

SQL Serverのデータベースとインデックスについて学習するのに4週間を費やすとすれば、インデックスを追加して違いがあるかどうかを確認することをお勧めしますか?また、インデックスを簡単に削除して、システムを元の状態に戻すことはできますか?それは別に、学習経験ですか?

+4

索引付けの基本的なルール:決定コンテキスト( 'where'、' join'、 'order by'など)で使用されるフィールドは、索引を持つ必要があります。つまり、索引が増えるとオーバーヘッドも増え、ある時点では、余分な索引をすべて保持するだけで十分なオーバーヘッドが浪費され、問合せの効率性が失われる可能性があります。 –

+1

はい - インデックスはしばしば役に立ちます - *** IF ***どのクエリがパフォーマンス上の問題を引き起こしているかを知っていて、どのインデックスが役に立ちますか。だから、**正しい**インデックスを追加できれば、より良いパフォーマンスを得るチャンスは非常に良いですが、*見つけて**正しい**インデックスを決定することは少し難しいかもしれません... –

+1

[SQL Serverインデックス設計ガイド](https://technet.microsoft.com/en-us/library/jj835095(v= sql.110).aspx) –

答えて

0

最初: 最も多くのリソースを消費するクエリを確認します。アクティビティモニタ - 最近の高価なクエリですばやく見ることができます。 詳細を調べると、SQL Server Profilerを使用してトレースすることができます。

第2: 「悪い」クエリがわかっている場合は、次の2つのことができます。 正しいwhereステートメントと結合を使用して、クエリを改善してください。 を使用するか、これらのクエリで使用されるテーブルにインデックスを追加します。

インデックスを追加すると、パフォーマンスが大幅に向上する可能性があります。しかし、データベースファイルのサイズも大きくなります。多くのフィールドをインデックスまたは多くのインデックスに追加すると、そのテーブルのレコードを追加または編集すると、サーバーの速度が低下する可能性があります。

もちろん、インターネットはあなたの親友です。

資源:インデックスと遊ぶ

https://support.microsoft.com/en-us/kb/298475

http://www.sqlshack.com/dba-guide-sql-server-performance-troubleshooting-part-1-problems-performance-metrics/

1

、多くの場合、2つのエッジの剣です。あまりにも多くは良くないし、少なすぎるとどちらもうまくいかない。

ただし、クエリに最も貢献するものを追加することで開始できます。

実行し、このスクリプト

SELECT 
    migs.avg_total_user_cost * (migs.avg_user_impact/100.0) * (migs.user_seeks + migs.user_scans) AS improvement_measure, 
    'CREATE INDEX [missing_index_' + CONVERT (varchar, mig.index_group_handle) + '_' + CONVERT (varchar, mid.index_handle) 
    + '_' + LEFT (PARSENAME(mid.statement, 1), 32) + ']' 
    + ' ON ' + mid.statement 
    + ' (' + ISNULL (mid.equality_columns,'') 
    + CASE WHEN mid.equality_columns IS NOT NULL AND mid.inequality_columns IS NOT NULL THEN ',' ELSE '' END 
    + ISNULL (mid.inequality_columns, '') 
    + ')' 
    + ISNULL (' INCLUDE (' + mid.included_columns + ')', '') AS create_index_statement, 
    migs.*, mid.database_id, mid.[object_id] 
FROM sys.dm_db_missing_index_groups mig 
INNER JOIN sys.dm_db_missing_index_group_stats migs ON migs.group_handle = mig.index_group_handle 
INNER JOIN sys.dm_db_missing_index_details mid ON mig.index_handle = mid.index_handle 
WHERE migs.avg_total_user_cost * (migs.avg_user_impact/100.0) * (migs.user_seeks + migs.user_scans) > 10 
ORDER BY migs.avg_total_user_cost * migs.avg_user_impact * (migs.user_seeks + migs.user_scans) DESC 

(スクリプトはバートダンカンからである)

とは クエリが返すuser_scans、user_seeks、avg_user_impact、last_user_seek、last_user_scan等のような列を解析します索引作成ステートメント。よりユーザーフレンドリーになるようにインデックス名を変更することができます。 すべてのインデックスを実行するのではなく、1つずつ慎重に使用することをお勧めします。

関連する問題