Oracle 環境にいくつかのテーブルがあり、新しいインデックスの恩恵を受けることがわかりました。ただし、それらは 1M レジスターから 300M レジスターに及ぶ大きなテーブルであるため、最初にインデックスの作成にかかる時間を見積もろうとします。 、日、週)?
この問題を解決するのに役立つヒューリスティック/オラクル関数/経験則はありますか?
EXPLAIN PLAN
Oracle は、次のコマンドを使用して、インデックスの作成時間とインデックス サイズを見積もることができます。
サンプル スキーマ
--Create a table with 1 million rows.
drop table table1;
create table table1(a number);
insert into table1 select level from dual connect by level <= 1000000;
--Gather statistics.
begin
dbms_stats.gather_table_stats(user, 'table1');
end;
/
--Estimate index creation and size.
explain plan for create index table1_idx on table1(a);
select * from table(dbms_xplan.display);
結果
Plan hash value: 290895522
-------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------------
| 0 | CREATE INDEX STATEMENT | | 1000K| 4882K| 683 (2)| 00:00:10 |
| 1 | INDEX BUILD NON UNIQUE| TABLE1_IDX | | | | |
| 2 | SORT CREATE INDEX | | 1000K| 4882K| | |
| 3 | TABLE ACCESS FULL | TABLE1 | 1000K| 4882K| 254 (5)| 00:00:04 |
-------------------------------------------------------------------------------------
Note
-----
- automatic DOP: skipped because of IO calibrate statistics are missing
- estimated index size: 24M bytes
ノート
私のシステムでの実際の作成時間は、見積もりの 10 秒と比較して 2.5 秒でした。しかし、一桁の見積もりだけを探しているのであれば、それでも十分です。精度は、正確なテーブル統計と優れたシステム統計に依存します。(ただし、システム統計を収集する前に注意してください。多くの実行計画に影響を与える可能性があります!) 手動で変更することにより、設定をさらにいじることができますsys.aux_stats$
。これは、変更しても問題ない数少ない SYS テーブルの 1 つですが、それでも注意が必要です。
マシンの速度、メモリなど、作成時間に影響を与える可能性のある考慮すべき要素が多すぎます。さらに、データ自体の性質が作成時間に大きな影響を与える可能性があります。
私がすることは、大きなテーブルの 1 つを選択し、それにインデックスを作成して、所要時間を確認することです。次に、かかった時間をテーブル内の行数で割ると、予想される大まかな指標が得られます。繰り返しますが、これは正確ではありませんが、使用できる経験則にすぎません。一部のテーブルには列が多く、スパース列の値が少ないなどの理由で大きく異なりますが、これは出発点です。
Ex. It takes 3600 seconds to create a index on table X, which has 3 million rows.
So the metric is 3600 / 3,000,000 = 0.0012 seconds per row.
So if table Y has 8 million rows, you could expect
.0012 * 8,000,000 = 9600 seconds (or 160 minutes) to create the index.