私は最近インタビューに持って、私は質問をしました
私たちは、テーブルを持っていますemployee(id, name)
。そして、我々のJavaコードでは、我々は、このテーブルからデータを取得し、UIに表示するためのロジックを書いています。クエリがあります
Select id,name from employee
クエリは、デバッグ中に、私たちはこのJDBCコールクエリを発射すると、出力が言う20秒を取っているし、我々は5秒を言うか、最適な時間にするために、これを減らしたいもらうことがわかったということでした。どのように我々はあなたがそれを行うことができ、またはどのように私はこの問題に取り組むのでしょうか?
何があるとしてwhere clause
クエリで、私は、インデックスに列を示唆していませんでした。このロジックは、20秒ごとに時間がかかっているようなので、このテーブルのロックを取得し、いくつかの他のコードは問題外もあります。私はテーブルから取り出したレコードの数を制限することを助けるべきであると提案したが、面接は確信見ていません
私たちは、コールを最適化するために、開発者として行うことができます何か他のものがあります。私はこのクエリのパフォーマンスを向上させるための設定DBAかもしれない曲のデータベースを推測するが、他の方法があります
OK、これは面接の質問ですので、問題とソリューションの両方は推測に基づくものです。インタビュアーは、可能な最適化および/またはアプローチを求めています。ここで助けに最も可能性が高いことをいくつか紹介します。
クエリを変更するページのデータを全体ではなく、多くのことをフェッチします。これは、例えばクエリの適用になります。これは単なるされていないことに注意してください「テーブルから選択された行の数を制限する」 ...あなたはそれを言ったときインタビュアーが怪しい見えた理由はおそらくです!
あなたが(例えば合計、平均、ソート、の照合など)全体を選択したレコードセットが、還元型で表示する必要性を行う場合は、クエリではなく、レコードをフェッチし、クライアントにそれをすることによって削減を行います。
チューン
fetchSize()
イワンによって示唆されているように。
ここで助けになりにくいおよび/または大規模な再加工が必要になります他のいくつかのアイデアがあります。
- ネットワークのconfigsを見てください。たとえば、あなたは、OSレベルでのチューニングTCPバッファ、または物理または仮想ネットワークパスを最適化することで、より良いスループットを得ることができるかもしれません。
- (ネットワークのオーバーヘッドを排除するために)データベースサーバ自体にクエリを実行します
- メモリ内テーブルを使用します
- セカンダリデータベースサーバーを照会。例えば、読み取り専用スナップショットまたはスレーブ