下面的SQL 语句执行效率最高的是:
A)
select * from user
where (userno='13798829822' )
and (begintime>to_date('2004-1-30 8:20:11','yyyy-MM-dd hh24:mi:ss'))
and (begintime<to_date('2004-9-30 8:20:11','yyyy-MM-dd hh24:mi:ss'));B)
select * from user
where (userno='13798829822' )
and (begintime<to_date('2004-9-30 8:20:11','yyyy-MM-dd hh24:mi:ss'))
and (begintime>to_date('2004-1-30 8:20:11','yyyy-MM-dd hh24:mi:ss'));
C)
select * from user
where
(begintime<to_date('2004-9-30 8:20:11','yyyy-MM-dd hh24:mi:ss'))
and (begintime>to_date('2004-1-30 8:20:11','yyyy-MM-dd hh24:mi:ss'))
and (userno='13798829822' );
D)
select * from user
where
(begintime>to_date('2004-1-30 8:20:11','yyyy-MM-dd hh24:mi:ss'))
and (begintime<to_date('2004-9-30 8:20:11','yyyy-MM-dd hh24:mi:ss'))
and (userno='13798829822' );
A)
select * from user
where (userno='13798829822' )
and (begintime>to_date('2004-1-30 8:20:11','yyyy-MM-dd hh24:mi:ss'))
and (begintime<to_date('2004-9-30 8:20:11','yyyy-MM-dd hh24:mi:ss'));B)
select * from user
where (userno='13798829822' )
and (begintime<to_date('2004-9-30 8:20:11','yyyy-MM-dd hh24:mi:ss'))
and (begintime>to_date('2004-1-30 8:20:11','yyyy-MM-dd hh24:mi:ss'));
C)
select * from user
where
(begintime<to_date('2004-9-30 8:20:11','yyyy-MM-dd hh24:mi:ss'))
and (begintime>to_date('2004-1-30 8:20:11','yyyy-MM-dd hh24:mi:ss'))
and (userno='13798829822' );
D)
select * from user
where
(begintime>to_date('2004-1-30 8:20:11','yyyy-MM-dd hh24:mi:ss'))
and (begintime<to_date('2004-9-30 8:20:11','yyyy-MM-dd hh24:mi:ss'))
and (userno='13798829822' );
ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾.
< 比 >号效率高
哪有什么表之间的连接阿等式比较和范围比较
当WHERE子句中有索引列, ORACLE不能合并它们,ORACLE将用范围比较. 举例:
DEPTNO上有一个非唯一性索引,EMP_CAT也有一个非唯一性索引.
SELECT ENAME
FROM EMP
WHERE DEPTNO > 20
AND EMP_CAT = ‘A’;
这里只有EMP_CAT索引被用到,然后所有的记录将逐条与DEPTNO条件进行比较. 执行路径如下:
TABLE ACCESS BY ROWID ON EMP
INDEX RANGE SCAN ON CAT_IDXuserno和
begintime是否有索引?
呵呵
把"ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾。"
和
“等式比较和范围比较,当WHERE子句中有索引列, ORACLE不能合并它们,ORACLE将用范围比较.“
和
“< 比 >号效率高“
详细解释一下吧
2.根据userno='13798829822' and (begintime>to_date('2004-1-30 8:20:11','yyyy-MM-dd hh24:mi:ss'))得到的数据有 b条
3.根据userno='13798829822' and (begintime>to_date('2004-1-30 8:20:11','yyyy-MM-dd hh24:mi:ss')) and (begintime<to_date('2004-9-30 8:20:11','yyyy-MM-dd hh24:mi:ss'))
得到的数据有 c条
4。自下而上就是从最后一个条件开始
5.当a*b*c的积最小的时候就是最高,效率差的比率是多少就可以算出来了
因为不知道:
索引是什么,
数据的分布怎样,
执行计划是RBO还是CBO
难道Oracle这么弱智?优化器不能将四种写法优化成一种查询?真的是这样吗?
同意
同意说法。mssql是一样的
=====-============================================
关系数据库理论创建于上世纪70年代,风靡于80年代至今。其理论已经非常完备。关于表(关系)之间的连接,从理论上当然是先做投影运算,再作乘积(连接)运算合理,但是,这个理论是那样的浅显,以至于各个大的数据库公司早已经把它们做到自身的查询优化策略中去了。除非是异地分布式数据库,在同一数据库上(位于一个物理服务器上),这几条sql语句的效率是一样的,oracle更是把查询优化做到了骨髓,这样的小儿科优化,根本就不值得一提。
四条的效率几乎是一样的.
据我之见:数据库优化方面主要应在以下几方面下功夫:
1.尽量在SQL语句中少用NOT IN等关键词;
2.尽量减少读表的次数和循环次数.
3.优化SQL语句时,可用语言(如JAVA)和数据库结合的方法,这样能更好地起到优化作用,单独片面地讲究一两个数据库语句,起到的作用将会是不很明显的.此方法特别适合于一些较为复杂的多循环多数据的查询语句.
说实话这样的比较实在意义不大。
反之执行路径是D最优.(不过最好说明哪些是索引)
如果手动优化那么根据两条原则
1.Oracle解析从后向前
2.将筛选结果集小的先执行
应该C最佳
这边假设
(begintime>to_date('2004-1-30 8:20:11','yyyy-MM-dd hh24:mi:ss'))
会比
(begintime<to_date('2004-9-30 8:20:11','yyyy-MM-dd hh24:mi:ss'))
筛选调较多记录