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にインデックスがある場合でも、クエリ ステートメントは依然としてテーブル全体のスキャンを実行します
<pre class='brush:php;toolbar:false;'>select * from dept where staff_num <> 1000;</pre>
ただし、これは実際に必要です開発クエリでは、問題の解決策はありませんか? ######持っている!不等号をクエリ構文の または に置き換えることで、インデックスを使用してテーブル全体のスキャンを回避できます。上記のステートメントを次のように変更すると、インデックスを使用できるようになります。
select * from dept shere staff_num < 1000 or dept_id > 1000;
2. is null または is not nullis 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 サイトの他の関連記事を参照してください。

Oracleの製品エコシステムには、データベース、ミドルウェア、クラウドサービスが含まれます。 1。OracLedatabaseはそのコア製品であり、効率的なデータストレージと管理をサポートしています。 2。OracleWeblogicserverなどのミドルウェアは、さまざまなシステムに接続します。 3。OracleCloudは、クラウドコンピューティングソリューションの完全なセットを提供します。

MySQLとOracleには、パフォーマンス、スケーラビリティ、セキュリティに利点があります。 1)パフォーマンス:MySQLは読み取り操作と高い並行性に適しており、Oracleは複雑なクエリとビッグデータ処理に優れています。 2)スケーラビリティ:MySQLはマスタースレーブの複製とシャードを通じて拡張され、OracleはRACを使用して高可用性と負荷分散を提供します。 3)セキュリティ:MySQLはきめ細かい許可制御を提供しますが、Oracleにはより包括的なセキュリティ機能と自動化ツールがあります。

Oracleは、高性能、信頼性、セキュリティのために、データベース管理の「パワーハウス」と呼ばれています。 1。Oracleは、複数のオペレーティングシステムをサポートするリレーショナルデータベース管理システムです。 2.スケーラビリティ、セキュリティ、高可用性を備えた強力なデータ管理プラットフォームを提供します。 3。Oracleの作業原則には、データストレージ、クエリ処理、トランザクション管理が含まれ、インデックス作成、パーティション化、キャッシュなどのパフォーマンス最適化テクノロジーをサポートします。 4.使用の例には、テーブルの作成、データの挿入、ストアドプロシージャの書き込みが含まれます。 5.パフォーマンス最適化戦略には、インデックス最適化、パーティションテーブル、キャッシュ管理、クエリ最適化が含まれます。

OracleOfferScolreansiveSiveSiveOfProductsandServicesIncludingDatabaseManagement、CloudComputing、Enterpriseoftware、AndhardWaresolutions.1)OracLedatabaseSupportswithipersiveManagementFeatures.2)Oraclecloudinfrastrutrutruture(oci)は

データベースからクラウドコンピューティングへのOracleソフトウェアの開発履歴には、次のものが含まれます。1。1977年に発信され、当初はリレーショナルデータベース管理システム(RDBMS)に焦点を当て、すぐにエンタープライズレベルのアプリケーションの最初の選択肢になりました。 2。ミドルウェア、開発ツール、ERPシステムに拡張して、エンタープライズソリューションの完全なセットを形成します。 3。OracleデータベースはSQLをサポートし、小規模から大規模なエンタープライズシステムに適した高性能とスケーラビリティを提供します。 4.クラウドコンピューティングサービスの台頭により、Oracleの製品ラインがさらに拡大し、必要な企業のあらゆる側面を満たしています。

MySQLおよびOracleの選択は、コスト、パフォーマンス、複雑さ、および機能的要件に基づいている必要があります。1。MySQLは、予算が限られているプロジェクトに適しており、インストールが簡単で、中小サイズのアプリケーションに適しています。 2。Oracleは大規模な企業に適しており、大規模なデータと高い並行リクエストの処理に優れたパフォーマンスを発揮しますが、構成はコストと複雑です。

Oracleは、企業が製品とサービスを通じてデジタル変革とデータ管理を達成するのを支援します。 1)Oracleは、データベース管理システム、ERP、CRMシステムなどの包括的な製品ポートフォリオを提供し、企業がビジネスプロセスを自動化および最適化するのを支援します。 2)E-BusinessSuiteやFusionApplicationsなどのOracleのERPシステムは、エンドツーエンドのビジネスプロセスの自動化を実現し、効率を改善し、コストを削減しますが、実装とメンテナンスコストが高くなります。 3)OracLedatabaseは、高い並行性と高可用性データ処理を提供しますが、ライセンスコストが高くなります。 4)パフォーマンスの最適化とベストプラクティスには、インデックス作成と分割技術の合理的な使用、定期的なデータベースのメンテナンス、コーディング仕様のコンプライアンスが含まれます。

Oracleがライブラリの構築に失敗した後、失敗したデータベースを削除する手順:SYSユーザー名を使用してターゲットインスタンスに接続します。ドロップデータベースを使用して、データベースを削除します。クエリv $データベースデータベースが削除されていることを確認します。


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

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

Dreamweaver Mac版
ビジュアル Web 開発ツール

AtomエディタMac版ダウンロード
最も人気のあるオープンソースエディター

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

MinGW - Minimalist GNU for Windows
このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。
