Rumah > Artikel > pangkalan data > Apakah indeks yang ada pada Oracle?
Jenis indeks Oracle termasuk: indeks bukan unik, indeks unik, indeks bitmap, indeks partition awalan tempatan, indeks partition bukan awalan tempatan, indeks partition awalan global, indeks partition hash, indeks berasaskan fungsi . Indeks perlu dibuat selepas memasukkan data ke dalam jadual Indeks unik boleh dibuat dengan pernyataan "buat indeks unik".
Persekitaran pengendalian tutorial ini: sistem Windows 7, versi Oracle 11g, komputer Dell G3.
Apakah itu indeks?
1) Indeks ialah salah satu objek pangkalan data, digunakan untuk mempercepatkan pengambilan data, serupa dengan indeks buku. Pengindeksan dalam pangkalan data boleh mengurangkan jumlah data yang perlu dibaca oleh program pangkalan data semasa menanyakan hasil, sama seperti cara dalam buku kita boleh menggunakan indeks untuk mencari maklumat yang kita inginkan tanpa perlu membaca keseluruhan buku.
2) Indeks ialah objek pilihan yang dibina di atas meja; kunci kepada indeks adalah untuk menggantikan kaedah pengambilan imbasan jadual penuh lalai dengan satu set kunci indeks yang diisih, dengan itu meningkatkan kecekapan mendapatkan semula
3) Indeks secara logik dan fizikal bebas daripada jadual dan data yang berkaitan Apabila membuat atau memadam indeks, ia tidak akan menjejaskan jadual asas; pada jadual Semasa operasi DML (seperti semasa menjalankan operasi berkaitan sisipan, pengubahsuaian atau pemadaman), Oracle akan menguruskan indeks secara automatik dan pemadaman indeks tidak akan menjejaskan jadual
5) Indeks telus kepada pengguna , tanpa mengira jadual sama ada terdapat indeks, penggunaan pernyataan sql kekal tidak berubah
6) Oracle akan secara automatik mencipta indeks pada lajur apabila mencipta kunci utama
Tujuan menggunakan indeks:
Mempercepatkan pertanyaan
Kurangkan operasi I/OBilangan rekod yang dikembalikan oleh pertanyaan
Jadual mempunyai banyak serpihan (penambahan dan pemadaman yang kerap)Indeks bukan unik (paling biasa digunakan)
Indeks unikBuat indeks selepas memasukkan data ke dalam jadualSelepas memasukkan atau memuatkan data dengan SQL*Loader atau Alat , ia adalah lebih berkesan untuk mencipta indeks; Kerap mendapatkan 40% baris dalam jadual besar yang diisih atau 7% daripada jadual tidak diisih, disyorkan Bina indeks
import
mempunyai banyak nilai nol dan tidak sesuai untuk pengindeksan
Susun lajur indeks untuk prestasiHadkan bilangan indeks setiap jadual
dx_groupid_serv_id(groupid,serv_id)
where
groupid
Padamkan indeks yang tidak diperlukan lagi groupid,serv_id
serv_id
Indeks tidak sah, terutamanya apabila menggunakan indeks atau bit berasaskan fungsi Graf indeks, tetapi menggunakan indeks pokok B*;
Pertanyaan dalam aplikasi tidak menggunakan indeks; membina semula indeks, jika anda menggunakan indeks alter...bina semula untuk membina semula indeks, anda tidak perlu memadamkan indeks.
Penciptaan indeks selari boleh digunakan untuk jadual besar Apabila mencipta indeks secara selari, parameter storan diubah oleh setiap pelayan pertanyaan Proses digunakan secara berasingan, contohnya:
initial
, maka sekurang-kurangnya 1M
ruang akan digunakan semasa penciptaan indeks; 8
8M
pertimbangkan untuk menggunakan nologging
Anda boleh menggunakan nologging untuk mengurangkan log buat semula semasa membuat indeks untuk jadual besar; fail log;
Buat berasaskan fungsi Indeks: biasanya digunakan dalam pengelasan fungsi seperti , contohnya:
Cipta indeks bitmap: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 );
untuk pangkalan kecil dan secara relatif pangkalan stabil Semasa mengindeks lajur, anda harus terlebih dahulu mempertimbangkan indeks bitmap, contohnya:
UPPER、LOWER、TO_CHAR(date)
Secara eksplisit mencipta indeks unik
create index idx_func on emp (UPPER(ename)) tablespace tablespace_name;Anda boleh menggunakan pernyataan
untuk mencipta indeks unik, contohnya:
Buat indeks yang berkaitan dengan kekangancreate bitmap index idx_bitm on class (classno) tablespace tablespace_name;
Anda boleh menggunakan frasa
untuk mencipta indeks bagi medan yang berkaitan dengan kekangan dan create unique index
, contohnya:
create unique index dept_unique_idx on dept(dept_no) tablespace idx_1;
Cara membuat indeks separa separa
using index
Jadual asas mestilah jadual sekatan; jadual; unique
primary key
Bilangan sub-partition untuk setiap partition indeks Sama seperti partition jadual asas yang sepadan
alter table table_name add constraint PK_primary_keyname primary key (field_name) using index tablespace tablespace_name;Entri indeks baris dalam sub-partition jadual asas disimpan; dalam sub-partition indeks yang sepadan, sebagai contoh:
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 /Untuk indeks terbahagi:
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’ )) /Sebab untuk memadamkan indeks
Pertanyaan Indeks yang dikeluarkan terhadap jadual berkaitannya tidak memberikan peningkatan prestasi yang dijangkakan; ;
alter index idx_name rebuild nologging;Indeks telah menjadi terlalu berpecah-belah dan mesti dipadamkan sebelum membina semula; >
alter index idx_name rebuild partition partiton_name nologging;Kos untuk menubuhkan indeks
<br> drop index idx_name; <br> drop index idx_name drop partition partition_name; <br>
Pengetahuan lanjutan: Isu pengehadan indeks biasa1. Gunakan operator ketaksamaan (a8093152e673feb7aba1828c43532094, != )
Dalam kes berikut, walaupun terdapat indeks pada lajur, pernyataan pertanyaan masih melakukan imbasan jadual penuh
db file sequential read
Tetapi pertanyaan sedemikian sememangnya diperlukan dalam pembangunan, adakah tiada penyelesaian kepada masalah tersebut?
Ya! oracle
oracle
oracle
Menggunakan atau juga akan mengehadkan penggunaan indeks kerana pangkalan data tidak ditakrifkan
Nilai. Jika terdapat banyak null dalam lajur diindeks, indeks tidak akan digunakan (melainkan indeks adalah indeks bitmap, yang akan diterangkan secara terperinci dalam artikel blog akan datang). Menggunakandalam pernyataan sql boleh menyebabkan banyak masalah. Cara untuk menyelesaikan masalah ini ialah: semasa membuat jadual, tentukan lajur yang perlu diindeks sebagai bukan nol (
)dept_id
select * from dept where staff_num <> 1000;Jika indeks berasaskan fungsi tidak digunakan, maka menggunakan fungsi pada lajur diindeks dalam klausa
akan menyebabkan pengoptimum mengabaikan indeks ini. Pertanyaan berikut tidak akan menggunakan indeks:
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教程》
Atas ialah kandungan terperinci Apakah indeks yang ada pada Oracle?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!