SQL1:
SELECT t.tablespace_name, round(SUM(bytes / (1024 * 1024)), 0) ts_size
FROM dba_tablespaces t, dba_data_files d
WHERE t.tablespace_name = d.tablespace_name
GROUP BY t.tablespace_name;
--2、查看表空间物理文件的名称及大小
SELECT tablespace_name,
file_id,
file_name,
round(bytes / (1024 * 1024), 0) total_space
FROM dba_data_files
ORDER BY tablespace_name;
--3、查看回滚段名称及大小
SELECT segment_name,
tablespace_name,
r.status,
(initial_extent / 1024) initialextent,
(next_extent / 1024) nextextent,
max_extents,
v.curext curextent
FROM dba_rollback_segs r, v$rollstat v
WHERE r.segment_id = v.usn(+)
ORDER BY segment_name;
--4、查看控制文件
SELECT NAME FROM v$controlfile;
--5、查看日志文件
SELECT MEMBER FROM v$logfile;
--6、查看表空间的使用情况
SELECT SUM(bytes) / (1024 * 1024) AS free_space, tablespace_name
FROM dba_free_space
GROUP BY tablespace_name;
SELECT a.tablespace_name,
a.bytes total,
b.bytes used,
c.bytes free,
(b.bytes * 100) / a.bytes "% USED ",
(c.bytes * 100) / a.bytes "% FREE "
FROM sys.sm$ts_avail a, sys.sm$ts_used b, sys.sm$ts_free c
WHERE a.tablespace_name = b.tablespace_name
AND a.tablespace_name = c.tablespace_name;
--7、查看数据库库对象
SELECT owner, object_type, status, COUNT(*) count#
FROM all_objects
GROUP BY owner, object_type, status;
--8、查看数据库的版本
SELECT version
FROM product_component_version
WHERE substr(product, 1, 6) = 'Oracle';
--9、查看数据库的创建日期和归档方式
SELECT created, log_mode, log_mode FROM v$database;
SQL2:
--1M=1024KB
--1K=1024Bytes
--1M=11048576Bytes
--1G=1024*11048576Bytes=11313741824Bytes
SELECT a.tablespace_name "表空间名",
total "表空间大小",
free "表空间剩余大小",
(total - free) "表空间使用大小",
total / (1024 * 1024 * 1024) "表空间大小(G)",
free / (1024 * 1024 * 1024) "表空间剩余大小(G)",
(total - free) / (1024 * 1024 * 1024) "表空间使用大小(G)",
round((total - free) / total, 4) * 100 "使用率 %"
FROM (SELECT tablespace_name, SUM(bytes) free
有两个简单例子,以说明 "exists"和"in"的效率问题
1) select * from T1 where exists(select 1 from T2 where T1.a=T2.a) ;
T1数据量小而T2数据量非常大时,T1<<T2 时,1) 的查询效率高。
2) select * from T1 where T1.a in (select T2.a from T2) ;
T1数据量非常大而T2数据量小时,T1>>T2 时,2) 的查询效率高。
exists 用法:
第(1)句理解其含义:
其中 “select 1 from T2 where T1.a=T2.a” 相当于一个关联表查询,相当于“select 1 from T1,T2 where T1.a=T2.a”
但是,如果你单独执行(1)句括号里的语句,是会报语法错误的,这也是使用exists需要注意的地方。
“exists(xxx)”就表示括号里的语句能不能查出记录,它要查的记录是否存在。
因此“select 1”这里的 “1”其实是无关紧要的,换成“*”也没问题,它只在乎括号里的数据能不能查找出来,
是否存在这样的记录,如果存在,这 (1) 句的where 条件成立。
in 的用法:
第(2)句理解其含义:
这里的“in”后面括号里的语句搜索出来的字段的内容一定要相对应,一般来说,T1和T2这两个表的a字段表达的意义应该是一样的,否则这样查没什么意义。
打个比方:T1,T2表都有一个字段,表示工单号,但是T1表示工单号的字段名叫“ticketid”,T2则为“id”,但是其表达的意义是一样的,而且数据格式也是一样的。
这时,用 (2)的写法就可以这样:"select * from T1 where T1.ticketid in (select T2.id from T2) "
Select name from employee where name not in (select name from student);
Select name from employee where not exists (select name from student);
第一句SQL语句的执行效率不如第二句。
通过使用EXISTS,Oracle会首先检查主查询,然后运行子查询直到它找到第一个匹配项,这就节省了时间。
Oracle在执行IN子查询时,首先执行子查询,并将获得的结果列表存放在一个加了索引的临时表中。
在执行子查询之前,系统先将主查询挂起,待子查询执行完毕,存放在临时表中以后再执行主查询。
这也就是使用EXISTS比使用IN通常查询速度快的原因。
本文链接
Oracle 提供了多种不同类型的索引以供使用。简单地说,Oracle 中包括如下索引:
B*树索引:这些是我所说的“传统“索引。到目前为止,这是 Oracle 和大多数其他数据库中最常用
的索引。B*树的构造类似于二叉树,能根据键提供一行或一个行集的快速访问,通常只需很少的读操作就
能找到正确的行。不过,需要注意重要的一点,”B*树“中的”B“不代表二叉(binary),而 代 表 平 衡( balanced)。
B*树索引并不是一颗二叉树,这一点在介绍如何在磁盘上物理地存储 B*树时就会了解到。B*树索引有以下
子类型:
索引组织表(index organized table):索引组织表以 B*树结构存储。堆表的数据行是以一种无组
织的方式存储的(只要有可用的空间,就可以放数据),而 IOT 与之不同,IOT 中的数据要按主键的顺序存
储和排序。对应用来说,IOT 表现得与“常规“表并无二致;需要使用 SQL 来正确地访问 IOT。IOT 对信息
获取、空间系统和 OLAP 应用最为有用。IOT 在上一章已经详细地讨论过。
B*树聚簇索引(B*tree cluster index)这些是传统 B*树索引的一个变体(只是稍有变化)。B*树聚
簇索引用于对聚簇键建立索引(见第 11.章中“索引聚簇表“一节),所以这一章不再讨论。在传统 B*树中 ,
键都指向一行;而 B*树聚簇不同,一个聚簇键会指向一个块,其中包含与这个聚簇键相关的多行。
降序索引(descending index):降序索引允许数据在索引结构中按“从大到小“的顺序(降序)排
序,而不是按”从小到大“的顺序(升序)排序。我们会解释为什么降序索引很重要,并说明降序索引如
何工作。
反向键索引(reverse key index):这也是 B*树索引,只不过键中的字节会“反转“。利用反向键
索引,如果索引中填充的是递增的值,索引条目在索引中可以得到更均匀的分布。例如,如果使用一个序
列来生成主键,这个序列将生成诸如 987500、987501、987502 等值。这些值是顺序的,所以倘若使用一个
传统的 B*树索引,这些值就可能放在同一个右侧块上,这就加剧了对这一块的竞争。利用反向键,Oracle
则会逻辑地对 205789、105789、005789 等建立索引。Oracle 将数据放在索引中之前,将先把所存储数据
的字节反转,这样原来可能在索引中相邻放置的值在字节反转之后就会相距很远。通过反转字节,对索引
的插入就会分布到多个块上。
位图索引(bitmap index):在一颗 B*树中,通常索引条目和行之间存在一种一对一的关系:一个索
引条目就指向一行。而对于位图索引,一个索引条目则使用一个位图同时指向多行。位图索引适用于高度
重复而且通常只读的数据(高度重复是指相对于表中的总行数,数据只有很少的几个不同值)。考虑在一个
有 100 万行的表中,每个列只有 3 个可取值:Y、N 和 NULL。举例来说,如果你需要频繁地统计多少行有值
Y,这就很适合建立位图索引。不过并不是说如果这个表中某一列有 11.000 个不同的值就不能建立位图索
引,这一列当然也可以建立位图索引。在一个 OLTP 数据库中,由于存在并发性相关的问题,所以不能考虑
使用位图索引(后面我们就会讨论这一点)。注意,位图索引要求使用 Oracle 企业版或个人版。
位图联结索引(bitmap join index):这为索引结构(而不是表)中的数据提供了一种逆规范化的方
法。例如,请考虑简单的 EMP 和 DEPT 表。有人可能会问这样一个问题:“多少人在位于波士顿的部门工作?
“EMP 有一个指向 DEPT 的外键,要想统计 LOC 值为 Boston 的部门中的员工人数,通常必须完成表联结,
将 LOC 列联结至 EMP 记录来回答这个问题。通过使用位图联结索引,则可以在 EMP 表上对 LOC 列建立索引。
基于函数的索引(function-based index):这些就是 B*树索引或位图索引,它将一个函数计算得到
的结果存储在行的列中,而不是存储列数据本身。可以把基于函数的索引看作一个虚拟列(或派生列)上
的索引,换句话说,这个列并不物理存储在表中。基于函数的索引可以用于加快形如 SELECT * FROM T WHERE
FUNCTION(DATABASE_COLUMN) = SAME_VALUE 这样的查询,因为值 FUNCTION(DATABASE_COLUMN)已经提前计
算并存储在索引中。
应用域索引(application domain index):应用域索引是你自己构建和存储的索引,可能存储在
Oracle 中,也可能在 Oracle 之外。你要告诉优化器索引的选择性如何,以及执行的开销有多大,优化器
则会根据你提供的信息来决定是否使用你的索引。Oracle 文本索引就是应用域索引的一个例子;你也可以
使用构建 Oracle 文本索引所用的工具来建立自己的索引。需要指出,这里创建的“索引“不需要使用传统
的索引结构。例如,Oracle 文本索引就使用了一组表来实现其索引概念。
本文链接