同标题:在进行多个表连接时,FROM中的表的顺序要按照记录数由多到少的顺序来排列,这么做的原因是什么呢?
解决方案 »
- 查询语句,查询字段“状态”status.如果=‘1’显示“已录入”,=‘2’显示“已提交”。怎么写sql
- 求oracle shell编程资料
- 在存储过程中,表名和条件是变量怎样处理?
- 数据文件中的脏数据
- ****有没有将“存不存在”的状态select出来的SQL语句??
- 求助有关测评系统的数据表设计
- 找Oracle的logminer包?
- 请问如何将oracle的结果集以XML的形式导出?请高手指教!!!
- 求救!存储过程中调用函数,函数调用存储过程中创建的临时表,该如何写?
- IMP失败!
- ORA-06502: PL/SQL: 数字或值错误,ORA-06512: 在"HMNEWDB.FLOATTOBITARRAY", line 15
- 付费找人开发PHP+Oracle程序,共同学习进步
所以当解析表的时候,遇到右边第一张表,就会把它做为基础表,然后其它表来和它比较
所以右边的表的数据越大,基础表也越大,成本就高所以一般写SQL时把表数据小的写在右边,或者是把交叉表写在右边不过也不全然,当你用HINT 时,可以指定基础表的
因此FROM子句中写在最后的表将被最先处理。
在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。当ORACLE处理多个表时, 会运用排序及合并的方式连接它们。
首先,扫描第一个表(FROM子句中最后的那个表)并对记录进行派序,然后扫描第二个表(FROM子句中最后第二个表),
最后将所有从第二个表中检索出的记录与第一个表中合适记录进行合并。
如果两表都进行全表扫描的话,谁作为基础表不都一样吗?(这么理解对不?)
另外,所说的数据小的作为基础表,不是指原始数据量吧?是经过选择之后的数据量吧?
例如:A表中有1000条数据,B表中有10000条数据,A表中A2字段为'AA'的有200条数据,
B表中B2字段为'BB'的数据有100条,那么以下的SQL应该采用方案1还是方案2呢?或者是别的方案?
方案1:
SELECT A.A1,A.A3
FROM B,A
WHERE A.A1=B.A1 AND B.B2='BB' AND A.A2='AA'方案2:
SELECT A.A1,A.A3
FROM A,B
WHERE A.A1=B.A1 AND A.A2='AA' AND B.B2='BB' 谢谢回答,关于这方面的效率处理不知道应该从哪几方面考虑,理由都是什么,一般只实现功能就算完成了。
如果我写的SQL中没有Where及其他条件(当然这样的多表连接查询是没有意义的),
是否就不存在我第一回问的问题了?(也就是说哪个表放在前面后面都一样),
因为最终结果是全笛卡尔积,究竟第一个表是否排序、合并了,效率不会有影响。
select * from A, B也存在同样的问题(只要是联合查询就必然有这样的问题)
查询的时候发生笛卡尔积的时候还是需要排序结合的
a 为基础表 多数据b 为参照表 小数据方案一 先读取a,排序a,在连接b方案二 先读取b,排序b,再连接a
肯定是二比较好二中只需要读取全部的b和部分的a。