??xml version="1.0" encoding="utf-8" standalone="yes"?>
关系数据库在不断地发展时Q许多数据库引入了面向对象的思想Q这其中以OracleZ表,Oracle9i号U面向对象数据库?/font> 自Oracle9i以来QOracle׃再是单纯的关pL据库理pȝQ它在关pL据库模型的基上,d了一pd面向对象的特性。Oracle的对象体p遵从面向对象思想的基本特征,许多概念同C++,JAVA中类|hl承Q重载,多态等特征Q但又有自己的特炏V?br />
1?Oracle面向对象的最基本元素是它的对象类型—?strong>Type?br />
下面开始写自定义对象类? as object 必须关键?
创徏表ƈ使用以上对象cdADDRESS
通过别名对表q行查询
从上面的试代码Q可以很Ҏ看到其与面向对象语言Q比如JavaQ的差异Q不必用new创徏实例Q也没有了默认无参数构造器Q默认用定义的属性作为构造器参数Q以描q各U实体。另外,Type的属性没有private,protected,public的说法,所有的属性调用者都可以讉KQ即都是public?br />
2、Oracle中面向对象特征—?strong>l承(父类型必d明ؓNOT FINAL,子类型用关键字UNDER)
3、可变数l?/strong>
可变数组Q是一U集合。一个可变数l是对象的一个集合,其中每个对象都具有相同的数据cd。可变数l的大小由创建时军_。在表中建立可变数组后,可变数组在主表中作ؓ一个列对待?/font>
4、嵌套表
嵌套表是表中之表Q一个嵌套表是某些行的集合,它在主表中表CZؓ其中的一列。对主表中的每一条记录,嵌套表可以包含多个行?/font>
比较Q可变数l,查询速度快,但是更新困难得整体更斎ͼ适用与数据不修改情况Q如ȝ处方。用嵌套表可以对表中的表内容进行修改而无需q行整体更新操作?/font>
4、对象表
5、对象视?/font>
好了Q有关Oracle中面向对象的内容q要叙q这么多了,虽然现在很少使用刎ͼ但在以后有用C处有一定的参考作用?/font>
触发器两个特D行U变量: :New新?/span> ?/span> :Old旧?/span> 分别代表更新|被更新的?/span>
判断复合型触发器
索引是数据库中重要的数据l构Q它的根本目的就是ؓ了提高查询效率。现在大多数的数据库产品都采?/span> IBM 最先提出的 ISAM 索引l构。烦引的使用要恰到好处,其用原则如下:
●在l常q行q接Q但是没有指定ؓ外键的列上徏立烦引,而不l常q接的字D则׃化器自动生成索引?/span>
●在频繁q行排序或分l(卌?/span> group by ?/span> order by 操作Q的列上建立索引?/span>
●在条g表达式中l常用到的不同D多的列上建立索,在不同值少的列上不要徏立烦引。比如在雇员表的“性别”列上只有“?#8221;?#8220;?#8221;两个不同|因此无必要建立索引。如果徏立烦引不但不会提高查询效率,反而会严重降低更新速度?/span>
●如果待排序的列有多个,可以在这些列上徏立复合烦引( compound index Q?/span>
●用系l工兗如 Informix 数据库有一?/span> tbcheck 工具Q可以在可疑的烦引上q行查。在一些数据库服务器上Q烦引可能失效或者因为频J操作而得读取效率降低,如果一个用烦引的查询不明不白地慢下来Q可以试着?/span> tbcheck 工具查烦引的完整性,必要时进行修复。另外,当数据库表更新大量数据后Q删除ƈ重徏索引可以提高查询速度?/span>
应当化或避免对大型表q行重复的排序。当能够利用索引自动以适当的次序生输出时Q优化器避免了排序的步骤。以下是一些媄响因素:
●烦引中不包括一个或几个待排序的列;
?/span> group by ?/span> order by 子句中列的次序与索引的次序不一P
●排序的列来自不同的表?/span>
Z避免不必要的排序Q就要正地增徏索引Q合理地合ƈ数据库表Q尽有时可能媄响表的规范化Q但相对于效率的提高是值得的)。如果排序不可避免,那么应当试图化它Q如~小排序的列的范围等?/span>
在嵌套查询中Q对表的序存取Ҏ询效率可能生致命的影响。比如采用顺序存取策略,一个嵌?/span> 3 层的查询Q如果每层都查询 1000 行,那么q个查询p查询 10 亿行数据。避免这U情늚主要Ҏ是对连接的列进行烦引。例如,两个表:学生表(学号、姓名、年?#8230;…Q和选课表(学号、课E号、成l)。如果两个表要做q接Q就要在“学号”q个q接字段上徏立烦引?/span>
q可以用ƈ集来避免序存取。尽在所有的查列上都有烦引,但某些Ş式的 where 子句优化器用顺序存取。下面的查询强q对 orders 表执行顺序操作:
SELECT Q?/span> FROM orders WHERE (customer_num=104 AND order_num>1001) OR order_num=1008
虽然?/span> customer_num ?/span> order_num 上徏有烦引,但是在上面的语句中优化器q是使用序存取路径扫描整个表。因个语句要索的是分ȝ行的集合Q所以应该改为如下语句:
SELECT Q?/span> FROM orders WHERE customer_num=104 AND order_num>1001
UNION
SELECT Q?/span> FROM orders WHERE order_num=1008
q样p利用索引路径处理查询?/span>
一个列的标{时在L询和 where 子句中的查询中出玎ͼ那么很可能当L询中的列值改变之后,子查询必重新查询一ơ。查询嵌套层ơ越多,效率低Q因此应当尽量避免子查询。如果子查询不可避免Q那么要在子查询中过滤掉可能多的行?/span>
MATCHES ?/span> LIKE 关键字支持通配W匹配,技术上叫正规表辑ּ。但q种匚w特别耗费旉。例如: SELECT Q?/span> FROM customer WHERE zipcode LIKE “ 98_ _ _ ”
即?/span> zipcode 字段上徏立了索引Q在q种情况下也q是采用序扫描的方式。如果把语句改ؓ SELECT Q?/span> FROM customer WHERE zipcode > “ 98000 ”Q在执行查询时就会利用烦引来查询Q显然会大大提高速度?/span>
另外Q还要避免非开始的子串。例如语句: SELECT Q?/span> FROM customer WHERE zipcode[2 Q?/span> 3] > “ 80 ”Q在 where 子句中采用了非开始子Ԍ因而这个语句也不会使用索引?/span>
把表的一个子集进行排序ƈ创徏临时表,有时能加速查询。它有助于避免多重排序操作,而且在其他方面还能简化优化器的工作。例如:
SELECT cust.name Q?/span> rcvbles.balance Q?#8230;… other columns
FROM cust Q?/span> rcvbles
WHERE cust.customer_id = rcvlbes.customer_id
AND rcvblls.balance>0
AND cust.postcode>“98000”
ORDER BY cust.name
如果q个查询要被执行多次而不止一ơ,可以把所有未付款的客h出来攑֜一个时文件中Qƈ按客L名字q行排序Q?/span>
SELECT cust.name Q?/span> rcvbles.balance Q?#8230;… other columns
FROM cust Q?/span> rcvbles
WHERE cust.customer_id = rcvlbes.customer_id
AND rcvblls.balance>0
ORDER BY cust.name
INTO TEMP cust_with_balance
然后以下面的方式在时表中查询:
SELECT Q?/span> FROM cust_with_balance
WHERE postcode>“98000”
临时表中的行要比主表中的行少Q而且物理序是所要求的顺序,减少了磁?/span> I/O Q所以查询工作量可以得到大幅减少?/span>
注意Q时表创徏后不会反映主表的修改。在主表中数据频J修改的情况下,注意不要丢失数据?/span>
非顺序磁盘存取是最慢的操作Q表现在盘存取臂的来回Ud?/span> SQL 语句隐藏了这一情况Q得我们在写应用程序时很容易写求存取大量非序늚查询?/span>
有些时候,用数据库的排序能力来替代非顺序的存取能改q查询?/font>
优化是选择最有效的方法来执行 SQL 语句?/span> Oracle 优化器选择它认为最有效的方法来执行 SQL 语句?/span>
如果某列存在 NULL |即对该列徏立烦引也不会提高性能?/span>
为完成不同的工作~写一大块 SQL E序不是好方法。它往往D每个d的结果不?/span>
化。若?/span> SQL 完成不同的工作,一般应~写不同的语句块比编写一个要好?/span>
Select name from employee where name not in (select name from student);
Select name from employee where not exists (select name from student);
W一?/span> SQL 语句的执行效率不如第二句?/span>
通过使用 EXISTS Q?/span> Oracle 会首先检查主查询Q然后运行子查询直到它找到第一个匹?/span>
,q就节省了时间?/span> Oracle 在执?/span> IN 子查询时Q首先执行子查询Qƈ获得的l果
列表存放在一个加了烦引的临时表中。在执行子查询之前,pȝ先将L询挂P?/font>
子查询执行完毕,存放在时表中以后再执行L询。这也就是?/span> EXISTS 比?/span> IN
通常查询速度快的原因?/font>
Select * from employee where salary<>1000;
Select * from employee where salary<1000 or salary>1000;
W一?/span> SQL 语句的执行效率不如第二句Q因为第二句 SQL 语句可以使用索引?/span>
Order By 语句的执行效率很低,因ؓ它要排序。应避免?/span> Order By 字句中用表辑ּ?/span>
select * from employee where name||department=’ZYZBIOINFO’;
select * from employee where name=’ZYZ’ and department=’BIOINFO’;
q两个查询,W二句比W一句会快,因ؓ对于有连接运符’ || ’的查?/span> ,Oracle 优化器是?/span>
会用烦引的?/font>
Select * from employee where name like ‘%Z%’;
Select * from employee where name like ‘Z%’;
W二句的执行效率会比W一句快Q但查询l果集可能会不同?/font>
假设字段 studentno ?/span> VARCHAR2 cd
有语?/span> select * from student where studentno>123;
?/span> Oracle 会有一个隐含的cd转换。隐含的cd转换可能会 Oracle 优化器忽略烦引?/span>
q时应用显式的cd转换 select * from student where studentno=to_char(123) ?/span>
查看本用户下的各U对象的SQL脚本
表:
select * from cat;
select * from tab;
select table_name from user_tables;
视图Q?br />
select text from user_views where view_name=upper('&view_name');
索引Q?br />
select index_name,table_owner,table_name,tablespace_name,status from user_indexes order by table_name;
触发器:
select trigger_name,trigger_type,table_owner,table_name,status from user_triggers;
快照Q?br />
select owner,name,master,table_name,last_refresh,next from user_snapshots order by owner,next;
同义词:
select * from syn;
序列Q?br />
select * from seq;
数据库链路:
select * from user_db_links;
U束限制Q?br />
select TABLE_NAME,CONSTRAINT_NAME,SEARCH_CONDITION,STATUS from user_constraints;
本用戯取其他用户对象的权限Q?br />
select * from user_tab_privs;
本用h拥有的系l权限:
select * from user_sys_privs;
用户Q?br />
select * from all_users order by user_id;
表空间剩余自q间情况:
select tablespace_name,sum(bytes) d节数,max(bytes),count(*) from dba_free_space group by tablespace_nameQ?br />
数据字典Q?br />
select table_name from dict order by table_name;
锁及资源信息Q?br />
select * from v$lock;不包括DDL?br />
数据库字W集Q?br />
select name,value$ from props$ where name='NLS_CHARACTERSET';
inin.ora参数Q?br />
select name,value from v$parameter order by name;
SQL׃n池:
select sql_text from v$sqlarea;
数据库:
select * from v$database
控制文gQ?br />
select * from V$controlfile;
重做日志文g信息Q?br />
select * from V$logfile;
来自控制文g中的日志文g信息Q?br />
select * from V$log;
来自控制文g中的数据文g信息Q?br />
select * from V$datafile;
NLS参数当前|
select * from V$nls_parameters;
ORACLE版本信息Q?br />
select * from v$version;
描述后台q程Q?br />
select * from v$bgprocess;
查看版本信息Q?br />
select * from product_component_version;
查看实例,所在主机名:
select instance_name,host_name from v$instance;