sql优化

-一个大坑 2018-07-26 02:29:26
用to_date('2018/07/01',yyyy/mm/dd)查要2:40秒,sysdate-30只要24秒,怎么优化用日期查才会快?
...全文
1190 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
xieyunzheng 2018-08-01
  • 打赏
  • 举报
回复
依时间做表分区能好一些吧
-一个大坑 2018-08-01
  • 打赏
  • 举报
回复
引用 23 楼 libo13458664896 的回复:
时间字段可否考虑用时间戳存储, 然后建立索引, 查询时若是一个规整的范围可以用between, 应该可以利用到索引;

有索引,也是用的between
-一个大坑 2018-08-01
  • 打赏
  • 举报
回复
引用 20 楼 xiaoxiangqing 的回复:
看下执行计划

执行计划上面有贴图
sxq129601 2018-07-30
  • 打赏
  • 举报
回复
目测脚本只有一个日期字段没有优化,可以尝试添加hint 全表扫描+并发,最好还是搞分区
and梦天乐 2018-07-30
  • 打赏
  • 举报
回复
,,,,多条sql合并一起,会不会快一点
妖^_^十三 2018-07-30
  • 打赏
  • 举报
回复
时间字段可否考虑用时间戳存储, 然后建立索引, 查询时若是一个规整的范围可以用between, 应该可以利用到索引;
kensouho2004 2018-07-29
  • 打赏
  • 举报
回复
看下执行计划
xiaoxiangqing 2018-07-28
  • 打赏
  • 举报
回复
看下执行计划
yaiger 2018-07-26
  • 打赏
  • 举报
回复
。。。。。这个命令是清除一切缓存,会导致所有的SQL执行计划被清空。系统性能会大幅下降
-一个大坑 2018-07-26
  • 打赏
  • 举报
回复
引用 16 楼 yaiger 的回复:
alter system flush buffer_cache;

一定不要在生产环境运行这个命令!

会有啥后果?我在正式环境下执行了
yaiger 2018-07-26
  • 打赏
  • 举报
回复
14楼说的也需要留意一下,把各表重新做一次统计吧
yaiger 2018-07-26
  • 打赏
  • 举报
回复
alter system flush buffer_cache;

一定不要在生产环境运行这个命令!
-一个大坑 2018-07-26
  • 打赏
  • 举报
回复
引用 11 楼 yaiger 的回复:
你可以考虑把sec_transaction放在WITH里面,然后再跟其他表关联

怎么清掉缓存?我现在看不到正确的查询时间
minsic78 2018-07-26
  • 打赏
  • 举报
回复
查询比较复杂,包含了复杂视图,这么看至少那个笛卡尔积很可以,而且视图看来本身内部有过滤性很好(类似主键上的)的where条件?
先确定各张表,或者视图包含的表的统计信息没有问题?是不是因为不准确的统计信息导致的笛卡尔积
yaiger 2018-07-26
  • 打赏
  • 举报
回复
分区一两句话说不清楚,网上自己查一下资料吧
-一个大坑 2018-07-26
  • 打赏
  • 举报
回复
引用 9 楼 yaiger 的回复:
这种数量大的业务表,可以考虑分区

查了一下,数据量大一般怎么分区,大概多少笔做一个分区比较好?
yaiger 2018-07-26
  • 打赏
  • 举报
回复
你可以考虑把sec_transaction放在WITH里面,然后再跟其他表关联
-一个大坑 2018-07-26
  • 打赏
  • 举报
回复
引用 6 楼 yaiger 的回复:
单独用transittime 条件来查询SEC_TRANSACTION表,需要多少时间?
从计划来看,成本都用在这张表上了

单独这个表36秒
yaiger 2018-07-26
  • 打赏
  • 举报
回复
这种数量大的业务表,可以考虑分区
-一个大坑 2018-07-26
  • 打赏
  • 举报
回复
引用 5 楼 happy4944 的回复:
本来准备试一下先通过where查sec_transaction,然后再连接其他表查询。结果发现现在3秒就查出了,是因为缓存?

select a.emplid,
b.cname,
a.cardid,
b.bldeptid,
c.descr,
d.doorcode,
d.doorname,
a.transittime,
a.transitstate,
d.doortype
from sec_transaction a, v_all_user b, EMP_ORG c, SEC_BD_DOORINFO d
where a.emplid = b.emplid
and b.bldeptid = c.deptid
and a.doorno = d.doorno
and a.transittime between to_date('2018/04/01', 'yyyy/mm/dd') and
to_date('2018/07/01', 'yyyy/mm/dd');
--0:03

select a.emplid,
b.cname,
a.cardid,
b.bldeptid,
c.descr,
d.doorcode,
d.doorname,
a.transittime,
a.transitstate,
d.doortype
from (select t.emplid, t.cardid, t.transittime, t.transitstate, t.doorno
from sec_transaction t
where t.transittime between to_date('2018/04/01', 'yyyy/mm/dd') and
to_date('2018/07/01', 'yyyy/mm/dd')) a,
v_all_user b,
EMP_ORG c,
SEC_BD_DOORINFO d
where a.emplid = b.emplid
and b.bldeptid = c.deptid
and a.doorno = d.doorno
--2:20 第一次查2:20秒,第二次三次....都是3秒,上面的查也是3秒

测了一下,应该是缓存,修改工号要8秒能查出,修改时间就要2分钟了
加载更多回复(7)

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧