oracleデータベースインデックスが無効になりました。
2095 ワード
今日同僚が突然私にインデックスが失効した理由を聞きました。実際には、失効の原因はいくつかあります。
ただし、同じsqlであれば、以前にインデックスが使用されていた場合、現在はインデックスが使用されていません。
1.表の増加に伴い、where条件から出るデータが多すぎて、15%以上でインデックスが失効します。
2.統計情報が失効する 統計情報を再収集する必要があります。
3.インデックス自体が無効になります。 インデックスの再構築が必要です
インデックスが使えない理由は以下の通りです。
インデックスが失効しました
1)クエリー条件がない、または照会条件がインデックスを作成していない
2)クエリー条件にガイド列が使用されていません。
3)照会の数は大表の大部分で、30%以上であるべきです。
4)インデックス自体が無効になります。
5)クエリー条件使用関数は、索引の列(12を参照)にあります。
6)小表について調べる
7)ヒントインデックスを使用しない
8)統計データが真実ではない
9)CBOはインデックスを歩くにはあまりにも多くの場合を計算します。実は上の状況も含まれています。ここでは表占有のblockはインデックスより小さいです。
10)暗黙的な変換によりインデックスが失効します。この点は重視されるべきです。また、開発において頻繁に行われるエラーです。テーブルのフィールドtu_のためです。mdnはvarrrhar 2(20)と定義され、
ただし、クエリ時にこのフィールドをnumberタイプとしてOracleにwhere条件で渡すとインデックスが無効になります。
エラーの例:select*from test where tu umdn=13333333;
正しい例:select*from test where tu umdn='1333333333'
11)索引の列を演算すると、インデックスが無効になります。インデックスの列を演算します。など)
エラーの例:select*from test where id-1=9;
正確な例:select*from test where id=10;
12)Oracle内部関数を使用するとインデックスが無効になります。この場合は関数ベースの索引を作成します。
エラーの例:select*from test where round(id)=10;
ここでは、IDのインデックスが機能しなくなりました。まず関数インデックスを作成します。
create index test_id_fbi_idx on test(round(id));
そしてselect*from test where round(id)=10;このとき関数インデックスは1、<>2、単独の>、<、(時には使われますが、できないことがあります)を表します。
3,like"%_"百点は前にあります
4,表は分析していません
5,複合インデックス内の第一位置以外のインデックス列を単独で参照します。
6,文字型フィールドが数値の場合は、where条件に引用符を追加しません。
7,索引の列を演算します。関数インデックスを作成する必要があります。
8,not in,not exist.
9,変数がtimes変数で、テーブルのフィールドがdate変数である場合.または逆の場合。
10,インデックスが無効になります
11,cotコスト分析に基づいて(oracleは全表を歩くとコストがより小さくなります):小さいテーブルを調べたり、戻り値は大体10%以上になります。
12,時にはすべて考慮しましたが、インデックスを取らないで、dropは建設から試してみました。
13,B-tree索引is nullは歩けません。is not nullは歩くことができます。ビットマップ索引is nullはis not nullはいずれも行きます。
14、インデックスis not nullは作成されたインデックス列(先着順なし)に行くと、
in nullはインデックス作成の第一列とともに使用しなければなりません。インデックス作成の第一位置条件がis nullである場合、
他のインデックスを作成する列はis nullとすることができます。
または=1つの値;インデックスを作成する最初の位置が=値である場合、他のインデックス列は、任意の状況(is null=1つの値を含む)であっても良いです。
以上の二つの場合はインデックスが出ます。他の状況は行きません。
ただし、同じsqlであれば、以前にインデックスが使用されていた場合、現在はインデックスが使用されていません。
1.表の増加に伴い、where条件から出るデータが多すぎて、15%以上でインデックスが失効します。
2.統計情報が失効する 統計情報を再収集する必要があります。
3.インデックス自体が無効になります。 インデックスの再構築が必要です
インデックスが使えない理由は以下の通りです。
インデックスが失効しました
1)クエリー条件がない、または照会条件がインデックスを作成していない
2)クエリー条件にガイド列が使用されていません。
3)照会の数は大表の大部分で、30%以上であるべきです。
4)インデックス自体が無効になります。
5)クエリー条件使用関数は、索引の列(12を参照)にあります。
6)小表について調べる
7)ヒントインデックスを使用しない
8)統計データが真実ではない
9)CBOはインデックスを歩くにはあまりにも多くの場合を計算します。実は上の状況も含まれています。ここでは表占有のblockはインデックスより小さいです。
10)暗黙的な変換によりインデックスが失効します。この点は重視されるべきです。また、開発において頻繁に行われるエラーです。テーブルのフィールドtu_のためです。mdnはvarrrhar 2(20)と定義され、
ただし、クエリ時にこのフィールドをnumberタイプとしてOracleにwhere条件で渡すとインデックスが無効になります。
エラーの例:select*from test where tu umdn=13333333;
正しい例:select*from test where tu umdn='1333333333'
11)索引の列を演算すると、インデックスが無効になります。インデックスの列を演算します。など)
エラーの例:select*from test where id-1=9;
正確な例:select*from test where id=10;
12)Oracle内部関数を使用するとインデックスが無効になります。この場合は関数ベースの索引を作成します。
エラーの例:select*from test where round(id)=10;
ここでは、IDのインデックスが機能しなくなりました。まず関数インデックスを作成します。
create index test_id_fbi_idx on test(round(id));
そしてselect*from test where round(id)=10;このとき関数インデックスは1、<>2、単独の>、<、(時には使われますが、できないことがあります)を表します。
3,like"%_"百点は前にあります
4,表は分析していません
5,複合インデックス内の第一位置以外のインデックス列を単独で参照します。
6,文字型フィールドが数値の場合は、where条件に引用符を追加しません。
7,索引の列を演算します。関数インデックスを作成する必要があります。
8,not in,not exist.
9,変数がtimes変数で、テーブルのフィールドがdate変数である場合.または逆の場合。
10,インデックスが無効になります
11,cotコスト分析に基づいて(oracleは全表を歩くとコストがより小さくなります):小さいテーブルを調べたり、戻り値は大体10%以上になります。
12,時にはすべて考慮しましたが、インデックスを取らないで、dropは建設から試してみました。
13,B-tree索引is nullは歩けません。is not nullは歩くことができます。ビットマップ索引is nullはis not nullはいずれも行きます。
14、インデックスis not nullは作成されたインデックス列(先着順なし)に行くと、
in nullはインデックス作成の第一列とともに使用しなければなりません。インデックス作成の第一位置条件がis nullである場合、
他のインデックスを作成する列はis nullとすることができます。
または=1つの値;インデックスを作成する最初の位置が=値である場合、他のインデックス列は、任意の状況(is null=1つの値を含む)であっても良いです。
以上の二つの場合はインデックスが出ます。他の状況は行きません。