Oracle にはどのようなインデックスがありますか?
Oracle のインデックス タイプには、非一意インデックス、一意インデックス、ビットマップ インデックス、ローカル プレフィックス パーティション インデックス、ローカル非プレフィックス パーティション インデックス、グローバル プレフィックス パーティション インデックス、ハッシュ パーティション インデックス、関数ベースのインデックスが含まれます。テーブルにデータを挿入した後、インデックスを作成する必要があります。一意のインデックスは、「create unique index」ステートメントで作成できます。
このチュートリアルの動作環境: Windows 7 システム、Oracle 11g バージョン、Dell G3 コンピューター。
インデックスとは何ですか?
- #インデックスは、テーブル内のデータへのアクセスを高速化することを目的として、テーブルの 1 つ以上の列に構築される補助オブジェクトです。
- Oracle ストレージ インデックス データ構造は B* ツリー (バランス ツリー) であり、リーフ ノードに異なる B* 番号インデックスがあることを除いて、ビットマップ インデックスにも同じことが当てはまります。
- インデックスは次のように構成されています。上位のインデックス ブロックには下位のインデックス ブロックのインデックス データが含まれ、リーフ ノードにはインデックス データと行の実際の位置を決定する ROWID が含まれます。
インデックスの説明1) インデックスはデータベース オブジェクトの 1 つで、本のインデックスと同様に、データの検索を高速化するために使用されます。データベースにインデックスを作成すると、データベース プログラムが結果をクエリするときに読み取る必要のあるデータの量を減らすことができます。これは、書籍でインデックスを使用すると、本全体を読まなくても必要な情報を見つけることができるのと同様です。インデックスを使用する目的:#2) インデックスはテーブル上に構築されるオプションのオブジェクトです。インデックスの鍵は、デフォルトのフル テーブル スキャンの取得方法をソートされたインデックス キーのセットに置き換えることで、取得効率を向上させます
3) インデックスは、関連するテーブルやデータから論理的および物理的に独立しています。インデックスを作成または削除しても、基本テーブルには影響しません。
#4) インデックスが作成されると、それが実行されます。 DML 操作中 (たとえば、関連操作の挿入、変更、または削除を実行するとき)、Oracle は自動的にインデックスを管理し、インデックスの削除はテーブルには影響しません 5) インデックスは透過的ですテーブルに関係なく、ユーザーに対してインデックスが存在するかどうかにかかわらず、SQL ステートメントの使用法は変わりません6) Oracle は主キーの作成時に列にインデックスを自動的に作成します
クエリ速度の高速化
- I/O 操作の削減
- ディスクの並べ替えを不要にする (インデックスを使用すると並べ替えを高速化できます)
クエリによって返されるレコード数は、並べ替えられたテーブルの場合は 40% 未満、並べ替えられていないテーブルの場合は 7% 未満です。
- テーブルには多くのフラグメントがあります (頻繁に追加と削除が行われます)
非一意インデックス (最も一般的に使用される)
- 一意インデックス
- ビットマップ インデックス
- ローカル接頭辞付きパーティション インデックス
- ローカル非接頭辞付きパーティション インデックス
- グローバル接頭辞付きパーティション インデックス
- ハッシュ パーティション インデックス
- 関数ベースのインデックス
- #インデックス管理のガイドライン
データをテーブルに挿入した後にインデックスを作成する
After SQL*Loader または- import
- ツールを使用してデータを挿入またはロードする場合は、インデックスを作成する方が効率的です。
ソートされた大きなテーブルの 40%、またはソートされていないテーブルの 7% が頻繁に取得されます 行については、インデックスを構築することをお勧めします。テーブルの関連付け、インデックス列は結合に使用されます;
列の値は比較的一意です;- 値の範囲 (大: B* ツリー インデックス、小: ビットマップ インデックス);
- 日付型列は通常、関数ベースのインデックスに適しています。
- #列には多くの null 値があり、インデックス付けには適していません
- パフォーマンスを考慮してインデックス列を配置する
多くの場合、レコードを取得するために複数のフィールドが一緒に使用され、結合されたインデックスは単一のインデックスよりも効率的です。最もよく使用される列を先頭に置きます。例: dx_groupid_serv_id(groupid,serv_id)
、- where
- 条件で groupid
- または # を使用します ##groupid ,serv_id
、クエリはインデックスを使用します。
serv_idフィールドのみが使用される場合、インデックスは無効になります。
不要なインデックスを結合/分割してください。 。
テーブルごとのインデックスの数を制限する
テーブルには数百のインデックスを含めることができます (そうしますか?)。テーブルの挿入と更新を頻繁に行う場合、システム CPU のインデックスが増えるほど、I/O の負担が重くなります。
各テーブルのインデックスは 5 つ以下にすることをお勧めします。
- 不要になったインデックスを削除します
アプリケーション内のクエリはインデックスを使用しません;
- インデックスは必要がありますインデックスを再構築する前に削除する必要がありますが、 alter Index...rebuild を使用してインデックスを再構築する場合は、インデックスを削除する必要はありません。
- インデックス データ ブロック領域の使用量
-
- インデックスを作成するとき、特に主キーを作成するときは、テーブルスペースを明確に指定する必要があります。
- pctfress を適切に設定します。注意: pctused はインデックスに指定できません。
- インデックスのサイズを見積もり、ストレージパラメータを適切に設定します。デフォルトはテーブルスペースのサイズであるか、initial と next が同じサイズに設定されます。
インデックスの並列作成を検討してください
- インデックスの並列作成は、大きなテーブルに使用できます。インデックスを並列作成すると、ストレージ パラメーターが変更されます。プロセスは個別に使用されます。例:
initial
は1M
、並列処理は8
であり、少なくとも8M
インデックスの作成中にスペースが消費されます;
nologging
を使用してインデックスを作成することを検討してください- インデックスを作成するには大規模なテーブルでは、nologging を使用して REDO ログを減らすことができます。
- REDO ログ ファイル領域を節約します。
- インデックスの作成時間を短縮します。
- インデックス作成時のパフォーマンスを向上させます。大きなインデックスを並行して作成します。
最適なインデックスを作成するにはどうすればよいですか?
インデックスを明示的に作成する
create index index_name on table_name(field_name) tablespace tablespace_name pctfree 5 initrans 2 maxtrans 255 storage ( minextents 1 maxextents 16382 pctincrease 0 );
ログイン後にコピー関数ベースのインデックスを作成するインデックス:
UPPER、LOWER、TO_CHAR(date)
および他の関数分類でよく使用されます。例:create index idx_func on emp (UPPER(ename)) tablespace tablespace_name;
ログイン後にコピービットマップ インデックスの作成:
ベースを比較する 小さくて比較的安定したベースを持つ列のインデックスを作成する場合は、最初にビットマップ インデックスを考慮する必要があります。例:
create bitmap index idx_bitm on class (classno) tablespace tablespace_name;
ログイン後にコピー一意のインデックスを明示的に作成する
create unique index
ステートメントを使用して、一意のインデックスを作成できます。例:create unique index dept_unique_idx on dept(dept_no) tablespace idx_1;
ログイン後にコピー制約に関連するインデックスの作成
using インデックスを使用できます。
ステートメント (unique
およびprimary key)
制約に関連するフィールドのインデックスを作成します。例:alter table table_name add constraint PK_primary_keyname primary key (field_name) using index tablespace tablespace_name;
ログイン後にコピーローカル パーティション インデックスの作成方法
- ベース テーブルはパーティション テーブルである必要があります;
- パーティションの数はベース テーブルと同じです;
- 各インデックス パーティションのサブパーティションの数対応するベース テーブル パーティションと同じです。
- ベース テーブルのサブパーティション内の行のインデックス エントリは、インデックスの対応するサブパーティションに格納されます。例:
Create Index TG_CDR04_SERV_ID_IDX On TG_CDR04(SERV_ID) Pctfree 5 Tablespace TBS_AK01_IDX Storage ( MaxExtents 32768 PctIncrease 0 FreeLists 1 FreeList Groups 1 ) local /
ログイン後にコピーレンジ パーティションのグローバル インデックスを作成する方法
基本テーブルには、グローバル テーブルとパーティション テーブルを使用できます。
create index idx_start_date on tg_cdr01(start_date) global partition by range(start_date) (partition p01_idx vlaues less than (‘0106’) partition p01_idx vlaues less than (‘0111’) … partition p01_idx vlaues less than (‘0401’ )) /
ログイン後にコピー既存のインデックスの再構築
既存のインデックスを再構築する現時点では、クエリには影響しません。インデックスを再構築すると、追加のデータ ブロックが削除される可能性があります。
クエリの効率が向上します。インデックス クエリ;alter index idx_name rebuild nologging;
ログイン後にコピーパーティション インデックスの場合:
alter index idx_name rebuild partition partiton_name nologging;
ログイン後にコピーインデックスを削除する理由
- インデックスは不要になりました;
- インデックス関連テーブルをターゲットにしていません。公開されたクエリにより、期待されるパフォーマンスの向上が得られます。
- アプリケーションは、データのクエリにインデックスを使用していません。
- インデックスは無効なので、再構築する前に削除する必要があります。
- インデックスが断片化されすぎているため、再構築する前に削除する必要があります;
- ステートメント:
<br/>dropindex idx_name; <br/>dropindexidx_namedroppartitionpartition_name; <br/>
インデックス確立のコスト
基本テーブルを維持する場合、システムはインデックスを同じ状態に維持する必要があります。不合理なインデックスは、主に CPU と I/O に現れるシステム リソースに深刻な影響を及ぼします。
データの挿入、更新、削除により、大量の
db ファイル シーケンシャル読み取り
ロック待機が生成されます。データが数百万個あり、特定のフィールドにインデックスを追加しましたが、クエリのパフォーマンスが向上しません。主に
oracle## のインデックス制限が原因である可能性があります。 #。
oracle
のインデックスにはいくつかのインデックス制限があります。これらのインデックス制限が発生すると、インデックスが追加されている場合でも、
oracleはフル テーブル スキャンを実行します。クエリのパフォーマンスは、インデックスを作成しない場合と比べて改善されず、データベース内のインデックスを維持するためのシステム オーバーヘッドにより、パフォーマンスが低下する可能性があります。
拡張知識: 一般的なインデックス制限の問題
1. 不等号演算子 (<>, != )# を使用します。 ##次の状況では、列
dept_idにインデックスがある場合でも、クエリ ステートメントは依然としてテーブル全体のスキャンを実行します
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>select * from dept where staff_num <> 1000;</pre><div class="contentsignin">ログイン後にコピー</div></div>
ただし、これは実際に必要です開発クエリでは、問題の解決策はありませんか? ######持っている!不等号をクエリ構文の または に置き換えることで、インデックスを使用してテーブル全体のスキャンを回避できます。上記のステートメントを次のように変更すると、インデックスを使用できるようになります。
2. is null または is not nullselect * from dept shere staff_num < 1000 or dept_id > 1000;
ログイン後にコピーis null または
is nuo nullの使用も制限されますデータベースでは
null
値が定義されていないため、インデックスを使用します。インデックス付きの列に多くの null がある場合、インデックスは使用されません (インデックスがビットマップ インデックスでない限り、これについては今後のブログ記事で詳しく説明します)。 SQL ステートメントでnull
を使用すると、多くの問題が発生します。この問題を解決する方法は、テーブルの作成時に、インデックスを付ける必要がある列を非 null (
not null
)として定義することです。 3. 関数を使用します
関数ベースのインデックスが使用されていない場合、where 句のインデックス付き列で関数を使用すると、オプティマイザはこれらのインデックスを無視します。次のクエリではインデックスは使用されません:
select * from staff where trunc(birthdate) = '01-MAY-82';
ログイン後にコピー但是把函数应用在条件上,索引是可以生效的,把上面的语句改成下面的语句,就可以通过索引进行查找。
select * from staff where birthdate < (to_date('01-MAY-82') + 0.9999);
ログイン後にコピー4、比较不匹配的数据类型
比较不匹配的数据类型也是难于发现的性能问题之一。下面的例子中,
dept_id
是一个varchar2
型的字段,在这个字段上有索引,但是下面的语句会执行全表扫描。select * from dept where dept_id = 900198;
ログイン後にコピー这是因为
oracle
会自动把where
子句转换成to_number(dept_id)=900198
,就是3所说的情况,这样就限制了索引的使用。把SQL语句改为如下形式就可以使用索引select * from dept where dept_id = '900198';
ログイン後にコピー5、使用like子句
使用like子句查询时,数据需要把所有的记录都遍历来进行判断,索引不能发挥作用,这种情况也要尽量避免。
Like
的字符串中第一个字符如果是‘%’
则用不到索引Column1 like ‘aaa%’ 是可以的 Column1 like ‘%aaa%’用不到
ログイン後にコピー6、使用IN
尽管
In
写法要比exists
简单一些,exists
一般来说性能要比In要高的多用
In
还是用Exists
的时机当in的集合比较小的时候,或者用
Exists
无法用到选择性高的索引的时候,用In要好,否则就要用Exists
例:select count(*) from person_info where xb in (select xb_id from dic_sex); Select count(*) from n_acntbasic a where shbxdjm =:a and exists(select 1 from person_info where pid=a.pid and …); Select * from person_info where zjhm=3101….;--将会对person_info全表扫描 Select * from person_info where zjhm =‘3101…’;--才能用到索引
ログイン後にコピー假定TEST表的
dt
字段是date
类型的并且对dt
建了索引。
如果要查‘20041010’
一天的数据.下面的方法用不到索引Select * from test where to_char(dt,’yyyymmdd’) =‘20041010’;
ログイン後にコピー而以下将会用到索引。
select * from test where dt >=to_date(‘20041010’,’yyyymmdd’) and dt < to_date(‘20041010’,’yyyymmdd’) + 1
ログイン後にコピー7、如果能不用到排序,则尽量避免排序。
用到排序的情况有
集合操作。Union ,minus ,intersect
等,注:union all
是不排序的。Order byGroup byDistinctIn
ログイン後にコピー有时候也会用到排序
确实要排序的时候也尽量要排序小数据量,尽量让排序在内存中执行,有文章说,内存排序的速度是硬盘排序的1万倍。在排序的字段上创建索引,让排序在内存中执行,加快排序速度。
8、在基于CBO的优化器(花费)下,表的统计数据过期。也可能导致不使用索引。
解决:执行表分析。获取表的最新信息。
9、获取的数据量过大,全部扫描效率更高
10、索引字段的值分散率太低,值太集中,如类型字段都是1,2, 状态类型Y-有效/N-无效。这类型的字段最好别建索引。
尽管在这些字段上建立了索引,但对全表数据区分度不大。最后还是会全表扫描。
推荐教程:《Oracle教程》
以上がOracle にはどのようなインデックスがありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Oracleのソリューションを開くことはできません。1。データベースサービスを開始します。 2。リスナーを開始します。 3.ポートの競合を確認します。 4.環境変数を正しく設定します。 5.ファイアウォールまたはウイルス対策ソフトウェアが接続をブロックしないことを確認してください。 6.サーバーが閉じているかどうかを確認します。 7. RMANを使用して破損したファイルを回復します。 8。TNSサービス名が正しいかどうかを確認します。 9.ネットワーク接続を確認します。 10。Oracleソフトウェアを再インストールします。

Oracleのすべてのデータを削除するには、次の手順が必要です。1。接続を確立します。 2。外部のキーの制約を無効にします。 3.テーブルデータを削除します。 4.トランザクションを送信します。 5.外部キーの制約を有効にします(オプション)。データの損失を防ぐために、実行前にデータベースを必ずバックアップしてください。

Oracle Cursorの閉鎖問題を解決する方法には、次のものが含まれます。 Scopeが終了した後に自動的に閉じるように、for update句のカーソルを宣言します。使用句のカーソルを宣言して、関連するPL/SQL変数が閉じられたときに自動的に閉じるようにします。例外処理を使用して、例外の状況でカーソルが閉じていることを確認します。接続プールを使用して、カーソルを自動的に閉じます。自動送信を無効にし、カーソルの閉鎖を遅延させます。

Oracleでは、forループループは動的にカーソルを作成できます。手順は次のとおりです。1。カーソルタイプを定義します。 2。ループを作成します。 3.カーソルを動的に作成します。 4。カーソルを実行します。 5。カーソルを閉じます。例:カーソルをサイクルごとに作成して、上位10人の従業員の名前と給与を表示できます。

Oracle Database Pagingは、Rownum Pseudo-ColumnsまたはFetchステートメントを使用して実装しています。RownumPseudo-Columnsは、行番号ごとに結果をフィルタリングするために使用され、複雑なクエリに適しています。 Fetchステートメントは、指定された最初の行を取得するために使用され、単純なクエリに適しています。

Oracleデータベースを停止するには、次の手順を実行します。1。データベースに接続します。 2。すぐにシャットダウンします。 3.シャットダウンは完全に中止します。

SQLステートメントは、Oracleの動的SQLを使用して、ランタイム入力に基づいて作成および実行できます。手順には、次のものが含まれます。動的に生成されたSQLステートメントを保存するための空の文字列変数を準備します。 executeを即座に使用するか、ステートメントを準備して、動的なSQLステートメントをコンパイルおよび実行します。バインド変数を使用して、ユーザー入力またはその他の動的値を動的SQLに渡します。実行するか、実行するか、動的SQLステートメントを実行します。

CENTOSシステムにHadoop分散ファイルシステム(HDFS)を構築するには、複数のステップが必要です。この記事では、簡単な構成ガイドを提供します。 1.初期段階でJDKをインストールする準備:すべてのノードにJavadevelopmentKit(JDK)をインストールすると、バージョンはHadoopと互換性がある必要があります。インストールパッケージは、Oracleの公式Webサイトからダウンロードできます。環境変数構成: /etc /プロファイルファイルを編集し、JavaおよびHadoop環境変数を設定して、システムがJDKとHadoopのインストールパスを見つけることができるようにします。 2。セキュリティ構成:SSHパスワードなしログインSSHキーを生成する:各ノードでSSH-KeyGenコマンドを使用する
