假设两表表内连接的情况:
10年积累的成都做网站、成都网站制作经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站制作后付款的网站建设流程,更有马龙免费网站建设让你可以放心的选择与我们合作。
1. oracle 默认在进行表连接查询时使用HASH JOIN,这种情况下必然有一个表会被做为驱动表全部读取到内存中(假设表的数据不多,hash_area_size设置的内存够大)。
2. 假设表的数据非常多,hash_area_size设置的内存不够,则驱动表会被分为PARTITION分别读入,效率就会差些。
在使用HASH JOIN时,索引的作用微乎其微,所以不要只看全表扫描,在1这种情况下,ORACLE的表连接是效率最高的时候。
所以就是把数据量最小的表放到from子句越往后越好,你用了inner join,就是把小表放到inner join后面,where子句中能最快,过滤更多记录的条件也往后放。适当调整hash_area_size的大小。
你可以先设置HASH_JOIN_ENABLED=FALSE, 让ORACLE使用 NEST LOOP 或 SORT MERGE,比较一下效果,三种连接的优劣你可以在网上搜到,HASH JOIN还是首选,但不是唯一选择。
还有一种提高效率的方法,如果你的服务器CPU是多核的,你可以通过hints进行并行查询:
select /*+ parallel(t,4)*/ t.* from tab t; -- 四核CPU
索引是程序自动判断是否调用的,建立完索引,直接使用查询语句即可:
select * from als_img where img_date=‘xxx’
这就是ORACLE
CBO优化器的聪明之处了。
在ORACLE
的官方文档有这样的话:
Create
an
index
if
you
frequently
want
to
retrieve
less
than
about
15%
of
the
rows
in
a
large
table.
意思就是如果你检索的数据占整个表数据的15%以下的时候建索引。
也就是说一般情况下如果你查询的数据占表数据的15%以下的时候,用索引会比全表扫描效率高。如果超过15%的话可能就是全表扫描的效率更好!当然这个15%也不是固定的,也要根据不同情况来分!
而ORACLE
的CBO优化器会自动根据表的统计数据和你要检索的数据,去分析是用索引的效率更高还是全表扫描的效率更高。
如果一定要用索引的话,那就加个hints吧!
索引使用时,有统计信息,数据库选择最优索引,可以使用hint提示你想要使用的索引,多个字段组成的联合索引,符合最左匹配原则 index(a,b,c) 符合 where a=1 and b=1 或者 where a=1 或者 where a=1 and b=1 and c=1 都可以用到索引。where 条件包含的字段和索引排序一样。
通过PL/SQL可以直接查看某表是否建索引,通过SQL查询select status,T.* from user_indexes T where table_name='表名'
oracle查看有效索引是这个:select status,T.* from user_indexes T,where table_name='TABLE1'
最好弄个图像界面软件,就能知道,比如:PL/SQLDeveloper
数据库中的失效的索引、索引分区、子分区:如果不是失效的索引,那么都是有效的。
创建索引语法:
CREATE [UNIQUE] | [BITMAP] INDEX index_name
--unique表示唯一索引
ON table_name([column1 [ASC|DESC],column2
--bitmap,创建位图索引
[ASC|DESC],…] | [express])[TABLESPACE tablespace_name][PCTFREE n1]
--指定索引在数据块中空闲空间
[STORAGE (INITIAL n2)][NOLOGGING]
--表示创建和重建索引时允许对表做DML操作,默认情况下不应该使用
[NOLINE][NOSORT];
--表示创建索引时不进行排序,默认不适用,如果数据已经是按照该索引顺序排列的可以使用
扩展资料:
1、如果有两个或者以上的索引,其中有一个唯一性索引,而其他是非唯一,这种情况下oracle将使用唯一性索引而完全忽略非唯一性索引
2、至少要包含组合索引的第一列(即如果索引建立在多个列上,只有它的第一个列被where子句引用时,优化器才会使用该索引)
3、小表不要简历索引
4、对于基数大的列适合建立B树索引,对于基数小的列适合简历位图索引
5、列中有很多空值,但经常查询该列上非空记录时应该建立索引
6、经常进行连接查询的列应该创建索引
7、使用create index时要将最常查询的列放在最前面
8、LONG(可变长字符串数据,最长2G)和LONG RAW(可变长二进制数据,最长2G)列不能创建索引
9、限制表中索引的数量(创建索引耗费时间,并且随数据量的增大而增大;索引会占用物理空间;当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度)