1つの事後対応型と2つの事前対応型の3種類のチューニングを行います。
リアクティブ
突然、一部のクエリが開始され、問題が発生します。これは、アプリケーションのバグや機能、予想を超えるテーブルの増加、トラフィックの急上昇、またはクエリオプティマイザーが「創造的」になっていることが原因である可能性があります。これは、深夜のサイトのダウンタイプの問題かもしれませんし、重要でない性質のシステムのスローダウンに対応しているかもしれません。いずれにせよ、リアクティブチューニングの特徴は、すでに問題があることです。言うまでもなく、あなたはこれをできる限り少なくしたいと思っています。それは私たちに...をもたらします
積極的
タイプ1:定期メンテナンス
スキーマの変更頻度とデータの成長速度に応じて、数か月または数週間ごとに何らかのスケジュールで、データベースのパフォーマンス分析ツールの出力を確認する必要があります(Oracle DBAのAWRレポートなど)。あなたは、初期の問題を探しています。それは、リアクティブなチューニングを必要とする方法に加えて、すぐに問題を引き起こす可能性が低いが、遠くを防ぐことを期待して少しの努力で改善できるアイテムです。 -将来の問題。これにどれだけの時間を費やすべきかは、あなたがどれだけの時間を費やしているか、そして何に費やすことができるかに依存しますが、最適な量は決してゼロではありません。ただし、次のことを行うことで、必要な金額を簡単に減らすことができます。
タイプ2:適切な設計
「時期尚早の最適化」に対するKnuthの忠告は広く知られており、正当に尊重されています。ただし、「時期尚早」の適切な定義を使用する必要があります。一部のアプリケーション開発者は、独自のクエリの作成を許可された場合、最初にヒットしたクエリを論理的に正しいものとして採用する傾向があり、現在または将来のパフォーマンスにまったく気にしません。または、単に本番環境を代表していない開発データセットに対してテストする場合があります(ヒント:これを行わないでください!開発者は常に、テストのために現実的なデータにアクセスできる必要があります)。重要なのは、クエリを調整する適切なタイミングは、パフォーマンスの低いSQLのリストに表示されるときではなく、最初に展開されるときであり、重大な問題を引き起こすときではないことです。
それでは、DBAの土地での時期尚早な最適化とは何でしょうか?私のリストの一番上にあるのは、実証された必要なしに正規化を犠牲にすることです。実行時に子行から計算するのではなく、親行の合計を維持することはできますが、本当に必要ですか?TwitterまたはAmazonの場合、戦略的な非正規化と事前計算が親友になります。5人のユーザー用の小さなアカウンティングデータベースを設計している場合、データの整合性を促進する適切な構造を最優先する必要があります。他の時期尚早な最適化も同様に優先順位の問題です。0.1秒に短縮できると思っていても、1日に1回実行され、10秒かかるクエリを微調整するのに何時間も費やさないでください。毎日6時間実行されるレポートがあるかもしれませんが、チューニングに時間をかける前に、バッチジョブとしてスケジューリングすることを検討してください。プロダクションの負荷が10%を超えて変動しない場合は、個別のリアルタイムのレプリケートされたレポートインスタンスに投資しないでください(セキュリティを管理できる場合)。
現実的なデータに対してテストし、成長とトラフィックパターン(およびスパイクの許容値)について知識に基づいた推測を行い、プラットフォームのオプティマイザーの癖に関する知識を適用することで、現在だけでなく将来的に最適に(ほぼ)実行されるクエリを展開できます、および理想的でない条件の下で。適切な手法を適用すると、クエリのパフォーマンスを正確に予測および最適化できます(各コンポーネントが必要なだけ高速であるという意味で)。
(そして、あなたがそこにいる間に、統計を学んでください!)