シナリオベースの問題解決
millions のレコードを持つ users テーブルと last_login_date 列があります。この列でフィルタリングするクエリが遅いです。これをどのように最適化しますか?
回答:
last_login_date 列にインデックスを追加します。例えば:CREATE INDEX idx_last_login_date ON users (last_login_date);。これにより、この日付でフィルタリングまたはソートするクエリが高速化されます。
クリティカルなレポートクエリの実行に時間がかかりすぎてタイムアウトが発生しています。これは 5 つの大きなテーブルを結合しています。この問題を診断し解決するためにどのような手順を踏みますか?
回答:
まず、EXPLAIN ANALYZE を使用してクエリプランを理解し、ボトルネックを特定します。次に、結合列または WHERE 句にインデックスがないか確認します。クエリ自体を最適化することも検討します。例えば、サブクエリを書き換えたり、中間結果に一時テーブルを使用したりします。
アプリケーションでデッドロックが頻繁に発生します。それらを特定し軽減するためのアプローチを説明してください。
回答:
データベースでデッドロックロギングを有効にして、関連するトランザクションやロックされたリソースなどの詳細をキャプチャします。これらのログを分析することで、デッドロックを引き起こす特定のトランザクションシーケンスなどのパターンを特定できます。軽減策としては、一貫したロック順序の確保、トランザクションの短縮、適切な分離レベルの使用が含まれます。
products テーブルには price 列があります。100 万件の製品の価格を 10% 更新する必要があります。テーブル全体を長時間ロックすることなく、これを行う最も効率的な方法は?
回答:
ロック期間と同時実行操作への影響を最小限に抑えるために、バッチで更新を実行します。例えば、ループ内で一度に 10,000 行ずつ更新し、各バッチの後にコミットします。これにより、トランザクションサイズが縮小され、他の操作が続行できるようになります。
新しい機能を設計しており、ユーザーごとに動的で大きく異なる可能性があるユーザー設定を保存する必要があります。リレーショナルデータベースでこれをどのようにモデル化しますか?
回答:
キー・バリューペアのアプローチを使用します。user_id、preference_key、preference_value のような列を持つ user_preferences テーブルです。これにより、スキーマ変更なしで新しい設定に対応できる柔軟性が得られます。あるいは、非常に複雑な構造の場合は、JSONB 列(サポートされている場合)を検討することもできます。
データベースサーバーのディスク容量が、大きなログファイルのために不足しています。この問題に対処するためにどのような手順を踏みますか?
回答:
まず、どのログファイルがスペースを消費しているかと、それらの保持ポリシーを特定します。次に、ログ保持設定を調整してサイズや頻度を減らします。必要に応じて、ログファイルを別のディスクに移動するか、ログのアーカイブ/パージ処理を実装することを検討します。
customers テーブルには first_name と last_name 列があります。顧客をフルネームで頻繁に検索します。この検索をどのように最適化しますか?
回答:
検索が通常 WHERE first_name = 'X' AND last_name = 'Y' の場合、(first_name, last_name) の複合インデックスを作成します。検索が LIKE '%John Doe%' を含む場合、全文検索インデックスまたは、それにインデックスが付いた full_name の生成列の方が効果的です。
古い orders テーブルから、スキーマが異なる新しい sales テーブルにデータを移行する必要があります。アプローチを説明してください。
回答:
ETL(Extract, Transform, Load)プロセスを使用します。まず、orders テーブルからデータを抽出します。次に、sales テーブルのスキーマに合わせてデータを変換し、データ型変換とマッピングを処理します。最後に、変換されたデータを新しい sales テーブルにロードします。理想的には、エラー処理を伴うバッチ処理で行います。
アプリケーションでは、急速に増加している過去の売上データに対して複雑な集計を頻繁に実行します。これらのレポートのパフォーマンスをどのように改善しますか?
回答:
マテリアライズドビューを使用してデータを事前集計することを検討します。これにより、複雑なクエリの結果が保存され、後続の読み取りがはるかに高速になります。マテリアライズドビューは、新しいデータを反映するために定期的に(例えば毎晩)リフレッシュする必要があります。
user_sessions テーブルは、すべてのユーザーのログイン/ログアウトを記録します。これは非常に大きくなっています。アクティブなレポートのために 30 日間のデータのみを保持する必要があります。このテーブルのサイズをどのように管理しますか?
回答:
パーティショニングまたはスケジュールされたクリーンアップジョブを使用して、データ保持ポリシーを実装します。例えば、日付でテーブルをパーティション化し、古いパーティションを削除するか、オフピーク時間中に毎日 DELETE FROM user_sessions WHERE session_date < CURRENT_DATE - INTERVAL '30 days'; ステートメントを実行します。