あるインタビューで、実行に時間がかかる場合にクエリを最適化する方法を教えてほしいと頼まれましたSelect * from TableA
。(TableA) は、大量のデータを含む任意のテーブルにすることができます。インタビュアーは、いくつかの列を選択したり、「WHERE」句を使用したりするなどのオプションを私に残さず、対象のクエリの解決策を提供することを望んでいました.
質問する
141 次
2 に答える
10
インタビュアーが何を求めていたのかを知るのは本当に難しいです。
彼らは比較的経験が浅く、次のような予想される回答である可能性があります。
- "* の代わりにすべての列を一覧表示する方が高速です!"; また、
- 「ORDER BY を追加すると、常に高速化されます。」
経験豊富な人が求めているのは、次のようなものです。
- クエリ プランを調べて、追加のリソースを消費する計算列またはその他の同様のものはありますか?
- 要件を再検討してください - ユーザーはテーブル全体を任意の順序で本当に必要としていますか?
- テーブルにクラスター化インデックスがありますか。そうでない場合、ヒープは転送ポインタでいっぱいですか?
- 基になるテーブル (および/またはクエリを満たすために使用されているインデックス) に過度の断片化がありますか?
- クエリはブロックされていますか?
- クエリは何を待っていますか?
- クエリは外部リソースを待機していますか (たとえば、安っぽい I/O サブシステム、メモリ許可、tempdb 自動拡張)
- 統計が古くなっているため、クエリは並列であり、パケット待機に苦しんでいますか?
そのクエリを遅くしている可能性がある、またはそのクエリを悪い選択にしている可能性がある根本的なことがたくさんあります。
于 2012-06-25T17:49:23.507 に答える
0
実際、一部のデータベースには、断片化を減らすためにデータベース テーブルを再構築する最適化コマンドがあり、この方法により、そのようなクエリのパフォーマンスが実際に向上します。
PostgreSQL と SQLite にはコマンドがあります
VACUUM;
MySQL と ORACLE にはコマンドがあります
OPTIMIZE TABLE table;
大量のデータを移動するため、コストがかかります。ただし、そうすることでページのバランスが取れ、通常はデータベースの合計サイズが縮小されます (データベースによっては、この時点でインデックスを追加することを決定する場合があるため、サイズも大きくなる可能性があります)。
データはページ単位で格納されるため、データベースを再構築してページ数を減らすと、ステートメントでもパフォーマンスが向上します。SELECT * FROM table;
于 2013-05-23T14:55:08.830 に答える