0

いくつかの提案が必要なパフォーマンスの問題が発生しています (Oracle 10g R2 を使用しています)。状況は次のようになります。

1) レガシーシステムです。

2) 一部のテーブルでは、過去 10 年間のデータが保持されています ( は、最初のバージョンが公開されてからデータが削除されていないことを意味します)。現在、ほとんどの OLTP テーブルには、約 30,000,000 ~ 40,000,000 行あります。

3) これらのテーブルでの検索操作には、5 ~ 6 分かかります。( select count(0) from xxxxx where isActive='Y' のような単純なクエリには、約 6 分かかります。) 実行計画を確認すると、isActive 列でインデックス スキャンが行われていることがわかりました。

4) 必要のない古いデータのアーカイブとパージを提案しており、チームはそれに向けて取り組んでいます。5 年分のデータを削除しても、テーブルには約 15,000,000 ~ 20,000,000 行が残っており、それ自体が非常に巨大であるため、これらのテーブルにテーブル ポーションを作成することを考えましたが、ユーザーはほとんどのデータを検索できることがわかりました。これらのテーブルの列を UI から削除するため、テーブルのパーティション化の目的そのものが無効になります。

この状況を改善するために必要な手順は何ですか。

4

2 に答える 2

4

まず第一に、select count(0) from xxxxx where isactive = 'Y'そもそもなぜクエリを発行しているのかを質問してください。10 分の 9 は、レコードの存在を確認するのが面倒な方法です。その場合は、1 行を選択するクエリ (rownum = 1 および first_rows ヒント) に置き換えてください。

あなたが言及する行数は心配する必要はありません。行数が増えたときにアプリケーションのパフォーマンスが低下する場合、システムはスケーリングするように設計されていません。SQL*Trace または ASH を使用して時間がかかりすぎるすべてのクエリを調査し、修正します。

ちなみに、あなたが言及したものは、レガシー、私見という用語を正当化するものではありません。

よろしく、
ロブ。

于 2012-04-18T11:45:34.600 に答える
1

いくつかの観察:

  1. 「isActive」列には「Y」と「N」(またはおそらく「Y」、「N」、および NULL) の 2 つの値があると推測していますが、なぜフレッドの名前には NOT がないのでしょうか。そのような列の NULL 制約は私をエスケープします)。この場合、この列のインデックスの選択性は非常に低くなり、それを使用しない方がよい場合があります。インデックスを削除して、クエリを再実行してみてください。

  2. の使用に関する@RobVanWijkのコメントSELECT COUNT(*)は優れています。本当にカウントが必要な場合にのみ、行カウントを要求してください。カウントが必要ない場合はSELECT whatever FROM wherever WHERE somefield = somevalueSELECT COUNT(*). あなたが引用した場合、次のようなことをした方が良いと思います

BEGIN

  SELECT IS_ACTIVE
    INTO strIsActive
    FROM MY_TABLE
    WHERE IS_ACTIVE = 'Y';

  bActive_records_found := TRUE;
EXCEPTION
  WHEN NO_DATA_FOUND THEN
    bActive_records_found := FALSE;
  WHEN TOO_MANY_ROWS THEN
    bActive_records_found := TRUE;
END;
  1. パーティショニングについて -テーブルがパーティショニングされているフィールドがすべてのクエリで使用されている場合、パーティショニングはクエリ時間を短縮するのに効果的です。たとえば、テーブルが TRANSACTION_DATE 変数でパーティション化されている場合、パーティション化によって違いが生じるようにするには、このテーブルに対するすべてのクエリで WHERE 句に TRANSACTION_DATE テストを含める必要があります。そうしないと、データベースはクエリを満たすために各パーティションを検索する必要があるため、改善が見られるとは思えません。

共有してお楽しみください。

于 2012-04-18T12:01:58.563 に答える