Oracle数据库的常见问题答疑之集锦(4)
文章作者 100test 发表时间 2007:03:14 13:56:56
来源 100Test.Com百考试题网
问:连接次序与谓词求值
在下面的查询中,WHERE 语句的哪一部分先执行?
Select field names from emp, dept
where emp.dept_num = dept.num and
emp.name Like S% and dept.name= IT . |
答:执行次序随已有的索引、统计、和session/init.ora参数的不同而变化。
假定已有一个建立在DEPT(name)和EMP(dept_num)上的索引。假定优化器认为DEPT是唯一的,它可能按下面的顺序进行操作:
利用建立在DEPT(name)上的索引查找dept列
利用建立在EMP(dept_num)上的索引查找匹配的emp列(即连接emp.dept_num = dept.num)
依据建立在emp.ename like S% 进行过滤
现在,我们假定没有建立在EMP(dept_num)上的索引,也没有建立在DEPT(name)上的索引,而存在建立在EMP(name)和DEPT(num)上的索引。优化器可能按下面的次序进行操作:
利用建立在EMP(name)上的索引找到带有S的EMPS
利用建立在DEPT(num)上的索引找到匹配项 <
根据dept.name = IT 过滤结果
谓词求值的次序是不确定的,可以随时间的改变而改变,并由优化器决定。不要假定任何事情会按一定的次序发生。如果你那么做,随着时间的推移,你的应用程序可能会出现一些看起来非常奇怪的错误。看以下的例子:建立一个表,输入一些数据。当X= a’时,第二列的数据“Y”是一个数值,当X= b’时,“Y”不是数字。
SQL> create table t ( x varchar2(1), y varchar2(1) ).
Table created.
SQL> insert into t values ( a , 1 ).
1 row created.
SQL> insert into t values ( b , x ).
1 row created. |
现在根据这个表运行一个查询:查找满足x= a ,y=1的行。
SQL> 0select * from t where x = a and
y = 1.
ERROR:
ORA-01722: invalid number
no rows 0selected(错误,无效的数字,没有选择任何行) |
呦,没有成功。在这种情况下,数据库首先执行Y=1,当找到Y= X 的行后,很显然,它不能将 X 转换为一个数字,所以失败了。而下面的程序将给出不同的结果:
SQL> analyze table t compute statistics.
Table analyzed.(表已经分析过)
SQL> 0select * from t where x = a and
y = 1.
X Y
- -
a 1 |
使用不同的优化器模式,成功了!为什么?优化器说:“嘿,检查x= a 要比检查y=1来得快,因为在y=1中有一个将y从字符变为数字的转换。所以,我先检查x= a ,然后再检查y=1。”
这个例子说明谓词执行的次序可能是不确定的,你不能指望有一种特定的执行次序。也就是说,当你依靠一个隐含的转换时,必须非常谨慎。
问:显示SGA--fixed size(固定大小)与variable size(可变大小)
当在svrmgr提示符下运行 “show SGA”时,fixed size和variable size是什么意思?
答:fixed size就是SGA中固定组件(它在编译oracle 数据库本身时就固定于其中)的大小。它是固定大小的内存,用来指向SGA的其它部分。SGA这一部分的大小是不能改变的。
variable size指分配的内存块大小可变。SGA的可变块,分为共享池、大池、JAVA池、游标区和其他结构。