12

他の人のテーブル統計を台無しにするので、一時テーブルを分析するべきではないことを読みました。インデックスはどうですか?プログラムの期間中、テーブルにインデックスを付けた場合、そのテーブルを使用している他のプログラムはそのインデックスの影響を受けますか?

インデックスは私のプロセス、およびテーブルを使用する他のすべてのプロセスに影響しますか?またはそれは私のプロセスだけに影響しますか?

いずれの回答も信頼できるものではなかったため、私は上記の賄賂を提供しています。

4

6 に答える 6

13

インデックスは自分のプロセスと、テーブルを使用する他のすべてのプロセスに影響しますか? またはそれは私のプロセスだけに影響しますか?

GLOBAL TEMPORARYテーブルについて話していると思います。

一時テーブルは、システム ディクショナリに格納されたテンプレートから各プロセスによってその場で作成および削除される複数のテーブルと考えてください

ではOracleDMLtemporary tableすべてのプロセスに影響しますが、テーブルに含まれるデータはそれらを使用する 1 つのプロセスにのみ影響します。

a のデータはtemporary table、セッション スコープ内でのみ表示されます。TEMPORARY TABLESPACEデータと可能なインデックスの両方を格納するために使用します。

DMLfor a temporary table(つまり、列名とインデックスを含むそのレイアウト) は、十分な権限を持つすべてのユーザーに表示されます。

これは、インデックスの存在が、テーブルを使用するプロセスだけでなく、テーブルを使用する他のプロセスにも影響を与えることを意味しtemporary tableます。

逆に、テーブル (およびインデックス) に含まれるデータは、それらを作成したプロセスにのみ影響し、他のプロセスからは見えません。

あるプロセスでインデックスを使用し、別のプロセスでは使用しないようにする場合は、次の手順を実行します。

  • temporary tables同じ列レイアウトで2 つ作成する
  • それらの1つに索引を付けます
  • プロセスに応じて、インデックス付きまたはインデックスなしのテーブルを使用します
于 2009-06-08T10:18:30.247 に答える
9

一時的に作成されてから削除された通常のテーブルだけではなく、真のOracle一時テーブルを参照していると思います。はい、一時テーブルにインデックスを作成しても安全です。これらは、通常のテーブルおよびインデックスと同じ規則に従って使用されます。

[編集] あなたが質問を洗練したように見えますが、これはやや洗練された答えです:

から:

Oracle® Database Administrator's Guide
10g Release 2 (10.2)
Part Number B14231-02

「インデックスは一時テーブルに作成できます。それらも一時的なものであり、インデックス内のデータは、基になるテーブル内のデータと同じセッションまたはトランザクション スコープを持ちます。」

トランザクションのスコープ中に効率的な処理のためにインデックスが必要な場合は、統計にテーブルの行が表示されないため、クエリで明示的にヒントを与える必要があると思います。

于 2009-06-02T18:39:43.850 に答える
6

あなたは、インデックスと統計という 2 つの異なることについて質問しています。インデックスについては、はい、一時テーブルにインデックスを作成できます。それらは通常どおり維持されます。

統計については、テーブルの統計を明示的に設定して、クエリが実行されたときのテーブルの平均サイズを表すことをお勧めします。オラクルにそれ自体で統計を収集させるだけでは、統計プロセスはテーブル内で何も見つけられないため (定義上、テーブル内のデータはトランザクションに対してローカルであるため)、不正確な結果が返されます。

たとえば、次のことができます。

exec dbms_stats.set_table_stats(user, 'my_temp_table', numrows=>10, numblks=>4)

もう 1 つのヒントは、一時テーブルのサイズが大きく異なり、トランザクション内で一時テーブルの行数がわかっている場合、その情報を提供することでオプティマイザーを支援できることです。一時テーブルから通常のテーブルに参加している場合、これは非常に役立ちます。

たとえば、一時テーブルに約 100 行あることがわかっている場合は、次のことができます。

SELECT /*+ CARDINALITY(my_temp_table 100) */ * FROM my_temp_table

于 2009-06-03T04:08:00.180 に答える
2

試してみたところ、インデックスが表示され、2 番目のセッションで使用されました。インデックスが本当に必要な場合は、データ用に新しいグローバル一時テーブルを作成する方が安全です。

また、他のセッションがテーブルにアクセスしている間は、インデックスを作成できません。

私が実行したテストケースは次のとおりです。

--first session
create global temporary table index_test (val number(15))
on commit preserve rows;

create unique index idx_val on index_test(val);

--second session
insert into index_test select rownum from all_tables;
select * from index_test where val=1;
于 2009-06-08T05:31:06.440 に答える
1

動的サンプリング ヒント (10g) も使用できます。

select /*+ DYNAMIC_SAMPLING (3) */ val from index_test where val = 1;

トムに聞くを参照してください

于 2009-06-09T09:42:50.063 に答える