0

これは簡単な質問です。大規模なテーブル (500 万行) があり、テーブル全体をスキャンする以外に選択肢がないとします。

SELECT * FROM Table1

データベースが結果をより速く返すようにする方法はありますか?

バックグラウンド:

堅牢で柔軟になるように設計されたサードパーティから提供されたアプリケーションがあります。そのデータベースには非常に少数の大きなテーブルがあります。たとえば、テーブルの 1 つは、すべてのオブジェクトを格納する「オブジェクト」テーブルです。もう 1 つのテーブルは、オブジェクト間のすべての関係を取得する「関係」テーブルです。基本的に、スキーマを変更せずに何でも保存できます。

私の仕事は、別のレポート アプリケーション (このデータベースにクエリを実行するアプリケーション) を設計することです。ライブデータである必要があります。また、テーブルのサイズとクエリの複雑さのために、パフォーマンスの問題があります。

パフォーマンスの問題をどのように処理すればよいのか疑問に思っていました。インデックスの後にインデックスを作成しましたが、クエリは依然として非常に複雑であり、1 日の終わりには、複数のフル テーブル スキャンを行う必要があります。

良いニュースは、私はまだ設計段階にあるということです。何かを見逃した場合に備えて、できるだけ多くの提案を聞きたいと思っています。

4

2 に答える 2

4

テーブル全体のスキャンを改善するには、少なくとも 9 つの方法があります。ただし、データの処理内容によっては、完全なテーブル スキャンを改善しても、必ずしも全体的なパフォーマンスが改善されるとは限りません。たとえば、500 万行がアプリケーションに送信されている場合、ネットワークがボトルネックになり、テーブル全体のスキャンを改善しても役に立ちません。

これらの方法のいくつかは極端で、まれなケースでのみ役立つ場合があり、パフォーマンスがわずかにしか改善されない場合があります。難解なチューニングのアイデアを適用する前に、慎重に検討してください。パフォーマンスが 1% しか向上しないような作業に多くの時間を費やす前に、フル テーブル スキャンがボトルネックであることを確認してください。

  1. 並列 SELECT /*+ PARALLEL */ * FROM Table1;処理 並列処理を使用すると、多くのシステムで全表スキャンのパフォーマンスを簡単に 1 桁向上させることができます。ただし、適切な構成、大きなテーブル サイズ、Enterprise Edition のみなど、多くの制限があります。
  2. DB_FILE_MULTIBLOCK_READ_COUNTこのパラメーターは、一度に読み取られるブロックの数を制御します。全表スキャンの場合、通常は多い方が適切です。このパラメーターは複雑で、しばしば誤解されます。デフォルトに設定されている限り、おそらく最適です。
  3. ハードウェアディスクのパフォーマンスを向上させる方法はたくさんあります。SSD、さまざまな RAID オプション、より高速なディスク、より多くのディスクなど。
  4. SGA の一部であるメモリ、具体的にはバッファ キャッシュの量を増やして、テーブル ブロックのメモリキャッシュを増やします。これは、MEMORY_TARGET または SGA_TARGET のサイズを増やすことを意味する場合があります。
  5. テーブルを縮小するテーブルが読み取り専用の場合は、変更のために保存さPCTFREE 0れる通常の 10% のスペースを節約するために、 に設定します。また、テーブルが過去に大幅に変更された場合は、テーブルがALTER TABLE MY_TABLE MOVE;再編成され、空きスペースが埋められる可能性があります。テーブルの物理サイズを縮小すると、読み取りが速くなる場合があります。
  6. その他のアクティビティを減らすデータベースおよびサーバー上の他のデータベースをチェックして、その他のアクティビティを確認します。他のプロセスがリソースの一部を使い果たしている可能性があります。
  7. 圧縮一部のテーブルは、さまざまな種類の圧縮を使用して大幅に縮小できます。これは、I/O と CPU の間のトレードオフです。通常、データの解凍に費やされる時間は、より多くのブロックを取得するために費やされる余分な時間よりも短くなります。
  8. 均一なエクステント管理自動割り当て (デフォルト) では、わずかなスペースが無駄になる場合があります。小さく均一なサイズを使用すると、わずかなスペースを節約できます。または、テーブルに小さなパーティションが多数ある場合は、大量のスペースが必要になる可能性があります。 CREATE TABLESPACE ... EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M;
  9. ブロック サイズの増加まれに、ブロック サイズを大きくすると、圧縮が改善され、行の連鎖が減少し、使用するブロックのオーバーヘッドが少なくなることがあります。
于 2015-12-12T20:17:14.260 に答える
2

並列ヒントを使用して、並列スレッドを使用してテーブル全体をより高速に読み取ることができます。

SELECT /*+ parallel(t 4) */ * FROM Table1 t;

アイドル状態のデータベースでは、各インスタンスの CPU/コア数まで並列度を定義できます。

于 2015-12-12T01:25:46.443 に答える