sql where条件后需要用日期进行索引
sqlwhere条件后面需要拼接日期条件,例如to_char(t.mydate)<'2012-08'.但是又想在t.mydate上建立索引提高查询速度。一旦用了to_ch...
sql where 条件后面需要拼接日期条件,例如to_char(t.mydate)<'2012-08'.但是又想在t.mydate上建立索引提高查询速度。一旦用了to_char索引就失效了,请问大侠们怎么处理这个问题的。
还有个问题,先谢谢哈,我在一个number列上如aa建立了索引,为什么where后面拼接上and(aa<0 or aa>0)后,在plsqldeveloper中按F5查看性能时,没有按照aa进行索引查找 展开
还有个问题,先谢谢哈,我在一个number列上如aa建立了索引,为什么where后面拼接上and(aa<0 or aa>0)后,在plsqldeveloper中按F5查看性能时,没有按照aa进行索引查找 展开
4个回答
展开全部
我可以发给你oracle语句调优和索引使用指南的文档,应该对你有帮助,你的邮箱发一下吧
另外回答你的问题
1.在索引列上使用函数是很少能使用索引的,即使使用了索引函数也很难保证走索引,这就是oracle的内部的机制,在cbo之后,oracle以cost作为最优plan的标准,这方面的内容要说的话就多了,你可以参看我给的文档,自己体会
2.在not,or类似这种非的查询是不走索引的,你可以用join来避免not的用法。
有问题继续追问
另外回答你的问题
1.在索引列上使用函数是很少能使用索引的,即使使用了索引函数也很难保证走索引,这就是oracle的内部的机制,在cbo之后,oracle以cost作为最优plan的标准,这方面的内容要说的话就多了,你可以参看我给的文档,自己体会
2.在not,or类似这种非的查询是不走索引的,你可以用join来避免not的用法。
有问题继续追问
追问
您说的2是什么意思呢?怎么能用join代替not?可否举个例子
追答
1、not举例:
SELECT * FROM emp WHERE deptno NOT IN
(SELECT deptno FROM dept WHERE loc = 'DALLAS'); SELECT e.* FROM emp e WHERE NOT EXISTS (SELECT 1FROM dept WHERE deptno = e.deptno AND loc = 'DALLAS'); -->最高效(尽管下面的查询最高效,并不推荐使用,因为列loc使用了不等运算,当表dept数据量较大,且loc列存在索引的话,则此时索引失效,具体情况具体分析) SELECT e.* FROM emp e LEFT JOIN dept d ON e.deptno = d.deptno
WHERE d.loc 'DALLAS' ;
2、or举例
select * from emp where empid=1 or empid=2;
--->高效
select * from emp where empid=1
union all
select * from emp where empid=2;
sql的优化较实际情况而定,没有绝对的公式可以套,可能相同的执行计划在不同硬件环境下的效率是不同的,这方面还是有很多东西可以学的。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
可以把 to_char(mydate) 也建立索引
追问
那to_char(mydate,'yyyy'),to_char(mydate,'yyyy-mm'),to_char(mydate,'yyyy--mm-dd')都要建立索引吗?
追答
哪个用的多就在哪个上建索引,索引并不是越多越好的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
了。批。。[批。;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
有2种方法
kao,写不上
给你发消息了。
kao,写不上
给你发消息了。
追问
还有个问题,先谢谢哈,我在一个number列上如aa建立了索引,为什么where后面拼接上and(aa0)后,在plsqldeveloper中按F5查看性能时,没有按照aa进行索引查找
追答
or 很多情况下无法使用索引
另外,使用索引也是有条件的,比如你有100万数据,而99万符合条件,
这个时候肯定不会使用索引,
而会用全表扫描
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询